Si bien a signed long long int
no se mantendrá A*B
, dos de ellos lo harán. Por A*B
lo tanto, podría descomponerse en términos de árbol de exponente diferente, cualquiera de ellos adecuado signed long long int
.
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
Lo mismo para C*D
.
Siguiendo el camino recto, la subtracción se podría hacer a cada par de, AB_i
y de la CD_i
misma manera, usando un bit de acarreo adicional (con precisión un entero de 1 bit) para cada uno. Entonces, si decimos E = A * BC * D, obtienes algo como:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
Continuamos transfiriendo la mitad superior de E_10
a E_20
(cambia por 32 y suma, luego borra la mitad superior de E_10
).
Ahora puede deshacerse del bit de acarreo E_11
agregándolo con el signo correcto (obtenido de la parte no transportadora) a E_20
. Si esto desencadena un desbordamiento, el resultado tampoco encajaría.
E_10
ahora tiene suficiente 'espacio' para tomar la mitad superior de E_00
(shift, add, borre) y el bit de acarreo E_01
.
E_10
puede ser más grande ahora nuevamente, así que repetimos la transferencia a E_20
.
En este punto, E_20
debe convertirse en cero, de lo contrario el resultado no encajará. La mitad superior de E_10
está vacía como resultado de la transferencia también.
El paso final es la transferencia de la mitad inferior de E_20
en E_10
otra vez.
Si la expectativa E=A*B+C*D
se ajustara a las signed long long int
bodegas, ahora tenemos
E_20=0
E_10=0
E_00=E