浮動小数点関数の暗黙の精度


9

別のプログラマの見直しながら、正規分布のCDFを計算する関数の実装を、私が作っ提案 Pythonの組み込み関数または使用scipyのダウンロード、共通の科学的なライブラリを実装全体を置き換えるのいずれかにします。

別のプログラマーは、彼らのドキュメンテーションにおいていかなる正確性の保証math.erfc()scipy.stats.norm.cdf()提供もしないことを指摘しました。したがって、(尊重されたソースから取得され、エラー範囲文書化されていた)近似アルゴリズムの置き換えについては、さらに注意する必要があります。

正直なところ、組み込み関数やライブラリー関数の正確さと正確さを疑うという考えは、私の心を超えたことはありませんでした。結局、私のような機能を呼び出してきたsin()し、sqrt()あまり考えず年間のを-なぜ必要がありますmath.erf()またはscipy.stats.norm.cdf()任意の異なること?

しかし、今、私は心配しています。私の質問は:

  1. 一般的に、ドキュメントで特別な言及がない場合、これらの種類の関数は、IEEE倍精度浮動小数点で提供される精度の範囲内で、小数点以下の最後まで完全に正確であることを意味しますか?
  2. Python math.erf()やSciPy scipy.stats.norm.cdf()は特にそうですか?どうしてわかりますか?
  3. このmanページはsin()言う…

    これらの関数は、引数がpiの倍数に近いか、0.0から離れていると、精度が低下する可能性があります。

    サイン関数が周期的で対称であるのに、なぜこのような警告が存在するのでしょうか?最適な精度を得るには、入力を正規化するための呼び出し側に負担がかかるようです。

    一方、MozillaのドキュメントでMath.sin()は、正確さや正確さについては何も述べられていません。それはそれが完全に正確であることを意味しますか、それともMath.sin()他の場所のように、JavaScriptの特定の状況でのみ正確であることは「共通の知識」ですか?


1
質問1に関する参考情報:通常、精度の保証は、フロートの2進数字を参照するULP(最後の単位は単位)で与えられます。

回答:


10

ドキュメントで特別な言及がない場合、これらの種類の関数は、IEEE倍精度浮動小数点で提供される精度の範囲内で、小数点以下の最後まで完全に正確であることを意味しますか?

私はその仮定をしません。

私が取り組んでいるのはテレメトリデータです。2つの異なる数学ライブラリは、どちらもIEEE浮動小数点規格に準拠している場合でも、2つの異なる結果を生成できることは一般的な知識です これは、計算を繰り返し、2つの結果が等しいかどうかを比較する場合に影響します。

最適な精度を得るには、入力を正規化するための呼び出し側に負担がかかるようです。

それは公正な評価です。許容できるのは、ドキュメントにそのことが記載されているため、驚きはありません。

一方、Mozillaのドキュメント...

各ライブラリまたはプログラミング言語(特にsin()の倍数のような境界領域の近くpi)でいくつかの計算を試して、それらを比較することをお勧めします。これにより、それぞれにどのような振る舞いを期待できるかについての公正な考えが得られるはずです。


2
テストは良い考えです。ドキュメントが1つのことを言っているにもかかわらず、関数が別の方法で動作する場合は数え切れないほどあります。そしてOPは、文書化さえされていない暗黙の仮定に依存したいと考えています。
Siyuan Ren 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.