tło
Format zmiennoprzecinkowy podwójnej precyzji IEEE 754 to sposób reprezentowania liczb rzeczywistych za pomocą 64 bitów. Wygląda to następująco:
Liczba rzeczywista n
jest konwertowana double
na następujący w następujący sposób:
- Bit znaku
s
ma wartość 0, jeśli liczba jest dodatnia, w przeciwnym razie 1. - Wartość bezwzględna
n
jest reprezentowana w postaci2**y * 1.xxx
, tj. Potęga 2 razy podstawa . - Wykładnik
e
wynosiy
(potęga 2) minus 1023. - Ułamek
f
toxxx
część (ułamkowa część podstawy), zajmująca najbardziej znaczące 52 bity.
I odwrotnie, wzór bitowy (zdefiniowany przez znak s
, wykładnik e
i ułamek f
, każda liczba całkowita) reprezentuje liczbę:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Wyzwanie
Biorąc pod uwagę liczbę rzeczywistą n
, wyślij jej 52-bitową część ułamkową double
reprezentacji n
jako liczba całkowita.
Przypadki testowe
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)
Możesz sprawdzić inne liczby za pomocą tego odwołania C, które wykorzystuje pola bitowe i połączenie.
Pamiętaj, że oczekiwana odpowiedź jest taka sama dla dowolnej liczby +n
i -n
dla niej n
.
Wejście i wyjście
Obowiązują standardowe zasady.
Akceptowany format wejściowy:
- Liczba zmiennoprzecinkowa, przynajmniej o
double
precyzji wewnętrznej - Ciąg znaków reprezentujący liczbę dziesiętną (nie trzeba obsługiwać notacji naukowej, ponieważ można użyć
1000...00
lub0.0000...01
jako danych wejściowych)
W przypadku danych wyjściowych dopuszczalny jest błąd zaokrąglania co najmniej znaczącego bitu.
Warunki wygranej
To jest golf golfowy , więc wygrywa najmniej bajtów w każdym języku.
Odpowiedzi:
C (gcc) ,
4230 bajtówPodnosi wskaźnik jako podwójny jako argument i zwraca długi .
Wymaga 64-bitowych długości i gcc (niezdefiniowane zachowanie).
Dzięki @nwellnhof za -2 bajty!
Wypróbuj online!
źródło
&~0UL>>12
jest dwa bajty krótszy. Makro działa jednak tylko z wartościami lvalues.-Df(x)=*(long *)&x&~0UL>>12
, zapisz 3 bajty. TIOHaskell,
2731 bajtówdecodeFloat
zwraca znaczenie i wykładnik, ale z jakiegoś powodu ten pierwszy ma 53 bity w Haskell, więc musimy odciąć jeden bit.Wypróbuj online!
źródło
Python 3 ,
5450 bajtówWypróbuj online!
Z sugestią Kirilla:
Wypróbuj online!
źródło
hex()
podaje znormalizowaną notację, która zawsze zaczyna się od0x1.
. Jeśli tak, możesz użyć tego dla 44 bajtów.język maszynowy x86_64 dla systemu Linux, 14 bajtów
Wypróbuj online!
źródło
MATL , 10 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES7),
5250 bajtówNie używa,
Math.floor(Math.log2(n))
ponieważ nie gwarantuje się, że będzie dokładna. Edycja: Zapisano 2 bajty dzięki @DanielIndie.źródło
Perl 5
-pl
, 28 bajtówWypróbuj online!
Przypadki testowe 1e-256 i 1e256 są wyłączone, ale dlatego, że Perl 5 konwertuje duże lub małe ciągi zmiennoprzecinkowe niedokładnie.
źródło
Makro C (gcc) , 49 bajtów
Wypróbuj online!
Zwraca,
double
ale przy założeniu precyzji IEEE, nie będzie miała części ułamkowej. Teraz obsługuje także liczby ujemne.źródło
T-SQL , 80 bajtów
Dane wejściowe pochodzą z kolumny
n
tabeli o nazwiet
:SQLFiddle
źródło
Hoon , 25 bajtów
Utwórz ogólną funkcję, która zwraca mod wejściowy
2^52
.Nazywając to:
źródło
JavaScript (ES7),
9876 bajtówZaoszczędź 22 (!) Bajtów dzięki @Neil
Bardziej szczegółowe niż odpowiedź Neila , ale chciałem spróbować z tablicami maszynowymi .
Wypróbuj online!
źródło
UInt32Array
oszczędza 22 bajty:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
?APL (Dyalog) , 38 bajtów
Wypróbuj online!
źródło
Stax ,
1914 bajtówUruchom i debuguj
Kod po rozpakowaniu, niepolowaniu i komentowaniu wygląda tak.
Uruchom ten
źródło
Rubin , 39 bajtów
Wypróbuj online!
źródło
Rdza , 21 bajtów
Prawie skopiowane rozwiązanie C. Kłóci się
f64
.Wypróbuj online!
źródło
Java 8 lub nowsza , 38 bajtów
Wypróbuj online!
źródło
Język maszynowy Aarch64 dla systemu Linux, 12 bajtów
Aby to wypróbować, skompiluj i uruchom następujący program C na dowolnym komputerze z systemem Linux Aarch64 lub urządzeniu z Androidem (Aarch64) z systemem Termux
źródło
Julia 0,4 , 30 bajtów
Wypróbuj online!
źródło
Dalej (gforth) , 42 bajty
Zakłada, że liczby zmiennoprzecinkowe są domyślnie podwójne, a komórki mają długość 8 bajtów (jak ma to miejsce w moim komputerze i TIO)
Wypróbuj online!
Wyjaśnienie
Czwarta (gforth) 4-bajtowa odpowiedź komórki, 40 bajtów
Zamiast tego niektóre starsze czwarte instalacje używają komórek 4-bajtowych
Wyjaśnienie
źródło