Başlık şaşırtıcı değil mi? 0.1 + 0.2 işleminin 0.3’e eşit olması gerekmiyor mu? Kesinlikle! Fakat yazılım dünyasında işler ne yazık ki öyle olmuyor..
Şimdi Python, PHP ve C dillerinden örnek kodları ve çıktılarını inceleyelim.
Python
print(0.1 + 0.2) # Çıktı: 0.30000000000000004
PHP
<?php echo 0.1 + 0.2; // Çıktı: 0.3 ?>
C
#include <stdio.h> #include <stdlib.h> int main() { float e = 0.1; float a = 0.2; printf("%f",e+a); return 0; } //Çıktı: 0.300000
Şimdi Python dışında her şey normal gözükmekte değil mi? Fakat neden Python’da 0.1 + 0.2 işleminin sonucu 0.3 olarak değil de 0.30000000000000004 olarak karşımıza çıktı?
Nedeni Basit, 64 Bit Dünyasında 0.1 aslında yok!
Aslında bu işlemin sonucu tüm programlama dillerinde buna benzer bir şekilde çıkacaktı. Çünkü bilgisayar dünyasında 0.1 yani 1/10 sayısı aslında yok! 64 bit kayan noktalı sayılar (floating point) dünyasında 1/10 sayısı net olarak bilinmediği için sadece tahmini olarak bir sonuç gösteriliyor. Yani aslında yukarıdaki C örneğinde printf() fonkisyonumuzda küçük bir değişiklik yapıp onun virgülden sonra 20 basamak göstermesini sağlasaydık; 0.1 + 0.2 işleminin sonucu onda da 0.30000000447034836000 olarak karşımıza çıkacaktı.
Hata Payı?
Bu durum yabancı kaynaklardan edindiğim bilgilere göre 10 üzeri -17 düzeyinde meydana gelmekte. Yani gerçek dünyada nanometre düzeyinde hatalar meydana getiriyor; bu da çoğu yazılımda bir sorun olarak karşımıza çıkmıyor.
Hiç Mi Sorun Değil?
Aslına bakarsanız bu yukarıda örneklerini verdiğim (ve evet, 0.3 cevabını veren PHP’de bile) çok büyük bir sorun teşkil etmekte. Nedeni ise çok basit!
Eşitlikler!
Evet, eşitlikler! 0.3 diye bir sayı aslında var olmadığı için, 0.1 + 0.2 = 0.3 ifadesi yazılım dünyasında doğru olarak kabul edilemiyor. Yani yine örneklerden yola çıkarsak;
Python
if (0.1 + 0.2 == 0.3) : print("TRUE") else : print ("FALSE") # Çıktı: FALSE
PHP
<?php if(0.1 + 0.2 == 0.3){ echo 'TRUE'; }else{ echo 'FALSE'; } // Çıktı: FALSE ?>
C
#include <stdio.h> #include <stdlib.h> int main() { float e = 0.1; float a = 0.2; float b = 0.3; if( e + a == b ){ printf("TRUE"); }else{ printf("FALSE"); } return 0; } // Çıktı: FALSE
Sonuç
İşte bu sebeplerden dolayı, ondalıklı (kayan) sayılar ile karşılaştırma ve dört işlem yapılabilse de eşitliklerde kullanılmaması gerektiğini düşünmekteyim.
Peki bu sayıların gerçek değerlerini nasıl öğrenirim diyorsanız, yandaki bağlantıdan 0.1, 0.2 ve 0.3 gibi ondalıklı sayıları bilgisayar nasıl görüyor öğrenebilirsiniz. http://pages.cs.wisc.edu/~rkennedy/exact-float
Kaynak: https://www.quora.com/Why-is-0-1+0-2-not-equal-to-0-3-in-most-programming-languages