2016-04-19 15 views
5

私は科学計算機を開発しようとしています。私の質問は次のとおりです: フロート番号を使用している非常に小さな数値とゼロ結果を区別するにはどうすればよいですか?浮動小数点からゼロを区別する方法

たとえば、0.3-0.2-0.1の場合、結果は1E-19のようなものになります。これは純粋なゼロではありません(もちろん、精度の問題です)。私は結果(0.0)を印刷したい。そこで私はEPSILONを使ってゼロとの比較を行います。

問題は計算のためです:3E-19-2E-19結果は1E-19でなければなりません。私はちょうど1E-19(正確ではあるが)正確な結果を印刷しなければならない。しかし、私がまだEPSILON比較を使用している場合、結果は強制的にゼロになります。

私の質問は次のとおりです。ゼロと非常に小さい数値のチェックはどうすればできますか?

+0

プロジェクトで浮動小数点演算が厳密な要件を使用していますか、代替算術実装を検討していますか? – ApproachingDarknessFish

+0

私は文字列の操作やGMPのようなライブラリを使うと考えています。 – Chirality

答えて

5

これは、バイナリ浮動小数点データ型を使用する場合、本質的に不可能です。

数値精度と丸めを正確に制御したい場合は、たとえばGNU Multiprecision (GMP)またはBoost.Multiprecisionなどの10進数ライブラリを使用する必要があります。

+0

はい、ありがとうございます。私はGMPを試してみるべきだと思います。私はそれを以前使用していません。ありがとうございました。 –

0

あなたがそれに出くわしていない場合は、this pageは基本的に浮動小数点比較の最後の単語です。

しかし、あなたの問題は、オペランドと実行された操作に基づいて、どのような精度が必要であるかを知ることにあると思います。オペランド間の最大のULPから判断できます。オペランドの間に大きなULPがある場合は、より正確な回答を表示する必要があります(浮動小数点で使用可能な精度まで表現できます)。これらの行に沿って何かを実験する価値があります。

2

あなたは、0.3-0.2-0.1は0ではなく1E-19であると言いました。浮動小数点(0.3)浮動小数点(0.2)浮動小数点(0.1)浮動小数点浮動小数点浮動小数点数浮動小数点数浮動小数点演算がオペランドエラーまたは実際には小さい数に起因する後に取得します。

0

コードがdouble(バイナリFP)またはベース2の高精度なライブラリを使用する場合、確かに関数電卓にかかわらず1.0 - 7*(1.0/7.0)ような式で、この問題に実行され、10

は、10進浮動小数点ライブラリを使用しますを最小化する小数点の入力で丸め誤差の問題が発生するのは、0.1, 0.2, 0.3です。

"結果(0.0)を印刷したいので、私はEPSILONを使ってゼロと比較します。" FP番号が対数分布を持つので失敗します。

注意:ユーザーがの形式を制御して、の出力を表示できるようにします。本質的に、これによりユーザはEPSILONを設定することができます。例えば。 "%.17f"0.3 - 0.2 - 0.1はゼロになります。

+0

"ユーザーがフォーマットを制御できるようにする"という結果は、計算機が「精度が悪い」ことがわかっているという事実を結果としてもたらします。 T.T –

+0

@guan boshen "poor"という精度は、数値(テキスト "0.1")を 'double'のように正確に表現できない内部の数値に変換するために浮動小数点(任意のベースで)を使用することに起因します。それが問題の原因です。コーディングの目標に応じて、さまざまなソリューションがあります - いくつかは確かに他のものより容易/移植性があります。コードが基数10の浮動小数点を使用していても、1)テキスト入力の精度が内部表現を超え、2)結果が有限表現「1.0/7.0」でない場合に同じ問題が発生します。ユーザーは__still__計算機が「精度が悪い」ことを知ることができます – chux

+0

はい、GMPについてよく知っていますか? GMPでは、「有意数字」の正確な数を指定できますか?たとえば、1.23456789E-19には9桁の有効数字があります。 –

関連する問題