|
Yuvarlama Hatası(rounding error) |
|
|
|
|
Kayan noktalı formatlarda noktanın sağ tarafı 2’nin negatif kuvvetleriyle çarpıldığı için onluk sistemde açıkça yazılabilen bazı sayılar bu formatta kesin olarak belirtilemeyebilirler. Örneğin .1 ve .9 ile biten sayıların çoğu bu formatta tam olarak ifade
edilememektedirler. Ancak kendisi kesin olarak ifade edilemese de o sayıya yaklaşık bir sayı bu formatta yine de ifade edilebilmektedir. Bir sayının kendisinin tam olarak ifade edilememesinden dolayı onun yerine ona yaklaşık bir sayının ifade edilmesine yuvarlama hatası(rounding error) denir. Formatta sayının mantis kısmı ne kadar büyük tutulursa yuvarlama hatasının olumsuz etkisi o kadar azaltılır. Yuvarlama hatası tam olarak ifade edilen iki sayının işleme sokulup sonuç olarak alınan sayının üzerinde de oluşabilir. Yuvarlama hataları büyük sayılarla çarpma işlemlerinde iyice büyüyebilir. Programlama dillerinin çoğunda iki gerçek sayının eşitliğinin karşılaştırılmasında tam eşit olma durumuna bakılır. Böyle bir karşılaştırma işleminden kaçınmak gerekir. Örneğin aşağıdaki eşitlik matematiksel olarak doğru olduğu halde C’de if deyimi içerisine alındığında doğrulanmayabilir:
1/3+3/4+7/8 == 3/4+7/8+1/3
belki bu iki toplam noktadan sonra 70 basamak aynıdır, fakat tam olarak aynı değildir. Örneğin C’de iki gerçek sayının eşitlik karşılaştırması belli bir duyarlılık karşılığında yapılmalıdır. Bunun için iki yöntem önerilebilir. Birinci yöntem oldukça hızlı çalışır. Sayıların farkının mutlak değeri belli bir sınırdan “küçük mü?” diye bakılır(fabs fonksiyonu). İkinci yöntem popüler olarak pek çok yüksek seviyeli programlama dilinde kullanılmaktadır. Burada sayılar sprintf fonksiyonu ile n basamaklı yazılara dönüştürülür. Yazılar da strcmp fonksiyonu ile blok olarak karşılaştırılır(noktanın ASCII karşılığı sayısal karakterlerden daha küçüktür).
|