Round-off error (yuvarlama hatası), bilgisayarların sınırlı hassasiyete sahip sayı sistemleri kullanması nedeniyle ortaya çıkan bir hata türüdür. Özellikle kesirli (floating-point) sayılar ile yapılan işlemler sırasında, bazı sayıların tam olarak temsil edilememesi veya işlemler sonucunda küçük farkların birikmesiyle meydana gelir.
Neden Oluşur?
-
Kesirli sayıların tam temsil edilememesi
- Bilgisayarlar genellikle ikili (binary) sayı sistemi kullanır. Ancak, bazı ondalıklı sayılar (örneğin 0.1) ikili sistemde sonsuz bir tekrar deseni oluşturur ve tam olarak temsil edilemez.
- Örnek Python Kodu:
print(0.1 + 0.2) # Beklenen: 0.3
- Çıktı:
0.30000000000000004
- Bilgisayarlar genellikle ikili (binary) sayı sistemi kullanır. Ancak, bazı ondalıklı sayılar (örneğin 0.1) ikili sistemde sonsuz bir tekrar deseni oluşturur ve tam olarak temsil edilemez.
Hassasiyetin sınırlı olması
- Float (kayan noktalı) sayılar belirli bir bit sayısı ile temsil edilir. Örneğin, IEEE 754 standardına göre 64-bit bir
double
değişken yaklaşık 15-17 basamak hassasiyet sunar. Daha fazla basamağa ihtiyaç duyulursa, bilgiler kaybolabilir ve yuvarlama hataları oluşur.
- Float (kayan noktalı) sayılar belirli bir bit sayısı ile temsil edilir. Örneğin, IEEE 754 standardına göre 64-bit bir
Aritmetik işlemler sırasında birikme
- Küçük yuvarlama hataları, tekrar eden işlemler sonucunda büyüyerek hesaplamalarda belirgin farklara neden olabilir.
Örnekler ve Çözümler
Örnek 1 (Python): Yuvarlama hatasının birikmesi
total = 0.0
for i in range(10):
total += 0.1
print(total) # Beklenen: 1.0, Gerçek çıktı: 0.9999999999999999
Çözüm:
decimal
veya fractions
modülü kullanılabilir.from decimal import Decimal
total = sum(Decimal("0.1") for _ in range(10))
print(total) # Çıktı: 1.0
Örnek 2 (Python): Karşılaştırma Hatası
x = 0.1 + 0.2
if x == 0.3:
print("Eşit")
else:
print("Eşit değil") # Bu çalışır çünkü x tam olarak 0.3 değildir.
Çözüm: Mutlak fark (epsilon) ile karşılaştırma yapmak
import math
x = 0.1 + 0.2
if math.isclose(x, 0.3, rel_tol=1e-9):
print("Eşit") # Daha güvenilir karşılaştırma yöntemi
Sonuç
- Round-off error, kesirli sayıların tam olarak temsil edilememesi nedeniyle oluşur.
- Küçük hatalar tekrar eden işlemlerle büyüyebilir.
decimal
,fractions
veyamath.isclose()
gibi yöntemler ile bu hatalar azaltılabilir.- Sayısal hesaplamalar yaparken bu hataların farkında olmak önemlidir.