2012-07-28 24 views
9

¿Cómo puedo emular enteros no cifrados de 32 bits sin ninguna dependencia externa en Javascript? Los trucos con x >>> 0 o x | 0 no funcionan (para la multiplicación, parecen funcionar para sumar/restar), y los dobles pierden precisión durante la multiplicación.enteros de 32 bits sin signo en Javascript

Por ejemplo, intente multiplicar 2654435769 * 340573321 (mod 2^32). El resultado debe ser 1.

This answer tiene multiplicación. ¿Qué hay de la suma/resta/división?

Here's a link a wolfram alpha, presentando la ecuación anterior.

+0

Pero el resultado de '2654435769 * 340573321' no cabe en 32 bits ... –

+0

@ Šime Vidas: Pero mod 2^32 lo hace; eso es lo que persigue con los cálculos si lo estoy entendiendo correctamente. – pimvdb

+0

@pimvdb: sí, así es como funcionan los enteros sin signo de 32 bits: todas las operaciones se llevan a cabo en el módulo 2^32. – user1367401

Respuesta

3

Un int sin signo de 32 bits se ajusta dentro de Javascript 64-bit float - no debe haber pérdida de precisión al realizar operaciones de suma, resta o división. Solo máscara con 0xffffffff para permanecer dentro de un entero de 32 bits. La multiplicación va más allá de lo que cabe, pero ya tienes una solución para eso.

+0

Sin embargo, la precisión puede no ser lo suficientemente alto después de la multiplicación, ya que los enteros de 32 bits multiplicados pueden obtener un entero de 64 bits, mientras que el número flotante de 64 bits solo puede representar 53 bits significativos. ¿Hay una mejor manera? –

Cuestiones relacionadas