2016-06-20 6 views
2

大きな整数の長さが15を超えると、最後の数字は0に設定されます。これを避けるにはどうすればよいですか?例えば、pythonでの整数精度2.7

a=[1,100,20,167,52,96,181,0] 
b = 0 
for i in range(8): 
    b = b + a[i]*(2**(8*(i))) 
    print a[i] 
print "%f" % b 

bは51052750042326016である、しかし、実際の値は、あなたのコードで51052750042326017.

答えて

0

、あなたがする"%d"フォーマットを使用することができるようにbは、整数ではなく、float型に割り当てられているべきですそれを印刷する。それらは、ベース2のコンピュータハードウェアで表現される浮動小数点値は、(バイナリ)の分画このissue and limitationを有する:print "%d %f" % (b, b)

a=[1,100,20,167,52,96,181,0] 
b = 0 
for i in range(8): 
    b = b + a[i]*(2**(8*(i))) 
    print a[i] 
print "%d" % b 

出力:

51052750042326017 51052750042326016.000000 

docsから:

残念ながら、ほとんどの小数部分を バイナリ分数と正確に表すことはできません。結局のところ、入力した浮動小数点数は、機械に実際に格納されている2進数 の浮動小数点数によって近似されるだけです。 Floating Point Limitationsページから

1

のPythonを実行している典型的なマシンで、Pythonのフロート

ために利用可能な精度 の53ビットのようなある:

>>> a = 2 ** 53 + 1 
>>> a 
9007199254740993L 
>>> int(float(a)) 
9007199254740992L 

上記の例では、という形式を使用していますprintのでは、整数bを暗黙的にfloatに変換しています。その大きさはPythonのfloatとして正確に表現できるものよりも大きいので、可能な限り最も近い53ビット表現が与えられます。

これを回避する最も簡単な方法は、という文字をという整数で、%dの形式で印刷することです。

+0

素晴らしい、乾杯。問題は解決された。 – Felix