Tipe floating point (seperti Single dan Double) diwakili dalam memori oleh tanda, mantissa dan eksponen. Anggap saja sebagai notasi ilmiah:
Sign*Mantissa*Base^Exponent
Mereka - seperti yang Anda duga - menggunakan basis 2. Ada tweak lain yang memungkinkan untuk merepresentasikan infinity dan NaN, dan eksponen diimbangi (akan kembali ke sana), dan sebuah singkatan untuk mantissa (akan kembali ke sana juga) . Cari IEEE 754 standar yang mencakup perwakilan dan operasinya untuk detail lebih lanjut.
Untuk keperluan kita, kita dapat membayangkannya sebagai angka biner "mantissa", dan "eksponen" yang memberi tahu Anda di mana harus meletakkan pemisah desimal.
Dalam kasus Single, kita memiliki 1 bit untuk dia tanda tangani, 8 untuk eksponen dan 23 untuk mantissa.
Sekarang, masalahnya, kita akan menyimpan mantissa dari angka paling signifikan. Ingatlah bahwa semua nol di sebelah kiri tidak relevan. Dan memberi bahwa kita bekerja dalam biner, kita tahu bahwa digit paling signifikan adalah 1 ※. Yah, karena kita tahu itu, kita tidak harus menyimpannya. Berkat steno itu, jangkauan efektif mantra adalah 24 bit.
※: Kecuali jika nomor yang kita simpan adalah nol. Untuk itu kita akan mengatur semua bit ke nol. Namun, jika kita mencoba menafsirkan bahwa di bawah deskripsi yang saya berikan, Anda akan memiliki 2 ^ 24 (yang implisit 1) dikalikan dengan 1 (2 pangkat eksponen 0). Jadi, untuk memperbaikinya, nol eksponen adalah nilai khusus. Ada juga nilai-nilai khusus untuk menyimpan infinity dan NaN dalam eksponen.
Sesuai offset eksponen - selain menghindari nilai-nilai khusus - memiliki offset itu memungkinkan untuk menempatkan titik desimal sebelum dimulainya mantissa atau setelah akhirnya, tanpa perlu memiliki tanda untuk eksponen.
Ini berarti bahwa untuk jumlah besar, tipe floating point akan menempatkan titik desimal di luar akhir mantissa.
Ingat bahwa mantissa adalah angka 24 bit. Itu tidak akan pernah mewakili nomor 25 bit ... tidak memiliki bit ekstra itu. Dengan demikian, tunggal tidak dapat membedakan antara 2 ^ 24 dan 2 ^ 24 + 1 (ini adalah angka bit 25 pertama, dan mereka berbeda pada bit terakhir, yang tidak terwakili dalam single).
Jadi, untuk bilangan bulat kisaran tunggal adalah -2 ^ 24 hingga 2 ^ 24. Dan mencoba menambahkan 1 ke 2 ^ 24 akan menghasilkan 2 ^ 24 (karena sejauh menyangkut jenisnya, 2 ^ 24 dan 2 ^ 24 + 1 adalah nilai yang sama). Cobalah secara Online . Inilah sebabnya mengapa ada kehilangan informasi ketika mengkonversi dari integer ke single. Dan ini juga mengapa loop yang menggunakan satu atau ganda sebenarnya bisa menjadi loop tanpa batas tanpa Anda sadari.