2009-02-03 17 views
7

¿Hay alguna forma de representar un número con una precisión superior a 53 bits en JavaScript? En otras palabras, ¿hay alguna forma de representar el número de precisión de 64 bits?JavaScript 64 bits de precisión numérica

Estoy tratando de implementar una lógica en la que cada bit de un número de 64 bits representa algo. Perdí los bits significativos más bajos cuando intento establecer bits superiores a 2^53.

Math.pow(2,53) + Math.pow(2,0) == Math.pow(2,53) 

¿Hay alguna forma de implementar una biblioteca personalizada o algo así para lograrlo?

+0

¿Alguna razón especial por la que no puedes dividirla en dos variables o usar una cadena o una matriz en su lugar? – some

+0

Dividirlo en 2 variables es la solución que veo ahora. cadena y matriz parece ser ineficaz, porque estaría utilizando solo unos pocos de los 64 bits. Gracias. –

Respuesta

0

El equipo de GWT ha agregado un soporte de emulación largo para que java longs realmente contenga 64 bits. ¿Deseas flotadores de 64 bits o números enteros?

+0

números enteros. Veré la implementación de GWT. Gracias. –

0

Solo usaría una matriz de enteros o una cadena.

Los números en javascript son dobles, creo que hay un error de redondeo en su ecuación.

+0

Creo que las matrices y las cadenas serían una estructura de datos ineficaz aquí. Porque usaría solo algunos de los 64 bits. Actualmente estoy pensando en usar 2 tipos numéricos para 32 más altos y 32 bits más bajos. Gracias –

+0

El problema es que no puede confiar en un doble para ser coherente si intenta hacer la manipulación de bits. Javascript no está hecho para manipular datos en la capa de bits. –

+0

Totalmente entérate de tu punto. Soy un experto en javascript o numérico de punto flotante, ¿hay un tipo de datos en js que use aritmética de punto fijo? –

0

Quizás debería haber agregado algunos detalles técnicos. Básicamente, la emulación larga de GWT usa una tupla de dos números, el primero contiene los 32 bits altos y el segundo los 32 bits bajos de 64 bits de largo.

La biblioteca, por supuesto, contiene métodos para agregar cosas, como agregar dos "largos" y obtener un resultado "largo". Dentro de su código GWT Java, parece dos largos regulares, uno no necesita violín o estar al tanto de la tupla. Al usar este enfoque, GWT evita el problema al que probablemente alude, a saber, los "largos" que eliminan los bits más bajos de precisión, lo cual no es aceptable en muchos casos.

Mientras que las carrozas son por definición imprecisas/aproximaciones de un valor, un número entero como un largo no lo es. GWT siempre tiene una longitud de 64 bits: las matemáticas que usan tales largos nunca usan precisión. La excepción a esto son los desbordamientos, pero eso coincide exactamente con lo que ocurre en Java, etc. cuando se agregan dos valores largos muy grandes que requieren más de 64 bits, por ejemplo, 2^32-1 + 2^32-1.

Hacer lo mismo para los números de punto flotante requerirá un enfoque similar. Necesitará tener una biblioteca que use una tupla.

-7

¿Por qué alguien necesitaría una precisión de 64 bits en javascript?

Longs a veces contienen ID de cosas en un DB así que es importante no perder algunos de los bits más bajos ... pero los números de punto flotante son la mayoría del tiempo utilizados para los cálculos. Usar los flotantes para mantener valores monetarios o valores similares similares es completamente erróneo. Si realmente necesita una precisión de 64 bits, haga las matemáticas en el servidor donde es más rápido, y así sucesivamente.

+0

Responder a una pregunta con una pregunta nunca es útil. Además, JavaScript del lado del servidor se está volviendo más y más común. – scotts

+0

Porque tal vez solo el que pregunta está haciendo lo incorrecto, porque no saben lo que están haciendo ... –

-1

Sí, 11 bit están reservados para el exponente, solo 52 bits de valor containt también llamado fracción. Javascript permite operaciones bit a bit en los números, pero solo se utilizan los primeros 32 bits en esas operaciones de acuerdo con la especificación estándar de Javascript.

No entiendo las respuestas erróneas GWT/Java/long en Javascript/pregunta doble aunque? Javascript no es Java

1

La biblioteca de cierres de Google tiene goog.math.Long para este propósito.

+0

El tipo que escribió el código JavaScript de ProtoBuf también lo aisló Long from the Closure library para que pueda usarlo de manera independiente: https://github.com/dcodeIO/Long.js – SomeCallMeTim

Cuestiones relacionadas