Tidak benar-benar spesifik untuk implementasi Python tetapi harus diterapkan pada float untuk fungsi string desimal.
Angka floating point pada dasarnya adalah angka biner, tetapi dalam notasi ilmiah dengan batas tetap dari angka-angka penting.
Kebalikan dari angka apa pun yang memiliki faktor bilangan prima yang tidak dibagi dengan basis akan selalu menghasilkan representasi titik titik berulang. Misalnya 1/7 memiliki faktor prima, 7, yang tidak dibagi dengan 10, dan karenanya memiliki representasi desimal berulang, dan hal yang sama berlaku untuk 1/10 dengan faktor prima 2 dan 5, yang terakhir tidak dibagikan dengan 2 ; ini berarti bahwa 0,1 tidak dapat secara tepat diwakili oleh jumlah bit yang terbatas setelah titik titik.
Karena 0,1 tidak memiliki representasi yang tepat, fungsi yang mengubah perkiraan menjadi string titik desimal biasanya akan mencoba memperkirakan nilai tertentu sehingga mereka tidak mendapatkan hasil yang tidak intuitif seperti 0,1000000000004121.
Karena floating point dalam notasi ilmiah, setiap perkalian dengan kekuatan basis hanya mempengaruhi bagian eksponen dari angka tersebut. Misalnya 1.231e + 2 * 100 = 1.231e + 4 untuk notasi desimal, dan juga, 1.00101010e11 * 100 = 1.00101010e101 dalam notasi biner. Jika saya kalikan dengan non-power dari pangkalan, angka yang signifikan juga akan terpengaruh. Misalnya 1.2e1 * 3 = 3.6e1
Bergantung pada algoritma yang digunakan, mungkin mencoba menebak desimal umum berdasarkan angka signifikan saja. Baik 0,1 dan 0,4 memiliki angka signifikan yang sama dalam biner, karena mengapung mereka pada dasarnya pemotongan (8/5) (2 ^ -4) dan (8/5) (2 ^ -6). Jika algoritme mengidentifikasi pola sigfig 8/5 sebagai desimal 1.6, maka ia akan bekerja pada 0,1, 0,2, 0,4, 0,8, dll. Mungkin juga memiliki pola sigfig ajaib untuk kombinasi lain, seperti float 3 dibagi dengan float 10 dan pola ajaib lainnya secara statistik kemungkinan akan dibentuk oleh pembagian oleh 10.
Dalam kasus 3 * 0,1, beberapa angka penting terakhir kemungkinan akan berbeda dari membagi float 3 dengan float 10, menyebabkan algoritma gagal mengenali angka ajaib untuk konstanta 0.3 tergantung pada toleransinya terhadap kehilangan presisi.
Edit:
https://docs.python.org/3.1/tutorial/floatingpoint.html
Menariknya, ada banyak angka desimal berbeda yang memiliki fraksi biner perkiraan terdekat yang sama. Misalnya, angka 0,1 dan 0,10000000000000001 dan 0,100000000000000005555511151231257827021181583404541015625 semuanya didekati oleh 3602879701896397/2 ** 55. Karena semua nilai desimal ini memiliki pendekatan yang sama, maka salah satu dari mereka dapat ditampilkan (tetap tetap). ) == x.
Tidak ada toleransi untuk kehilangan presisi, jika float x (0,3) tidak persis sama dengan float y (0,1 * 3), maka repr (x) tidak persis sama dengan repr (y).