Antecedentes
IEEE 754 El formato de coma flotante de doble precisión es una forma de representar números reales con 64 bits. Se parece a lo siguiente:
Un número real n
se convierte double
en a de la siguiente manera:
- El bit de signo
s
es 0 si el número es positivo, 1 de lo contrario. - El valor absoluto de
n
se representa en la forma2**y * 1.xxx
, es decir, una potencia de 2 veces una base . - El exponente
e
esy
(la potencia de 2) menos 1023. - La fracción
f
es laxxx
parte (parte fraccional de la base), que toma los 52 bits más significativos.
Por el contrario, un patrón de bits (definido por signo s
, exponente e
y fracción f
, cada uno un número entero) representa el número:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Desafío
Dado un número real n
, genera su fracción de 52 bits como parte de la double
representación de n
un entero.
Casos de prueba
0.0 => 0
1.2 => 900719925474099 (hex 3333333333333)
3.1 => 2476979795053773 (hex 8cccccccccccd)
3.5 => 3377699720527872 (hex c000000000000)
10.0 => 1125899906842624 (hex 4000000000000)
1234567.0 => 798825262350336 (hex 2d68700000000)
1e-256 => 2258570371166019 (hex 8062864ac6f43)
1e+256 => 1495187628212028 (hex 54fdd7f73bf3c)
-0.0 => 0
-1.2 => 900719925474099 (hex 3333333333333)
-3.1 => 2476979795053773 (hex 8cccccccccccd)
-3.5 => 3377699720527872 (hex c000000000000)
-10.0 => 1125899906842624 (hex 4000000000000)
-1234567.0 => 798825262350336 (hex 2d68700000000)
-1e-256 => 2258570371166019 (hex 8062864ac6f43)
-1e+256 => 1495187628212028 (hex 54fdd7f73bf3c)
Puede verificar otros números usando esta referencia C que usa campos de bits y una unión.
Tenga en cuenta que la respuesta esperada es la misma para +n
y -n
para cualquier número n
.
Entrada y salida
Aplican reglas estándar.
Formato de entrada aceptado:
- Un número de coma flotante, al menos con
double
precisión interna - Una representación de cadena del número en decimal (no necesita admitir notación científica, ya que puede usar
1000...00
o0.0000...01
como entrada)
Para la salida, es tolerable un error de redondeo en el bit menos significativo.
Condición ganadora
Este es el código de golf , por lo que gana los bytes más bajos en cada idioma.
Respuestas:
C (gcc) ,
4230 bytesToma un puntero a un doble como argumento y devuelve un largo .
Requiere largos de 64 bits y gcc (comportamiento indefinido).
¡Gracias a @nwellnhof por -2 bytes!
Pruébalo en línea!
fuente
&~0UL>>12
es dos bytes más corto. Sin embargo, la macro solo funciona con valores.-Df(x)=*(long *)&x&~0UL>>12
, ahorre 3 bytes. TIOHaskell,
2731 bytesdecodeFloat
devuelve el significado y el exponente, pero por alguna razón el primero es de 53 bits en Haskell, por lo que tenemos que cortar un bit.Pruébalo en línea!
fuente
Python 3 ,
5450 bytesPruébalo en línea!
Con la sugerencia de Kirill:
Pruébalo en línea!
fuente
hex()
da una notación normalizada que siempre comienza con0x1.
. Si es así, podría usar esto para 44 bytes.lenguaje de máquina x86_64 para Linux, 14 bytes
Pruébalo en línea!
fuente
MATL , 10 bytes
Pruébalo en línea!
Explicación
fuente
JavaScript (ES7),
5250 bytesNo se usa
Math.floor(Math.log2(n))
porque no se garantiza que sea precisa. Editar: Guardado 2 bytes gracias a @DanielIndie.fuente
Perl 5
-pl
, 28 bytesPruébalo en línea!
Los casos de prueba 1e-256 y 1e256 están desactivados, pero eso se debe a que Perl 5 convierte las cadenas de coma flotante grandes o pequeñas de manera inexacta.
fuente
Macro C (gcc) , 49 bytes
Pruébalo en línea!
Devuelve un
double
pero suponiendo precisión IEEE, no tendrá una parte fraccional. También maneja números negativos ahora.fuente
T-SQL , 80 bytes
La entrada se toma de la columna
n
de una tabla llamadat
:SQLFiddle
fuente
Hoon , 25 bytes
Cree una función genérica que devuelva el mod de entrada
2^52
.Llamándolo:
fuente
JavaScript (ES7),
9876 bytesAhorró 22 (!) Bytes gracias a @Neil
Más detallado que la respuesta de Neil , pero quería probarlo con matrices escritas .
Pruébalo en línea!
fuente
UInt32Array
ahorra 22 bytes:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
?APL (Dyalog) , 38 bytes
Pruébalo en línea!
fuente
Stax ,
1914 bytesEjecutar y depurarlo
Desempaquetado, sin golf y comentado, el código se ve así.
Ejecute este
fuente
Ruby , 39 bytes
Pruébalo en línea!
fuente
Óxido , 21 bytes
Solución de C prácticamente copiada. Toma una
f64
discusión.Pruébalo en línea!
fuente
Java 8 o posterior , 38 bytes
Pruébalo en línea!
fuente
Lenguaje de máquina Aarch64 para Linux, 12 bytes
Para probar esto, compile y ejecute el siguiente programa C en cualquier máquina Linux Aarch64 o dispositivo Android (Aarch64) que ejecute Termux
fuente
Julia 0.4 , 30 bytes
Pruébalo en línea!
fuente
Adelante (gforth) , 42 bytes
Asume que los flotantes son dobles por defecto y las celdas tienen 8 bytes de longitud (como es el caso en mi computadora y TIO)
Pruébalo en línea!
Explicación
Forth (gforth) respuesta de celda de 4 bytes, 40 bytes
Algunas instalaciones más antiguas por defecto tienen celdas de 4 bytes, en su lugar
Explicación
fuente