0

重複の可能性:
浮動小数点数の Python 丸めエラー

numpy as で配列を作成しましたa = numpy.arange(0,1e5,1,dtype=int)a[18645]予想通り18645です。別の配列を作成するとb=a*10e-15b[18645]186.4999999999e-12 になります。b[18644]186.44e-12 です。Python がこれらの末尾の 9 を作成するのはなぜですか?

この問題は、配列内の要素を で検索しようとしたときに発生しましたnumpy.where。末尾の 9 により、numpy.where関数は で 184.45e-12 を見つけることができませんでしたb

4

2 に答える 2

5

これは、正確ではない浮動小数点に変換しているためです。丸め誤差のため、得られる結果は 186.44 ではありません。明らかに 186.5 よりわずかに小さい数値であるため、すべての 9 が出力されます。

ここには、実際にはいくつかのエラーの原因があります。まず、1e-15 を浮動小数点として正確に表現することはできません。第 2 に、乗算によってさらに誤差が生じる可能性があります。最後に、結果を 10 進数に変換し直す必要がありますが、結果を印刷するときに結果が切り捨てられるので便利です。

トリビア - double に変換された 1e-15 は正確に 0.000000000000001000000000000000777053998766107923830718560119501514549256171449087560176849365234375

この数値に 18644 を掛けると、0.0000000000186440000000000017406180102322435293213387375033107673516497015953063 96484375 が得られます。

ご覧のとおり、これはまだかなり正確です。Numpy は、エラーを指数関数的に拡大する単一のフロートを使用しているようです。

于 2012-08-24T15:59:34.080 に答える
0

この表現は、浮動小数点表現が原因です。

この問題は、numpy.where を使用して配列内の要素を検索しようとしたときに発生しました。

浮動小数点の等価性をテストしません。差が特定の精度よりも低いかどうかをテストします。浮動小数点演算は予期しない結果をもたらす可能性があるため、これを正確に行います。

実際のところ、numpy はATLASと呼ばれるBLASに基づいており、さまざまな実装から選択して特定のタイプの操作を実行できます (マシンの状態に基づいて)。そのため、同じプログラムを 2 回実行すると、異なる結果が得られる可能性があります (float の完全な表現を出力して最後の数値を確認すると)。

これは、等価性テストが float に対して期待どおりに機能することはほとんどないことを示す単なる例です。

于 2012-08-24T16:06:39.277 に答える