Das hat wirklich nichts mit Python zu tun - Sie würden das gleiche Verhalten in jeder Sprache mit der binären Fließkommaarithmetik Ihrer Hardware sehen. Zuerst read the docs.
Nachdem Sie das gelesen haben, werden Sie besser verstehen, dass Sie nicht hinzufügen ein hundertstel in Ihrem Code. Das ist genau das, was Sie fügte hinzu:
>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
Dieser String zeigt die genaue Dezimalwert der binären Floating („double precision“ in C) Annäherung an den exakten Dezimalwert 0,01. Die Sache, die du wirklich hinzufügst, ist etwas größer als 1/100.
Die Steuerung numerischer Gleitkommafehler ist das Feld "numerische Analyse" und ist ein sehr großes und komplexes Thema. Solange Sie sich darüber wundern, dass Gleitkommazahlen nur Näherungen für Dezimalwerte sind, verwenden Sie das Modul decimal
. Das wird dir eine Welt von "oberflächlichen" Problemen nehmen.
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root < num:
root += D("0.01")
return root
dann: Zum Beispiel diese kleine Änderung Ihrer Funktion gegeben
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
Es ist nicht wirklich genauer, aber möglicherweise weniger überraschend in einfachen Beispielen, weil jetzt ist es genau man eine Zugabe -Hundertstel.
Eine Alternative ist, zu halten, etwas zu schwimmt, und fügen Sie die ist genau darstellbare als binäres float: Werte der Form I/2**J
. Anstatt beispielsweise 0,01 hinzuzufügen, fügen Sie 0,125 (1/8) oder 0,0625 (1/16) hinzu.
Dann schlagen Sie unter „Newton-Verfahren“ zur Berechnung von Quadratwurzeln ;-)
Vielleicht versuchen, die [Dezimal] (http://docs.python.org/2/library/decimal.html) Modul, das ist auf Präzision ausgelegt? – Michael0x2a