2012-05-19 1 views
2

나는 간단한 재귀 공식으로 주위를 연주하고 코드호기심 파이썬 행동 접근 X.0

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으로 여러 번 연속으로 해석 될 정도로 충분히 이상하게 해석 될 것입니다.

나는 코드 단위로 잘못된 것을하고 있는가, 아니면 나의 해석이 맞습니까? 그렇다면 왜 이런 일이 일어나는 것입니까?

답변

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 
+0

아. 하지만 왜 2.999 대신에 3.0으로 해석됩니까? ...? 나는이 근사값을 어떻게 처리 할 것인가? 11 자리 10 진수로 부동 소수점을 자르고 그 값이 모두 9 인 경우 3.0이라고 부르는가? – Max

+0

@Max : 네, ~ 11 진수로 반올림하는 것 같습니다. – NPE

+0

@Max : 12 번째 십진수가> = 5 일 때; 결국 라운딩이 작동하는 방식입니다. –

3

이것은 print이 플로트를 포맷하는 방식 때문입니다. 당신과 같이 인쇄 문을 변경하는 경우

print("%.40f" % p)