Setiap titik mengambang biner dapat diformat dengan tepat dalam desimal. String yang dihasilkan mungkin agak panjang, tetapi itu mungkin. Dalam artikel saya tentang floating point, saya membahas pentingnya presisi, dan sekarang saya ingin fungsi ini. Tantangan ini adalah untuk menulis sebuah program, atau fungsi, yang mengambil nilai floating point sebagai input dan memformat string desimal yang tepat sebagai output.
Untuk memastikan kami bekerja dengan angka floating point yang benar, format yang tepat harus diberikan sebagai input ke program. Format ini akan menjadi dua bilangan bulat Significand Exponent
, di mana nilai floating point yang sebenarnya adalah Significand * 2 ^ Exponent
. Perhatikan bahwa nilai mana pun bisa negatif.
Spesifik:
- Kisaran dan ketepatan setidaknya float 32-bit harus didukung (tidak ada input yang akan melampaui itu)
- Nilai yang diformat desimal harus merupakan representasi yang tepat (cukup dekat untuk menjamin round-tip kembali ke float tidak cukup baik)
- Kami tidak mempercayai fungsi format floating point pustaka standar untuk menjadi cukup benar atau cukup cepat (mis .:)
printf
, dan karenanya fungsi itu mungkin tidak digunakan. Anda harus melakukan pemformatan. Fungsi pemformatan / konversi integral diizinkan. - Mungkin tidak ada nol di depan atau di belakang, kecuali untuk nol di depan yang diperlukan
.
jika tidak ada komponen bilangan bulat - Fungsi, atau seluruh program, diizinkan.
Contoh:
1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64
Kode terpendek menang.
sumber
.0
?0.abc
bukan nol awal, makaabc.0
bukan yang tertinggal..0
angka bulat ketika berhadapan dengan angka floating point. Lihat misalnya Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Logika Anda masih tidak konsisten.Jawaban:
CJam, 43
Cobalah online
Penjelasan:
Program ini bekerja dengan eksponen hingga ± 999, mendekati presisi ganda (64 bit). Ini memisahkan tanda minus (jika ada) dari yang signifikan, mengalikannya dengan 10 999 kemudian melakukan sedikit pergeseran dengan eksponen, yang sekarang merupakan perhitungan yang tepat. Kemudian bantalan ke kiri dengan nol jika hasilnya memiliki kurang dari 1000 digit, memisahkan 999 digit terakhir sebagai bagian fraksional, menghilangkan nol tertinggal dengan mengubah kebalikannya menjadi bilangan bulat, menambahkan titik desimal jika diperlukan, dan meletakkan semuanya kembali bersamaan.
Pada akhirnya, tanda minus (jika ada) dan string terakhir secara otomatis dicetak bersama.
sumber
CJam, 50 byte
Ini adalah program lengkap yang bertuliskan STDIN. Cobalah online di penerjemah CJam .
Verifikasi semua kasus uji sekaligus.
sumber
GNU sed + dc, 65
Skor termasuk +1 untuk
-r
opsi sed .Saya tergoda untuk mengklaim ini
dc
-hanya jawabanC8k& 2r^*p
untuk skor 10, tetapidc
memiliki beberapa kebiasaan format:_
bukan-
|n| < 1
harus ditambahkanJadi ekspresi dc dibungkus dan dialihkan
sed
untuk menjaga hal di atas.Hasil tes:
sumber
dc
melanggar aturan saya tentang menggunakan fungsi format standar.dc
ok, mengingat "aritmatika presisi tetap tidak terbatas atau tinggi diperbolehkan" .dc
'sp
perintah bukanlah ' floating point format fungsi' - itu adalah fungsi cetak presisi sewenang-wenang. Saya mengatur presisi ke 128 tempat desimal (C8k
), yang saya pikir lebih dari cukup untuk float 32bit.