fundo
O formato de ponto flutuante de precisão dupla IEEE 754 é uma maneira de representar números reais com 64 bits. Parece o seguinte:
Um número real n
é convertido double
em da da seguinte maneira:
- O bit do sinal
s
é 0 se o número for positivo, 1 caso contrário. - O valor absoluto de
n
é representado na forma2**y * 1.xxx
, ou seja, uma potência de 2 vezes a base . - O expoente
e
éy
(a potência de 2) menos 1023. - A fração
f
é axxx
parte (parte fracionária da base), levando os 52 bits mais significativos.
Por outro lado, um padrão de bits (definido por sinal s
, expoente e
e fração f
, cada um inteiro) representa o número:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Desafio
Dado um número real n
, imprima sua parte da fração de 52 bits da double
representação n
como um número inteiro.
Casos de teste
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)
Você pode verificar outros números usando esta referência C, que usa campos de bits e uma união.
Observe que a resposta esperada é a mesma para +n
e -n
para qualquer número n
.
Entrada e saída
Aplicam-se regras padrão.
Formato de entrada aceito:
- Um número de ponto flutuante, pelo menos com
double
precisão internamente - Uma representação em seqüência do número em decimal (você não precisa suportar notação científica, pois pode usar
1000...00
ou0.0000...01
como entrada)
Para saída, um erro de arredondamento no bit menos significativo é tolerável.
Condição vencedora
Isso é código-golfe , então os bytes mais baixos em cada idioma vencem.
Respostas:
C (gcc) ,
4230 bytesLeva um ponteiro para o dobro como argumento e retorna um longo .
Requer longs de 64 bits e gcc (comportamento indefinido).
Obrigado a @nwellnhof por -2 bytes!
Experimente online!
fonte
&~0UL>>12
é dois bytes mais curto. A macro só funciona com lvalues.-Df(x)=*(long *)&x&~0UL>>12
, salve 3 bytes. TIOHaskell,
2731 bytesdecodeFloat
retorna o significando e o expoente, mas, por alguma razão, o primeiro está com 53 bits em Haskell, então precisamos cortar um pouco.Experimente online!
fonte
Python 3 ,
5450 bytesExperimente online!
Com a sugestão de Kirill:
Experimente online!
fonte
hex()
fornece uma notação normalizada que sempre começa com0x1.
. Nesse caso, você pode usar isso por 44 bytes.Linguagem de máquina x86_64 para Linux, 14 bytes
Experimente online!
fonte
MATL , 10 bytes
Experimente online!
Explicação
fonte
JavaScript (ES7),
5250 bytesNão usar
Math.floor(Math.log2(n))
porque não é garantido que seja preciso. Editar: salvou 2 bytes graças a @DanielIndie.fonte
Perl 5
-pl
, 28 bytesExperimente online!
Os casos de teste 1e-256 e 1e256 estão desativados, mas isso ocorre porque o Perl 5 converte inexatamente cadeias enormes ou minúsculas de ponto flutuante.
fonte
Macro C (gcc) , 49 bytes
Experimente online!
Retorna uma,
double
mas assumindo precisão IEEE, ela não terá uma parte fracionária. Também lida com números negativos agora.fonte
T-SQL , 80 bytes
A entrada é obtida da coluna
n
de uma tabela denominadat
:SQLFiddle
fonte
Hoon , 25 bytes
Crie uma função genérica que retorne o mod de entrada
2^52
.Chamando:
fonte
JavaScript (ES7),
9876 bytesEconomizou 22 (!) Bytes graças a @Neil
Mais detalhado que a resposta de Neil , mas eu queria tentar com matrizes digitadas .
Experimente online!
fonte
UInt32Array
salva 22 bytes:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
já tenha implementado ?APL (Dyalog) , 38 bytes
Experimente online!
fonte
Stax ,
1914 bytesExecute e depure
Descompactado, não jogado e comentado, o código fica assim.
Execute este
fonte
Ruby , 39 bytes
Experimente online!
fonte
Ferrugem , 21 bytes
Solução C praticamente copiada. Leva uma
f64
discussão.Experimente online!
fonte
Java 8 ou posterior , 38 bytes
Experimente online!
fonte
Linguagem de máquina Aarch64 para Linux, 12 bytes
Para tentar isso, compile e execute o seguinte programa C em qualquer máquina Aarch64 Linux ou dispositivo (Aarch64) Android executando o Termux
fonte
Julia 0.4 , 30 bytes
Experimente online!
fonte
Quarto (gforth) , 42 bytes
Supõe que os flutuadores tenham o dobro por padrão e as células tenham 8 bytes de comprimento (como é o caso no meu computador e no TIO)
Experimente online!
Explicação
Quarta (gforth) resposta de célula de 4 bytes, 40 bytes
Algumas instalações mais antigas são padronizadas para células de 4 bytes,
Explicação
fonte