2013-02-08 40 views
0

我正在寫一個Python程序來打印輸入數字前的十個冪。例如,如果輸入12345,程序應輸出10,100,1000,10000這是我的計劃 -Python中的math.log

import math 
limit = raw_input('Check until: '); 
tenpowers=1 
for i in range(1, int(limit)+1): 
    if math.log(i, 10)==tenpowers: 
     print 'tenpower! - ', i 
     tenpowers=tenpowers+1 

我的程序正常工作只有當輸入值小於或等於100。這裏的輸出 -

D:\py>python prog.py 
Check until: 100 
tenpower! - 10 
tenpower! - 100 

D:\py>python prog.py 
Check until: 12345 
tenpower! - 10 
tenpower! - 100 

請注意第二次,當我輸入12345,它仍然輸出只有10和100.這裏怎麼了?

+3

只是一個小竅門,你不需要用python中的';'結束代碼行(它會自動完成)。 – Killrawr

+0

哦!我沒有注意到,我甚至都沒有注意到。我在工作中使用Java,而我對Python很陌生。沒有注意到我做到了。 :-) – MediumOne

+0

@Killrawr:它不會自動完成。 Python不是Javascript,它需要分號作爲語句終止符,但如果它們丟失,則會奇蹟般地添加它們;它根本不需要語句終止符。 – abarnert

回答

2

math.log使用浮動,這些幾乎總是涉及一些舍入錯誤。

>>> math.log(1000, 10) 
2.9999999999999996 

如果你需要的是準確的,你應該改變你的算法生成的10的權力(簡單地乘以10的最後功率)只要新的功率比你輸入號碼較小的繼續。

>>> limit = 12345 
>>> power = 10 
>>> while power < limit: 
...  print power 
...  power = power * 10 
... 
10 
100 
1000 
10000 

這是保證是確切的,因爲它不涉及任何浮點數。 (並且速度也快很多)

+0

謝謝!我在'if'條件之前提出了一個調試語句 - 'print'i - ',i,'math.log(i,10) - ',math.log(i,10),'tenpowers - ',tenpowers'和在這個價值永遠是正確的。我認爲math.log(i,10)的值在轉換爲字符串時四捨五入。這是誤導。 – MediumOne

+0

@MediumOne:當你用浮動調試時,打印'repr(i)'而不是'i'。在某些版本的Python中,'print(2.9999999999999996)'將顯示'3',而在其他版本上則顯示'2.9999999999999996'。但是'print(repr(2.9999999999999996))'將會是'2.9999999999999996'。 – abarnert

+0

打印浮點數時要小心。由於印刷時的默認精度,它們有時會非常精確地放置。例如由於浮游物的性質,'0.1'實際上不是'0.1'。爲了檢查浮點值,你可以使用一個格式化字符串,比如''%.50f'%0.1' – bikeshedder

1

Floating-point math再次發作!看看math.log返回的值:

>>> math.log(10000, 10) 
4.0 
>>> math.log(1000, 10) 
2.9999999999999996 
>>> math.log(100, 10) 
2.0 
>>> math.log(10, 10) 
1.0 
+0

是的,這是我的程序中的浮點舍入錯誤。謝謝。 – MediumOne