0

Pythonがサポートする最小のfloat値は、パワー-308のものであることを読みました。正確な数は重要ではありません。理由は次のとおりです。

>>> -1.42108547152e-14 + 360.0 == 360.0
True

どうですか?WindowsでCPython2.7.3を使用しています。

エラーが発生します。私の値-1.42108547152e-14(何らかの方法で計算された)をいくつかの「デルタ」と比較してこれを行うと、私の問題は修正されます。

if v < delta:
    v = 0

どのデルタを選択する必要がありますか?言い換えれば、この効果が発生する値よりも小さい値で?

NumPyはご利用いただけませんのでご注意ください。

4

2 に答える 2

1

(過度に)単純化された説明は次のとおりです。(通常の)倍精度浮動小数点数は、(と同等の) 16桁の 10 進数を保持します。手で足し算をしてみましょう:

 360.0000000000000000000000000
-  0.0000000000000142108547152
______________________________
 359.9999999999999857891452848

これを 16 桁 (ポイントの前に 3 桁、ポイントの後に 13 桁) に丸めると、360 になります。

さて、実際にはこれはバイナリで行われます。したがって、「16 桁の 10 進数」は正確な規則ではありません。実際には、ここ (256.0との間512.0) の精度は、数値の小数部で 44 バイナリ桁です。360したがって、表現できる最も近い数は360マイナス {2-44累乗} であり、次のようになります。

 359.9999999999999431565811391 (truncated)

しかし、以前の結果は360.0この数よりも近かったので、360.0得られるものです。

于 2013-02-02T13:05:25.897 に答える
0

ほとんどのプロセッサは、IEEE754バイナリ浮動小数点演算を使用します。この形式では、数値は符号s、分数f、および指数eとして表されます。分数は仮数とも呼ばれます。

符号sは、それぞれ+または–を表すビット0または1です。

倍精度では、仮数fは53ビットの2進数で、最初のビットの後に基数があります(1.1010000100100110011100011011001100101010000000100011 2など) 。

倍精度では、指数eは–1022から+1023までの整数です。

符号、仮数、および指数で表される合計値は、(-1)s2e •<em>fです。

2つの数値を加算すると、プロセッサは結果に使用する指数を計算します。次に、その指数が与えられると、結果に使用する分数がわかります。大きい数と小さい数を追加すると、結果全体が仮数に収まりません。したがって、プロセッサは、数学的な結果を仮数に収まるものに丸める必要があります。

あなたが尋ねる場合、2番目に追加された数値は非常に小さいので、丸めは最初の数値と同じ値を生成します。最初の数値を変更するには、最初の数値の仮数の最下位ビットの値の少なくとも半分の値を追加する必要があります。(四捨五入の際、仮数に収まらない部分が仮数の最下位ビットの半分以上の場合は切り上げます。ちょうど半分の場合は、最下位ビットがゼロになる場合は切り上げ、その場合は切り捨てます。最下位ビットをゼロにします。)

非正規化数、無限大、指数の格納方法など、浮動小数点には追加の問題がありますが、上記はあなたが尋ねた動作を説明しています。

あなたが尋ねる特定のケースでは、360に追加し、2 -45より大きい値を追加すると、360より大きい合計が生成されます。2-45以下の正の値を追加すると、正確に360が生成されます。 360のビットは28なので、仮数の最下位ビットは2-44です。

于 2013-01-30T14:16:54.347 に答える