Standart C Programlama Dili


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 (09, af), 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.