2009-11-24 7 views

Respuesta

14

No hay

Al menos algunos bits de un 64-bit doble debe ser utilizado para representar el exponente (posición del punto binario), y por lo tanto hay menos de 64-bits disponible para el número real . Entonces, no, un doble de 64 bits no puede representar todos los valores que un entero de 64 bits puede (y viceversa).

+1

Bueno, eso es cierto siempre que no tenga ninguna función de mapeo entre el número de coma flotante y el entero de 64b. Puede "representar" el número como un número de coma flotante diferente. Simplemente no es práctico :) – viraptor

+2

Incluso la solución poco práctica podría no funcionar, por ejemplo, un valor NaN (SNaN) de señalización podría desencadenar una excepción si se maneja dentro de Lua (no sé si eso es cierto, pero podría). – stusmith

+1

Algunos valores de dobles están desnormalizados: si su lenguaje podría renormalizarlos sin previo aviso, no puede insertar con seguridad 64 bits de información en ellos. – bdonlan

4

El doble es un tipo de 64 bits en sí. Sin embargo, pierde 1 bit por el signo y 11 por el exponente.

Así que la respuesta es no: no se puede hacer.

+3

ganas un bit porque el más alto siempre es distinto de cero, es decir, la precisión es 'total_bits - bit_señal - exp_bits + implicit_bit = 64 - 1 - 11 + 1 = 53' – Christoph

+0

No entiendo tu explicación. Entiendo que uno podría "usar mal" el bit de signo para un rango numérico incrementado. (Así que básicamente usando los números negativos para aumentar el rango positivo) – Toad

+1

@reiner. Por ejemplo, el decimal binario 0.01 ... (51 más 1s) ... 1 es exactamente representable en un doble IEEE, a pesar de que tiene 53 cifras significativas. Está representado por un exponente de -2 (tomando 11 bits), un signo de 0 (tomando 1 bit), y una mantisa de 1 ... (50 1s) ... 1 (tomando 52 bits). El primer 1 no se almacena en ninguna parte, se supone. Siempre elegirías un exponente tal que el "primer" bit de la mantisa sea 1, por lo que el primer bit quedará fuera. La excepción son las densidades, que se manejan de forma ligeramente diferente (o no se manejan del todo). –

-1

No sé nada de lua
pero si usted podría encontrar la manera de realizar la manipulación bit a bit del flotador en este idioma, que en teoría podría hacer una clase de contenedor que se llevó a su número en forma de una cadena y establecer el bits del flotador en el orden que representa el número que le dieron
una solución más práctica sería utilizar alguna biblioteca bignum

3

de memoria, un double puede representar un entero con signo de 53 bits exactamente.

1

En 64 bits, solo puede almacenar 2^64 códigos diferentes. Esto significa que un tipo de 64 bits que puede representar 2^64 enteros no tiene ningún lugar para representar otra cosa, como los números de coma flotante.

Obviamente, el doble puede representar una gran cantidad de números no enteros, por lo que no se ajusta a sus necesidades.

5

Aunque haya obtenido algunas buenas respuestas a su pregunta sobre los tipos de 64 bits, es posible que desee una solución práctica para su problema específico. La solución más confiable que conozco es construir Lua 5.1 con el parche LNUM (también conocido como el parche entero Lua) que se puede descargar desde LuaForge. Si no planea construir Lua desde la fuente C, hay al menos una biblioteca Lua pura que maneja enteros con signo de 64 bits: consulte la wiki de Lua-users.

+0

Gracias por las referencias, +1. –

2

No, no puede usar Double para almacenar enteros de 64 bits sin perder precisión.

Sin embargo, puede aplicar un parche Lua que admita el verdadero intérprete de 64 bits para el intérprete de Lua. Aplique el parche LNUM a su fuente de Lua y vuelva a compilar.

0

IEEE 754 double no puede representar números enteros de 64 bits exactamente. Sin embargo, puede representar exactamente cada valor entero de 32 bits.

Cuestiones relacionadas