bool operator<=(const decimal &a, const decimal &b) { // 1. Comparamos signos. Si son distintos, el negativo es el menor. // 2. Cambiamos el tamaño de b para que coincida con el de a. // 3. Comparamos cifra a cifra, y devolvemos en consecuencia. if(a.is_negative() != b.is_negative()) return a.is_negative(); decimal t(b); t.resize(a.cifs, a.decs); bool a_menor = false, iguales = true; for(int i = a.cifs - 1; i >= 0; --i) { if(a.get_cifra(i) != t.get_cifra(i)) { iguales = false; if(a.get_cifra(i) < t.get_cifra(i)) { a_menor = true; } break; } } if(iguales) return true; // Invertimos el resultado si a y b son negativos. return a.is_negative() ? !a_menor : a_menor; }
void decimal::resta(const decimal &res) { // Por cada cifra del decimal, empezando por el final: // 1. Comprobamos si operador 1 es mayor o igual operador 2. // 2. Si lo es, restamos. Si no, añadimos 10, indicando acarreo para el siguiente, y restamos. bool acarreo = false; for(unsigned int i = 0; i < cifs; ++i) { uint8_t op1 = this->get_cifra(i); uint8_t op2 = res.get_cifra(i); if(acarreo) ++op2; if(op1 < op2) { op1 += 10; acarreo = true; } else { acarreo = false; } int op3 = op1 - op2; this->set_cifra(op3, i); } }
void decimal::suma(const decimal &sum) { // Por cada cifra del decimal, empezando por el final: // 1. Sumamos ambos numeros. // 2. Si la suma pasa de 10 acarreamos para la siguiente cifra, y restamos // 10 a la cifra actual. bool acarreo = false; for(unsigned int i = 0; i < cifs; ++i) { uint8_t op1 = this->get_cifra(i); uint8_t op2 = sum.get_cifra(i); uint8_t op3 = op1 + op2; if(acarreo) ++op3; if(op3 >= 10) { acarreo = true; op3 -= 10; } else { acarreo = false; } // Control para el overflow. if(acarreo && (i == cifs - 1)) this->set_cifra(10, i); else this->set_cifra(op3, i); } }