Untuk kejelasan, jika saya menggunakan bahasa yang mengimplementasikan IEE 754 floats dan saya menyatakan:
float f0 = 0.f;
float f1 = 1.f;
... dan kemudian mencetaknya kembali, saya akan mendapatkan 0,0000 dan 1,0000 - tepatnya.
Tetapi IEEE 754 tidak mampu mewakili semua angka di sepanjang garis nyata. Mendekati nol, celahnya kecil; saat Anda semakin jauh, jarak semakin besar.
Jadi, pertanyaan saya adalah: untuk pelampung IEEE 754, yang merupakan bilangan bulat pertama (paling dekat dengan nol) yang tidak dapat direpresentasikan secara tepat? Saya hanya benar-benar peduli dengan mengapung 32-bit untuk saat ini, meskipun saya akan tertarik untuk mendengar jawabannya untuk 64-bit jika seseorang memberikannya!
Saya pikir ini akan sesederhana menghitung 2 bits_of_mantissa dan menambahkan 1, di mana bits_of_mantissa adalah berapa banyak bit yang diekspos standar. Saya melakukan ini untuk mengapung 32-bit pada mesin saya (MSVC ++, Win64), dan sepertinya baik-baik saja.
sumber
Jawaban:
2 mantissa bit + 1 + 1
+1 dalam eksponen (mantissa bits + 1) adalah karena, jika mantissa berisi
abcdef...
angka yang diwakilinya sebenarnya1.abcdef... × 2^e
, memberikan bit presisi ekstra implisit.Oleh karena itu, bilangan bulat pertama yang tidak dapat diwakili secara akurat dan akan dibulatkan adalah:
Untuk
float
, 16.777.217 (2 24 + 1).Untuk
double
, 9.007.199.254.740.993 (2 53 + 1).sumber
float
dan mengaturnya sama dengan 16.777.217. Tetapi ketika saya mencetaknya menggunakannyacout
menghasilkan 16.777.216. Saya menggunakanC++
. Mengapa saya tidak bisa mendapatkan 16.777.217?(1 << std::numeric_limits<float>::digits) + 1
, dan di C(1 << FLT_MANT_DIG) + 1
,. Yang pertama itu bagus karena bisa menjadi bagian dari templat. Jangan tambahkan +1 jika Anda hanya ingin integer representable terbesar.Nilai terbesar yang dapat diwakili oleh integer n bit adalah 2 n -1. Seperti disebutkan di atas, a
float
memiliki 24 bit presisi dalam arti yang tampaknya menyiratkan bahwa 24 tidak cocok.Namun demikian .
Pangkat 2 dalam kisaran eksponen persis direpresentasikan sebagai 1,0 × 2 n , sehingga 2 24 dapat cocok dan akibatnya bilangan bulat tak terwakili pertama
float
adalah 2 24 +1. Seperti disebutkan di atas. Lagi.sumber