Ondalık nokta hiçbir yerde açıkça saklanmaz; bu bir görüntüleme sorunu.
Aşağıdaki açıklama basitleştirmedir; Birçok önemli ayrıntıyı bırakıyorum ve örneklerim herhangi bir gerçek dünya platformunu temsil etmiyor. Kayan nokta değerlerinin bellekte nasıl temsil edildiğine ve bunlarla ilişkili sorunlara bir lezzet vermelidir, ancak Her Bilgisayar Bilimcisinin Kayan Nokta Aritmetiği Hakkında Bilmesi Gerekenler gibi daha yetkili kaynaklar bulmak isteyeceksiniz .
Başlangıç olarak, 10 no'lu taban yerine 2 temel notayı kullanarak bilimsel gösterimin bir varyantında bir kayan nokta değerini temsil ederek başlayın. Örneğin, 3.14159 değeri şu şekilde temsil edilebilir:
0.7853975 * 2 2
0.7853975 anlamlı , yani mantis; sayının anlamlı rakamları içeren kısmıdır. Bu değer, 3.14159'u elde etmek için 2 gücüne yükseltilmiş taban 2 ile çarpılır.
Kayan nokta sayıları, anlamlı ve üs (bir işaret bitiyle birlikte) depolanarak kodlanır.
Tipik bir 32 bit düzen aşağıdakine benzer:
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
İşaretli tamsayı türleri gibi, yüksek dereceli bit de işareti belirtir; 0, pozitif bir değeri, 1, negatifi belirtir.
Sonraki 8 bit üs için kullanılır. Üsler pozitif veya negatif olabilir, ancak başka bir işaret biti ayırmak yerine, 10000000'in 0'ı temsil ettiği şekilde kodlanırlar, böylece 00000000 -128'i ve 11111111 127'yi temsil eder.
Kalan bitler anlamlılık için kullanılır. Her bit, soldan 2 sayım negatif gücünü temsil eder, bu nedenle:
01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2-4 + 1 * 2-5
= 0,25 + 0,125 + 0,03125
= 0.40625
Bazı platformlar her zaman 1 değerine ayarlanmış olan anlamda "gizli" bir öncü bit olduğunu varsayar, bu nedenle anlamdaki değerler her zaman [0.5, 1) arasındadır. Bu, bu platformların değerleri biraz daha yüksek bir hassasiyetle depolamasına olanak tanır (daha fazla aşağıda). Örneğim bunu yapmıyor.
Yani 3.14159'umuzun değeri,
0 10000010 11001001000011111100111
^ ^ ^
| | |
| | + --- anlamlı = 0.7853975 ...
| |
| + ------------------- üs = 2 (130-128)
|
+ ------------------------- işareti = 0 (pozitif)
değer = -1 (işaret) * 2 (üs) * (anlamlı)
değer = -1 0 * 2 2 * 0.7853975 ...
değer = 3.14159 ...
Şimdi, tüm bitleri anlamlı olarak eklerseniz fark edeceğiniz bir şey, toplam 0.7853975; aslında 0.78539747'ye çıkıyorlar. Değeri tam olarak depolamak için yeterli bit yok ; yalnızca yaklaşık bir değeri saklayabiliriz. Anlamlı olan bit sayısı hassasiyeti veya kaç önemli basamak saklayabileceğinizi belirler. 23 bit bize yaklaşık 6 ondalık basamak hassasiyeti verir. 64 bit kayan nokta türleri, yaklaşık 12 ila 15 basamak hassasiyet sağlamak için anlamlı olarak yeterli bitler sunar. Ancak, nasıl olursa olsun tam olarak temsil edilemeyen değerler olduğunu unutmayınkullandığınız birçok bit. 1/3 gibi değerler sonlu ondalık basamaklarla temsil edilemediğinde, 1/10 gibi değerler sonlu sayılarda gösterilemez. Değerler yaklaşık olduğundan, onlarla hesaplamalar da yaklaşıktır ve yuvarlama hataları birikir.
Üsteki bit sayısı aralığı belirler (temsil edebileceğiniz minimum ve maksimum değerler). Ancak minimum ve maksimum değerlerinize doğru ilerledikçe, temsil edilebilir değerler arasındaki boşluğun boyutu artar. Yani, 0.785397 ile 0.785398 arasındaki değerleri tam olarak temsil edemezseniz, 7.85397 ile 7.85398 arasındaki değerleri veya 78.5397 ile 78.5398 arasındaki değerleri veya 785397.0 ile 785398.0 arasındaki değerleri tam olarak temsil edemezsiniz. Çok büyük (büyüklük açısından) sayıları çok küçük sayılarla çarparken dikkatli olun.