Bahwa ini bekerja sama sekali tidak sepele! Ini adalah properti dari representasi floating point IEEE yang int∘floor = ⌊⋅⌋ jika besarnya angka yang dimaksud cukup kecil, tetapi representasi yang berbeda dimungkinkan di mana int (lantai (2.3)) mungkin 1.
Posting ini menjelaskan mengapa ia bekerja dalam kisaran itu .
Dalam double, Anda dapat mewakili bilangan bulat 32bit tanpa masalah. Ada tidak bisa menjadi masalah pembulatan. Lebih tepatnya, ganda dapat mewakili semua bilangan bulat di antara dan termasuk 2 53 dan -2 53 .
Penjelasan singkat : Double dapat menyimpan hingga 53 digit biner. Ketika Anda membutuhkan lebih banyak, nomor tersebut diisi dengan angka nol di sebelah kanan.
Oleh karena itu, 53 yang merupakan jumlah terbesar yang dapat disimpan tanpa bantalan. Secara alami, semua angka (bilangan bulat) yang membutuhkan lebih sedikit digit dapat disimpan secara akurat.
Menambahkan satu ke 111 (dihilangkan) 111 (53 yang) menghasilkan 100 ... 000, (53 nol). Seperti yang kita tahu, kita dapat menyimpan 53 digit, yang membuat padding nol paling kanan.
Di sinilah 2 53 berasal.
Lebih detail: Kita perlu mempertimbangkan cara kerja floating point IEEE-754.
1 bit 11 / 8 52 / 23 # bits double/single precision
[ sign | exponent | mantissa ]
Jumlahnya kemudian dihitung sebagai berikut (tidak termasuk kasus khusus yang tidak relevan di sini):
-1 tanda × 1.mantissa × 2 eksponen - bias
di mana bias = 2 eksponen - 1 - 1 , yaitu 1023 dan 127 untuk presisi ganda / tunggal.
Mengetahui bahwa mengalikan dengan 2 X hanya menggeser semua bit X tempat ke kiri, mudah untuk melihat bahwa setiap bilangan bulat harus memiliki semua bit dalam mantissa yang berakhir tepat dari titik desimal ke nol.
Bilangan bulat apa pun kecuali nol memiliki bentuk berikut dalam biner:
1x ... x di mana x -es mewakili bit di sebelah kanan MSB (bit paling signifikan).
Karena kami mengecualikan nol, akan selalu ada MSB yang satu - yang mengapa tidak disimpan. Untuk menyimpan bilangan bulat, kita harus membawanya ke dalam bentuk yang disebutkan di atas: -1 tanda × 1.mantissa × 2 eksponen - bias .
Itu mengatakan hal yang sama seperti menggeser bit ke titik desimal sampai hanya ada MSB di sebelah kiri MSB. Semua bit tepat dari titik desimal kemudian disimpan dalam mantissa.
Dari sini, kita dapat melihat bahwa kita dapat menyimpan paling banyak 52 digit biner selain dari MSB.
Oleh karena itu jumlah tertinggi di mana semua bit disimpan secara eksplisit adalah
111(omitted)111. that's 53 ones (52 + implicit 1) in the case of doubles.
Untuk ini, kita perlu mengatur eksponen, sehingga titik desimal akan bergeser 52 tempat. Jika kita ingin meningkatkan eksponen dengan satu, kita tidak dapat mengetahui angka kanan ke kiri setelah titik desimal.
111(omitted)111x.
Dengan konvensi, ini adalah 0. Menetapkan seluruh mantissa ke nol, kami menerima nomor berikut:
100(omitted)00x. = 100(omitted)000.
Itu 1 diikuti oleh 53 nol, 52 disimpan dan 1 ditambahkan karena eksponen.
Ini mewakili 2 53 , yang menandai batas (baik negatif dan positif) di mana kita dapat secara akurat mewakili semua bilangan bulat. Jika kita ingin menambahkan satu ke 2 53 , kita harus menetapkan nol implisit (dilambangkan oleh x
) menjadi satu, tetapi itu tidak mungkin.
math.floor
mengembalikan float di v2.6 , tetapi mengembalikan bilangan bulat di v3 . Pada titik ini (hampir enam tahun setelah OP), masalah ini mungkin jarang muncul.