Bu gerçekten Python ile hiçbir ilgisi yoktur - donanımınızın ikili kayan nokta aritmetiğini kullanarak herhangi bir dilde aynı davranışı göreceksiniz. İlk read the docs.
Bunu okuduktan sonra, kodunuza bir yüzlük ekleyerek değil olduğunu anlayacaksınız.
>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
O dize ikili kayan (C "çift hassasiyet") tam ondalık değerini gösterir tahminini kesin ondalık değerine 0,01: Bu eklerken tam olarak ne olduğunu. Gerçekten eklediğiniz şey 1/100'den biraz daha büyük.
Kayan noktalı sayısal hataları denetleme, "sayısal çözümleme" alanıdır ve çok büyük ve karmaşık bir konudur. Şamandıraların yalnızca ondalık değerlere yaklaştırılmasıyla başlamış olmanız koşuluyla, decimal
modülünü kullanın. Bu sizin için “sığ” bir dünya sorununu ortadan kaldıracaktır. Sonra
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root < num:
root += D("0.01")
return root
: Örneğin, işlevine bu küçük değişiklik verilen
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
Gerçekten daha doğru değil, ama şimdi tam olarak tek tek ekleyerek çünkü basit örneklerde daha az şaşırtıcı olabilir -yüzüncü.
Alternatif olarak, 'un binary float: I/2**J
biçimindeki değerleri tam olarak temsil edilebilir bir şeye eklemek gerekir. Örneğin, 0,01 eklemek yerine, 0.125 (1/8) veya 0,0625 (1/16) ekleyin.
sonra hangi kare kökleri ;-)
Belki deneyin [ondalık] (http://docs.python.org/2/library/decimal.html) modülünün hesaplanması için "Newton yöntemi" aramak hassasiyet için tasarlandı mı? – Michael0x2a