Latar Belakang
IEEE 754 Format floating-point presisi ganda adalah cara untuk mewakili bilangan real dengan 64 bit. Ini terlihat seperti berikut:
Bilangan real n
dikonversi menjadi double
dengan cara berikut:
- Bit tanda
s
adalah 0 jika angkanya positif, 1 sebaliknya. - Nilai absolut dari
n
diwakili dalam bentuk2**y * 1.xxx
, yaitu kekuatan-2 kali basis . - Eksponennya
e
adalahy
(kekuatan 2) minus 1023. - Fraksi
f
adalahxxx
bagian (bagian pecahan dari basis), mengambil 52 bit paling signifikan.
Sebaliknya, pola bit (didefinisikan oleh tanda s
, eksponen e
dan fraksi f
, masing-masing bilangan bulat) mewakili angka:
(s ? -1 : 1) * 2 ** (e - 1023) * (1 + f / (2 ** 52))
Tantangan
Diberikan bilangan real n
, output bagian fraksinya 52-bit sebagai double
representasi n
bilangan bulat.
Uji Kasus
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)
Anda dapat memeriksa nomor lain menggunakan referensi C ini yang menggunakan bidang bit dan gabungan.
Perhatikan bahwa jawaban yang diharapkan adalah sama untuk +n
dan -n
untuk nomor apa pun n
.
Masukan dan keluaran
Aturan standar berlaku.
Format input yang diterima:
- Angka floating-point, setidaknya memiliki
double
presisi secara internal - Representasi string angka dalam desimal (Anda tidak perlu mendukung notasi ilmiah, karena Anda dapat menggunakan
1000...00
atau0.0000...01
sebagai input)
Untuk output, kesalahan pembulatan pada bit paling signifikan dapat ditoleransi.
Kondisi Menang
Ini adalah kode-golf , sehingga byte terendah di setiap bahasa menang.
Jawaban:
C (gcc) ,
4230 byteMembawa pointer ke dobel sebagai argumen dan mengembalikan panjang .
Membutuhkan 64-bit long dan gcc (perilaku tidak terdefinisi).
Berkat @nwellnhof untuk -2 byte!
Cobalah online!
sumber
&~0UL>>12
lebih pendek dua byte. Makro hanya bekerja dengan nilai, meskipun.-Df(x)=*(long *)&x&~0UL>>12
, simpan 3 byte. TIOHaskell,
2731 bytedecodeFloat
mengembalikan signifikan dan eksponen, tetapi untuk beberapa alasan yang pertama adalah 53 bit di Haskell, jadi kita harus memotong satu bit.Cobalah online!
sumber
Python 3 ,
5450 byteCobalah online!
Dengan saran Kirill:
Cobalah online!
sumber
hex()
memberikan notasi dinormalisasi yang selalu dimulai dengan0x1.
. Jika demikian, Anda bisa menggunakan ini untuk 44 byte.bahasa mesin x86_64 untuk Linux, 14 byte
Cobalah online!
sumber
MATL , 10 byte
Cobalah online!
Penjelasan
sumber
JavaScript (ES7),
5250 byteTidak menggunakan
Math.floor(Math.log2(n))
karena tidak dijamin akurat. Sunting: Disimpan 2 byte berkat @DanielIndie.sumber
Perl 5
-pl
, 28 byteCobalah online!
Kasus uji 1e-256 dan 1e256 tidak aktif, tetapi itu karena Perl 5 mengkonversi string floating point besar atau kecil secara tidak tepat.
sumber
C (gcc) makro, 49 byte
Cobalah online!
Mengembalikan
double
tetapi mengasumsikan presisi IEEE, itu tidak akan memiliki bagian pecahan. Juga menangani angka negatif sekarang.sumber
T-SQL , 80 byte
Input diambil dari kolom
n
tabel bernamat
:SQLFiddle
sumber
Hoon , 25 byte
Buat fungsi generik yang mengembalikan mod input
2^52
.Menyebutnya:
sumber
JavaScript (ES7),
9876 byteDisimpan 22 (!) Byte berkat @Neil
Lebih bertele-tele daripada jawaban Neil , tetapi saya ingin mencobanya dengan array yang diketik .
Cobalah online!
sumber
UInt32Array
menghemat 22 byte:(n,[l,h]=new Uint32Array(new Float64Array([n]).buffer))=>(h&-1>>>12)*2**32+l
BigInt64Array
?APL (Dyalog) , 38 byte
Cobalah online!
sumber
Stax ,
1914 byteJalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, kode ini terlihat seperti ini.
Jalankan yang ini
sumber
Ruby , 39 byte
Cobalah online!
sumber
Karat , 21 byte
Cukup banyak solusi C yang disalin. Membawa
f64
argumen.Cobalah online!
sumber
Java 8 atau lebih baru , 38 byte
Cobalah online!
sumber
Bahasa mesin Aarch64 untuk Linux, 12 byte
Untuk mencoba ini, kompilasi dan jalankan program C berikut pada mesin Aarch64 Linux atau (Aarch64) perangkat Android yang menjalankan Termux
sumber
Julia 0,4 , 30 byte
Cobalah online!
sumber
Keempat (gforth) , 42 byte
Asumsikan float dua kali lipat secara default dan panjang sel adalah 8 byte (seperti halnya pada komputer saya dan TIO)
Cobalah online!
Penjelasan
Keempat (gforth) jawaban sel 4-byte, 40 byte
Beberapa instalasi lama yang lebih tua, standarnya adalah sel 4-byte
Penjelasan
sumber