2

我正在玩一个简单的递归公式,并注意到代码

p = 2.0

while p < 3.0:
    print p
    p = (6+p)**(0.5)

将打印

*snip*
...
2.99999999952
2.99999999992
2.99999999999
3.0
3.0
3.0
3.0
3.0
3.0

当然,在 2.99999999999 和 3.0(以及之前)之间会有某种近似值,但这里实际发生了什么?对我来说,浮点 3.0 将被解释为不完全是 3.0 但仍然足够接近可以连续多次称为 3.0 似乎很奇怪。

我是在代码方面做错了什么,还是我的解释正确?如果是这样,为什么会发生这种情况?

4

2 回答 2

5

如果您像这样更改打印语句:

print '%.20f' % p

一切都会变得清晰:

2.00000000000000000000
2.82842712474619029095
2.97126692250060076006
2.99520732546189538681
2.99920111454065274614
2.99986684946859805123
2.99997780816268644344
2.99999630135816763854
2.99999938355963147174
2.99999989725993687628
2.99999998287665592400
2.99999999714610909862
2.99999999952435159045
2.99999999992072519106
2.99999999998678745783
2.99999999999779776161
2.99999999999963273822
2.99999999999993871569
2.99999999999998978595
2.99999999999999822364
2.99999999999999955591
于 2012-05-19T17:08:37.973 回答
3

这是由于print格式化浮点数的方式。尝试使用打印

print("%.40f" % p)
于 2012-05-19T17:08:18.180 回答