3

Python の浮動小数点数のモジュラスに問題があります。このコード:

...
print '(' + repr(olddir) + ' + ' + repr(self.colsize) + ') % (math.pi*2) = ' + repr((olddir+self.colsize)
...

版画:

(6.281876310240881 + 0.001308996938995747) % (math.pi*2) = 2.9043434324194095e-13

浮動小数点数が正確でないことは知っています。しかし、私はこれを意味をなすことはできません。

それが何らかの形で関連しているかどうかはわかりませんが、Google 電卓もこの計算を処理できません。これは、Google Calculator からの出力です。

(6.28187631024 + 0.001308996939) % (pi * 2) = 6.28318531

この計算エラーの原因は何ですか? また、Python プログラムでそれを回避するにはどうすればよいですか?

4

2 に答える 2

4

を使用str()して浮動小数点数を出力すると、実際には数値の丸められたバージョンが出力されます。

>>> print repr(math.pi)
3.1415926535897931
>>> print str(math.pi)
3.14159265359

したがって、計算に使用している正確な値がわからないため、結果を実際に再現することはできません。明らかに、 の正確な値olddir+self.colsizeは よりわずかに大きく2*math.pi、Google 電卓で使用した丸められた値の合計は よりわずかに小さくなり2*math.piます。

于 2011-05-13T20:30:08.240 に答える
2

strとの違いrepr

>>> import scipy
>>> pi = scipy.pi
>>> str(pi)
'3.14159265359'
>>> repr(pi)
'3.1415926535897931'

str浮動小数点数を12桁に切り捨てます。ここで、reprは内部表現を(文字列として)提供します。

編集:要約すると、問題は、時期尚早に丸めて、それに非常に近い数値を介して何かの係数を計算しているために発生しました。浮動小数点数の場合、10進数を2進数に変換するには、必然的に丸めが必要になります。

最初に、丸めが実際の数学(浮動小数点数学ではない)でどのようにあなたを傷つけるかについて例を挙げてください。(3.14 + 3.14)%(3.14 + 3.14)を見てください。これは、明らかにゼロです。では、最初に片側で桁を小数点以下1桁に丸めたらどうなるでしょうか?まあ(3.1 + 3.1)%(3.14 + 3.14)= 6.2%(6.28)= 6.2(グーグルがあなたに与えたもの)。または、round(3.14159,5)+ round(3.14159,5)%(3.14159 + 3.14159)= 6.2832%6.28318=2e-5を実行した場合。

したがって、N桁に丸めることによって(これを使用しstrて数値を効果的に丸めることにより)、計算はN桁未満にしか正確になりません。この作業を進めるには、より高い桁で強制的に丸める(安全のために計算された2桁を保持する)必要があります。たとえば、strは12桁で丸めるので、10桁で丸める必要があるかもしれません。

>>> round(6.28187631024 + 0.001308996939,10) % (round(pi * 2,10))
0
于 2011-05-13T20:31:29.060 に答える