8.6. Onaltılı Kayan Noktalı Değişmezler
⚠
Uyarı
Kitabın bu kısmı
güncelleme ve geliştirme aşamasındadır. Lütfen,
bir süre sonra tekrar kontrol ediniz.
Daha önce de belirttiğimiz gibi, ondalık sistemde tam olarak 0.1 şeklinde ifade edilen kayan noktalı bir sayı, bilgisayar belleğinde ikili sistemde tam olarak saklanamaz. Bunun nedeni, nasıl ki ondalık sistemde 3’e veya 7’ye bölünmüş bir sayı sınırlı sayıdaki ondalık rakamlarla tam olarak ifade edilemiyorsa, ikili sistemde, bunların dışında 5’e bölünmüş bir sayı da sınırlı sayıdaki bitlerle tam olarak ifade edilemez.
printf
ve scanf
fonksiyonlarında kayan noktalı
sayıların, ondalık yerine, onaltılı sistemde yazılıp okunmasını sağlayan
yeni bir dönüşüm karakteri daha bulunmaktadır: printf
’te
e
veya E
dönüşüm karakteri yerine
a
veya A
dönüşüm karakterini;
scanf
’te e
dönüşüm karakteri yerine
a
dönüşüm karakterini kullanabiliriz.
Gelin aşağıdaki deyimler sonucunda:
float f = 0.1; printf("%e\n%a\n%A\n", f, f, f);
sistemimizde aldığımız
1.000000e-01 0x1.99999ap-4 0X1.99999AP-4
çıktısını değerlendirelim. İlk çıktı ondalık
ve üslü gösterimde görüntülenmiş bir kayan noktalı sayıdır:
1.0×10−1 = 0.1’dir. Her ne kadar, 0.1
sayısı f
değişkeni içinde tam olarak saklanamasa da,
printf
fonksiyonu görüntüleme esnasında yuvarlama
yaparak beklediğimiz çıktıyı vermektedir. İkinci çıktı ile
üçüncü çıktı arasında, harflerin büyük yazılması dışında bir fark yoktur.
İkinci çıktının genel biçimi şöyledir:
0x
karakter sırası, olası bir nokta (.
)
ile ayrılmış onaltılı sistemde gösterilmiş rakamlar
(0
… 9
,
a
… f
), p
karakterinden sonra ondalık sistemde (onaltılı değil)
iki tabanına göre yazılan bir üs. Aldığımız çıktının değerini şu şekilde
hesaplayabiliriz:
( 1 + 9 16 + 9 162 + 9 163 + 9 164 + 9 165 + 10 166 ) × 2−4 = 0.1000000015
Görüldüğü gibi 0.1’in değeri ikili sistemde tam olarak gösterilemez. 0x1.99999ap-4 (=0.1000000015) ile 0x1.999999p-4 (=0.0999999978) arasında bir değerdir.
Yukarıdaki çıktıda elde ettiğimiz sayıları aynı biçimde programa
girdi olarak vermek istersek, a
veya g
dönüşüm
karakterini kullanarak scanf
fonksiyonu ile bu sayıları
okuyabiliriz. Ayrıca, herhangi bir C program kaynak kodunda yukarıdaki biçimde
onaltılı kayan noktalı
değişmez kullanılması da mümkündür:
float f = 0x1.99999ap-4f;
Onaltılı kayan noktalı değişmezleri yazarken, değeri sıfır olsa bile,
p
harfi ile başlayan üssün dahil edilmesi gerekir. Ayrıca,
ondalık kayan nokta değişmezleri gibi, onaltılı kayan nokta değişmezlerinin de
normalde double
tipine sahip olduğuna dikkat ediniz.
Eğer, float
tipinde bir değişmez yazmak istiyorsanız,
yukarıdaki örnekte olduğu gibi F
veya f
sonekini,
eğer long double
tipinde bir değişmez istiyorsanız,
L
veya l
sonekini eklemelisiniz.