Anda di halaman 1dari 7

Si cualquier operando es cero, el resultado es ceros void mpy (UNumber *multiplicand, const UNumber *multiplier)

{
if(multiplicand->unum[0]==0 || multiplier->unum[0]==0) { debug_print("multiplicacin: multiplicador o multiplicando en cero \n"); memset(multiplicand->unum,0,multiplicand->size); multiplicand->decimal_power=0; multiplicand->sign=true; return; }

Ninguno de los dos es cero El producto nunca ser mayor en dgitos que este, incluyendo el acarreo int product_size=multiplicand->size+(multiplier->size>2 ? multiplier->size : 2); char *product=(char *)allocate_memory(product_size,sizeof(char),true); debug_print("multiplicacin: Multiplicando y multiplicador no ceros\n"); // Para cada dgito del multiplicador int r; // Indice del ltimo dgito en el multiplicador que no ha sido procesado int d; // Indice del ltimo dgito en el multiplicando que no ha sido procesado

for(r=multiplier->size-1;r>=0;r--) { // Comienza con el dgito correcto en el producto basado en la localizacin en el multiplicando y el multiplicador

int p=multiplicand->size+r;
//Calcula el producto para cada dgito en el multiplicando y lo suma en el producto for(d=multiplicand->size-1;d>=0;d--) { product[p]+=multiplicand->unum[d]*multiplier->unum[r]; // Resuelve cualquier acarreo asegurandose cada dgito del producto que no sea mayor que 9 ( ya que ninguno de los dgitos fue mas grande que 9, podemos pararlo tan pronto como encontremos uno que no sea mas grande que 9 y resolvemos los acarreos trabajando desde la izquierda) int c=p;

while(product[c]>9) {
izquierda product[c-1]+=product[c]/10; // Agrega al acarreo el dgito de la product[c--]%=10; } // Usa el siguiente dgito del producto a la izquierda

p--; }
}

Ahora tenemos el producto, pero puede no estar normalizado. El primer dgito del producto puede no ser cero ya que el producto no es cero. Si en este punto el dgito inicial es cero, entonces debemos descartar un cero y ajustar el tamao y bajar en uno el exponente. bool was_normalized=false; if(product[0]==0) {

debug_print("Multiplicacin: Producto normalizado\n");


//El producto debe estar normalizado y transferido al objeto int i; for(i=0;i<product_size-1;i++) product[i]=product[i+1]; // Seal de que el valor fue normalizado was_normalized=true; }

Ya que el producto es mas grande que el arreglo para el resultado, necesitamos descartar el exceso de dgitos y esto nos lleva a querer redondear el resultado si el dgito de la derecha del LSD es o mas grande. bool rounding_carry=false; if(product[multiplicand->size]>=5) { debug_print("Multiplicacin: Redondeando producto\n"); // ya que el LSD fue un 5 o mas, debemos redondear y propagar el acarreo a la izquierda int i=multiplicand->size-1; product[i]++; while(i>0 && product[i]>9) { product[i-1]++; product[i--]-=9; }

// si el acarreo se propaga hasta el final del LSD al MSD, todos estos dgitos intermedios deben ser 9'santes de redondear y ahora sern ceros. if (i==0 && product[0]>9)

{
// Activando la bandera sabremos que estamos haciendo entonces podremos sumar uno a la caracterstica rounding_carry=true; // Establece el MSD a 1 y el LSD a 0, el resto de los dgitos debe estar en ceros product[0]=1; product[multiplicand->size-1]=0; } }

Anda mungkin juga menyukai