0

入力した数値の前に10の累乗をすべて出力するPythonプログラムを作成しています。たとえば、入力が12345の場合、プログラムは10、100、1000、10000を出力する必要があります。これが私のプログラムです-

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

2回目に12345を入力しても、10と100しか出力されないことに注意してください。ここで何が問題になっていますか?

4

2 に答える 2

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

これは浮動小数点数を含まないため、正確であることが保証されています。(そして、はるかに高速です)

于 2013-02-08T01:39:49.763 に答える
1

浮動小数点演算が再び攻撃されます! によって返される値を見てください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
于 2013-02-08T01:42:48.300 に答える