Hintergrund
IEEE 754 Gleitkommaformat mit doppelter Genauigkeit ist eine Möglichkeit, reelle Zahlen mit 64 Bit darzustellen. Es sieht so aus:
Eine reelle Zahl n
wird double
folgendermaßen in eine umgewandelt :
- Das Vorzeichenbit
s
ist 0, wenn die Zahl positiv ist, andernfalls 1. - Der Absolutwert von
n
wird in der Form dargestellt2**y * 1.xxx
, dh eine Potenz von 2 mal einer Basis . - Der Exponent
e
isty
(die Potenz von 2) minus 1023. - Der Bruch
f
ist derxxx
Teil (Bruchteil der Basis), der die höchstwertigen 52 Bits belegt.
Umgekehrt repräsentiert ein Bitmuster (definiert durch Vorzeichen s
, Exponent e
und Bruch f
, jeweils eine ganze Zahl) die Zahl:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Herausforderung
Bei einer reellen Zahl n
wird der 52-Bit-Bruchteil der double
Darstellung n
als Ganzzahl ausgegeben .
Testfälle
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)
Mit dieser C-Referenz, die Bitfelder und eine Vereinigung verwendet, können Sie andere Zahlen überprüfen .
Beachten Sie, dass die erwartete Antwort für +n
und -n
für jede Zahl gleich ist n
.
Ein- und Ausgang
Es gelten Standardregeln.
Akzeptiertes Eingabeformat:
- Eine Gleitkommazahl, die zumindest
double
intern eine Genauigkeit aufweist - Eine Zeichenfolgendarstellung der Zahl in Dezimalzahl (Sie müssen keine wissenschaftliche Notation unterstützen, da Sie
1000...00
oder0.0000...01
als Eingabe verwenden können.)
Für die Ausgabe ist ein Rundungsfehler am niedrigstwertigen Bit tolerierbar.
Gewinnbedingung
Das ist Code-Golf , also gewinnt das niedrigste Byte in jeder Sprache.
Antworten:
C (gcc) ,
42-30BytesNimmt einen Zeiger auf ein double als Argument und gibt einen long zurück .
Erfordert 64-Bit-Longs und GCC (undefiniertes Verhalten).
Danke an @nwellnhof für -2 Bytes!
Probieren Sie es online!
quelle
&~0UL>>12
ist zwei Bytes kürzer. Das Makro funktioniert jedoch nur mit lvalues.-Df(x)=*(long *)&x&~0UL>>12
, speichern Sie 3 Bytes. TIOHaskell,
2731 BytesdecodeFloat
gibt den Signifikanden und den Exponenten zurück, aber aus irgendeinem Grund ist der erstere 53 Bit in Haskell, also müssen wir ein Bit abschneiden.Probieren Sie es online!
quelle
Python 3 ,
5450 BytesProbieren Sie es online!
Mit Kirills Vorschlag:
Probieren Sie es online!
quelle
hex()
gibt normalisierte Notation, die immer mit beginnt0x1.
. Wenn ja, könnten Sie einfach nutzen diese für 44 Bytes.x86_64-Maschinensprache für Linux, 14 Byte
Probieren Sie es online!
quelle
MATL , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (ES7),
52 bis50 ByteNicht verwenden,
Math.floor(Math.log2(n))
da die Genauigkeit nicht garantiert wird. Bearbeiten: 2 Bytes dank @DanielIndie gespeichert.quelle
Perl 5
-pl
, 28 BytesProbieren Sie es online!
Die Testfälle 1e-256 und 1e256 sind deaktiviert, aber das liegt daran, dass Perl 5 große oder kleine Gleitkommazeichenfolgen ungenau konvertiert.
quelle
C (gcc) Makro, 49 Bytes
Probieren Sie es online!
Gibt a zurück
double
jedoch eine IEEE-Genauigkeit voraus, und es wird kein Bruchteil angegeben. Behandelt jetzt auch negative Zahlen.quelle
T-SQL , 80 Bytes
Die Eingabe wird aus der Spalte
n
einer Tabelle mit dem Namen übernomment
:SQLFiddle
quelle
Hoon , 25 Bytes
Erstellen Sie eine generische Funktion, die den Eingabe-Mod zurückgibt
2^52
.Nennen Sie es:
quelle
JavaScript (ES7),
98 bis76 Byte22 (!) Bytes dank @Neil gespeichert
Ausführlicher als Neils Antwort , aber ich wollte es mit typisierten Arrays versuchen .
Probieren Sie es online!
quelle
UInt32Array
speichert 22 Bytes:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
?APL (Dyalog) , 38 Bytes
Probieren Sie es online!
quelle
Stax ,
1914 BytesFühren Sie es aus, und debuggen Sie es
Entpackt, ungolfed und kommentiert sieht der Code so aus.
Führen Sie dieses aus
quelle
Ruby , 39 Bytes
Probieren Sie es online!
quelle
Rust , 21 Bytes
Ziemlich genau kopierte C-Lösung. Nimmt einen
f64
Streit auf.Probieren Sie es online!
quelle
Java 8 oder höher , 38 Byte
Probieren Sie es online!
quelle
Maschinensprache Aarch64 für Linux, 12 Byte
Kompilieren Sie dazu das folgende C-Programm und führen Sie es auf einem beliebigen Aarch64 Linux-Computer oder (Aarch64) Android-Gerät mit Termux aus
quelle
Julia 0,4 , 30 Bytes
Probieren Sie es online!
quelle
Forth (gforth) , 42 Bytes
Angenommen, Floats sind standardmäßig doppelt und Zellen haben eine Länge von 8 Byte (wie auf meinem Computer und TIO).
Probieren Sie es online!
Erläuterung
Viertens (viertens) 4-Byte- Zellenantwort , 40 Bytes
Einige ältere vierte Installationen verwenden stattdessen standardmäßig 4-Byte-Zellen
Erläuterung
quelle