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.9999999999と3.0(およびそれ以前)の間にはある種の近似がありますが、実際にはここで何が起こっているのでしょうか?私にとって、浮動小数点3.0が3.0とは言えないものとして解釈されるのは奇妙に思えますが、それでも3.0と呼ばれるほど十分に近く、数回続けて呼び出されます。

私はここでコード的に何か間違ったことをしていますか、それとも私の解釈は正しいですか?もしそうなら、なぜこれが起こっているのですか?

4

2 に答える 2

5

print ステートメントを次のように変更すると、次のようになります。

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 に答える