5 Mart 2016 Cumartesi

Python ve Ondalık Sayılar

Bilgisayar bilimi gerçekten çok ilginç. Eğer herhangi bir programlama dilinde iki ondalık sayıyı topladığımız zaman karşınıza çok ilginç şeyler çıkarsa benim gibi şaşırmayın. Buna Python dili de dahil elbette.

Şu anda katıldığım optik tasarım kursunda, merceklerin odak noktalarından tutun tasarlanan sistemin ebatlarına, mercek geometrisinden ışın özelliklerine kadar neredeyse her yerde mikron mertebesinde ondalık sayılarla ilgilenmek zorunda kalıyoruz. Bu işlemleri Python dilinde yapmaya çalıştığınız zaman -benim gibi- enteresan sonuçlarla karşı karşıya kalırsınız.

Şimdi bu konuyu inceleyelim. Örneğin:
for x in range(6):
    n += 0.1
    print(n)
Python karşımıza aşağıdaki sonuçları çıkaracaktır.

1.1
1.2000000000000002
1.3000000000000003
1.4000000000000004
1.5000000000000004
1.6000000000000005

1.1 ile 0.1'i toplayıp 1.200000...2 bulmak gerçekten yetenek ister. Bu tarz sonuçları ondalık hassasiyeti yapılmamış neredeyse tüm programlama dillerinde görmek mümkün. Bu rezillikten kurtulmanın yolu Python kütüphanesinin sunduğu "decimal" modülüdür. Bu konuyla ilgili detaylı bilgiyi Python yardım sayfasından edinebilirsiniz. Orada da anlatıldığı gibi bu sorunu şu şekilde çözebiliriz.

#!/usr/bin/env python3
from decimal import Decimal, getcontext

# 'Precision' yani hassasiyet belirleyelim
getcontext().prec = 3 # virgül hariç tüm karakterler

a = Decimal(1)

for x in range(10):
 
 a +=  Decimal(0.15)
 print(a)

Ondalıklı sayını yuvarlamak için de -mesela yukarı- "getcontext().rounding = ROUND_UP" değişkenini değiştirebilirsiniz.

Hiç yorum yok:

Yorum Gönder