这实际上与Python没有任何关系 - 使用硬件的二进制浮点算法,您会在任何语言中看到相同的行为。第一个read the docs。
读完之后,你会更好地理解你是而不是在你的代码中增加了百分之一。这是您要添加什么:
>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
该字符串表示的二进制浮点(在C“双精度”)的精确十进制值近似准确的十进制值0.01。你真的添加的东西比1/100大一点。
控制浮点数字错误是被称为“数值分析”的字段,是一个非常庞大而复杂的话题。只要您对浮点数只是十进制值的近似值而感到惊讶,请使用decimal
模块。这会为你带来一个“浅”问题的世界。例如,给定这个小修改你的函数:
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root < num:
root += D("0.01")
return root
则:
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
这不是真的更准确,但可能是简单的例子那么令人惊讶,因为现在它的加入正好一一-hundredth。
另一种方法是坚持浮动并添加为的东西可以完全表示为二进制浮点形式:值为I/2**J
。例如,不要添加0.01,而要添加0.125(1/8)或0.0625(1/16)。
然后查找“牛顿法”,用于计算平方根;-)
也许尝试[小数](http://docs.python.org/2/library/decimal.html)模块,这是精确设计? – Michael0x2a