Contexte
IEEE 754 Le format à virgule flottante double précision est un moyen de représenter des nombres réels avec 64 bits. Il ressemble à ceci:
Un nombre réel n
est converti en a double
de la manière suivante:
- Le bit de signe
s
est 0 si le nombre est positif, 1 sinon. - La valeur absolue de
n
est représentée sous la forme2**y * 1.xxx
, c'est -à- dire une puissance de 2 fois une base . - L'exposant
e
esty
(la puissance de 2) moins 1023. - La fraction
f
est laxxx
partie (partie fractionnaire de la base), prenant les 52 bits les plus significatifs.
Inversement, un motif binaire (défini par signe s
, exposant e
et fraction f
, chacun un entier) représente le nombre:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Défi
Étant donné un nombre réel n
, affichez sa partie de fraction de 52 bits de la double
représentation n
sous forme d'entier.
Cas de test
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)
Vous pouvez vérifier d'autres nombres en utilisant cette référence C qui utilise des champs de bits et une union.
Notez que la réponse attendue est la même pour +n
et -n
pour n'importe quel nombre n
.
Entrée et sortie
Des règles standard s'appliquent.
Format d'entrée accepté:
- Un nombre à virgule flottante, ayant au moins une
double
précision interne - Une représentation sous forme de chaîne du nombre en décimal (vous n'avez pas besoin de prendre en charge la notation scientifique, car vous pouvez utiliser
1000...00
ou0.0000...01
en entrée)
Pour la sortie, une erreur d'arrondi au bit le moins significatif est tolérable.
Condition gagnante
Il s'agit de code-golf , donc les octets les plus bas dans chaque langue gagnent.
Réponses:
C (gcc) ,
4230 octetsPrend un pointeur sur un double comme argument et renvoie un long .
Requiert 64 bits longs et gcc (comportement non défini).
Merci à @nwellnhof pour -2 octets!
Essayez-le en ligne!
la source
&~0UL>>12
est de deux octets plus court. Cependant, la macro ne fonctionne qu'avec lvalues.-Df(x)=*(long *)&x&~0UL>>12
, économisez 3 octets. TIOHaskell,
2731 octetsdecodeFloat
renvoie la signification et l'exposant, mais pour une raison quelconque, le premier est de 53 bits dans Haskell, nous devons donc couper un bit.Essayez-le en ligne!
la source
Python 3 ,
5450 octetsEssayez-le en ligne!
Avec la suggestion de Kirill:
Essayez-le en ligne!
la source
hex()
donne une notation normalisée qui commence toujours par0x1.
. Si oui, vous pouvez simplement utiliser ce pour 44 octets.Langage machine x86_64 pour Linux, 14 octets
Essayez-le en ligne!
la source
MATL , 10 octets
Essayez-le en ligne!
Explication
la source
JavaScript (ES7),
5250 octetsNe pas utiliser
Math.floor(Math.log2(n))
car il n'est pas garanti d'être précis. Edit: sauvé 2 octets grâce à @DanielIndie.la source
Perl 5
-pl
, 28 octetsEssayez-le en ligne!
Les cas de test 1e-256 et 1e256 sont désactivés, mais c'est parce que Perl 5 convertit inexactement des chaînes de virgule flottante énormes ou minuscules.
la source
Macro C (gcc) , 49 octets
Essayez-le en ligne!
Renvoie un
double
mais en supposant une précision IEEE, il n'aura pas de partie fractionnaire. Gère également les nombres négatifs maintenant.la source
T-SQL , 80 octets
L'entrée provient de la colonne
n
d'une table nomméet
:SQLFiddle
la source
Hoon , 25 octets
Créez une fonction générique qui renvoie le mod d'entrée
2^52
.L'appeler:
la source
JavaScript (ES7),
9876 octets22 (!) Octets enregistrés grâce à @Neil
Plus verbeux que la réponse de Neil , mais je voulais l'essayer avec des tableaux typés .
Essayez-le en ligne!
la source
UInt32Array
enregistre 22 octets:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
déjà mis en place ?APL (Dyalog) , 38 octets
Essayez-le en ligne!
la source
Stax ,
1914 octetsExécuter et déboguer
Décompressé, non golfé et commenté, le code ressemble à ceci.
Exécutez celui-ci
la source
Rubis , 39 octets
Essayez-le en ligne!
la source
Rouille , 21 octets
Solution C pratiquement copiée. Prend un
f64
argument.Essayez-le en ligne!
la source
Java 8 ou version ultérieure , 38 octets
Essayez-le en ligne!
la source
Langage machine Aarch64 pour Linux, 12 octets
Pour l'essayer, compilez et exécutez le programme C suivant sur n'importe quelle machine Linux Aarch64 ou appareil Android (Aarch64) exécutant Termux
la source
Julia 0,4 , 30 octets
Essayez-le en ligne!
la source
Forth (gforth) , 42 octets
Suppose que les flotteurs sont doubles par défaut et que les cellules ont une longueur de 8 octets (comme c'est le cas sur mon ordinateur et TIO)
Essayez-le en ligne!
Explication
Forth (gforth) réponse de cellule de 4 octets, 40 octets
Certaines anciennes installations en avant par défaut à des cellules de 4 octets, à la place
Explication
la source