2017-01-15 43 views
16

が計算x*xInf0、又は非正規化数にオーバーフローまたはアンダーフローしないことを条件として、IEEEダブルx>0ようsqrt(x*x) ≠ xそれが存在しないことIEEEダブルよう?SQRT(X * X)≠X

これはsqrtは、最も近い表現の結果を返し、そうx*xは(IEEE標準で義務付け両方として、「平方根演算が無限の精度であるかのように計算されず、その後、最も近い2つのフローティングのいずれかに丸められていること与えられます無限に正確な結果を囲む指定された精度の点数」)。

は、このようなダブルスが存在するならば、その後、1に近い例は、おそらくそこにあるという仮定の下で、私はこれらの反例を見つけるためのプログラムを書いて、それが1.01.0000004780981346間のいずれかを見つけることができませんでした。

以前同様の質問perfect squares and floating point numbersx*xの計算がないが丸め伴わない状況のため、負で質問に答えます。この答えは、x*xが同じ方向に丸めを含むようにsqrt(x*x)方向に丸めを含む可能性があり、正確にはxではない回答を生成する可能性があるため、この質問では十分ではありません。

答えて

19

Sylvie Boldoはformally provedです。あなたの質問の条件を満たす浮動小数点数は存在しません。記事の要約を引用し

浮動小数点の専門家は、数式が失敗するか 浮動小数点演算で実装する場合不正確な結果を与える可能性があることを知っています。 この記事では、驚いたことに、 の場合の例について説明します。実際、基数2と無限大の指数範囲 を使用すると、 の平方根の平方根の計算は、正確に| a |です。その結果、 の/ sqrt(a + b )の浮動小数点演算は、常に 区間[-1、1]になります。これにより、arccosまたはarcsinをこの値で呼び出すときに、テストが不要になります。さらに保証するために、このプロパティ は、Coq証明アシスタントとFlocq ライブラリを使用して正式に確認されました。結論は、行動が非常に 異なるところで、 仮定および他の基数なしで何が起こるかのヒントを与えるでしょう。 「基数2を使用して」

は(IEEEも標準化された10進浮動小数点数のフォーマットと動作を有しているが)あなたの問題の可能性が暗黙であり、「無制限指数の範囲は、」あなたの「NOオーバーフローまたはアンダーフローと同等です"制限。

プロパティを全く可能にする理由は、オーバーフローが発生していない場合や、オーバーフローしていない場合や、アンダーフローの場合、*で発生する可能性のある四捨五入は無視され、の実数平方根には、xが最も近い表現可能な浮動小数点数です。この手で握る議論は証拠を構成するものではないので、上にリンクされた記事には良いものが含まれています。

+2

私はこの結果を信じていますが、それでもそれは非常に驚くべきことです。 –

関連する問題