フロートを比較するとき、違いのしきい値を何と呼びますか?


10

私は現在Javaで浮動小数点数を比較しています。最も簡単な式は次のとおりです。

Math.abs(a - b) < THRESHOLD

差異のしきい値として変数に名前を付ける場合、デルタまたはイプシロンのどちらに名前を付ける必要がありますか?具体的には、浮動小数点数が表すことができる最小値の正しい項はどれですか。

プログラミング言語という用語は特定のものですか、それとも言語間で共通ですか?


1
代替用語:「精度」、「解像度」。私はこれらが正確に好きです;)彼らは過度に技術的に聞こえないので。
stakx 2013

1
トピック外:浮動小数点ガイドでは、このタイプのほぼ同等の比較を使用しないことを推奨ています。
stakx 2013

1
@stakx-提案する用語は正しくなく、OPが求めているものとは異なる意味を持っています。質問がはい、詳細な、それがされている外部基準に基づいて釈明し、それが浮動小数点値を扱うときのプログラミングに関連性を持っています。それは建設的で話題性があります。

1
@ GlenH7:質問が良いものではない、または答えられないということは決してありませんでした。実際、賛成したのは私です。そして、あなたが私が提案した(確かにそれほど正確ではない)用語が正しくないと主張しているので、なぜそうなのかを知りたいと思います。
stakx 2013

@stakx-投票に投票したことをお詫びします。現時点では、質問に対する4つの近い投票にもっと反応していました。

回答:


18

数学と工学のイプシロン

数学と工学一般では:

  • デルタは通常、差を表すために使用されます。
  • イプシロンは通常、無視できる量を指すために使用されます。

そしてイプシロンはあなたの場合により適切であるようです。


コンピュータサイエンスのイプシロン

特にコンピュータサイエンスでは、イプシロンという用語は、と厳密に大きい最小のフロートとの差を測定するマシンエスピロンも指します。後者の数値はJavaのフロート用であり、次のように計算できます。1.0f1.0f1.00000011920928955078125f

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

マシンのイプシロンの定義は、上記のイプシロンの一般的な使用と一致しています。


フロートの比較

ただし、フロートの「近接性」を比較する前に、フロートの規模を把握しておく必要があります。2つの非常に大きく、おそらく非常に異なるフロートは等しい場合があります。

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

そして逆に、マシンのイプシロンのみが異なる2つの小さなフロートの間には、多くの可能なフロート値(および数桁)がある可能性があります。以下の例では、smallとの間に10,000,000の使用可能なfloat値がありますfが、それらの差はまだマシンイプシロンをはるかに下回っています。

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

GlenH7の回答にリンクされた記事は、フロートの比較をさらに調査し、これらの問題を克服するためのいくつかのソリューションを提案しています。


2
-1:科学計算ソフトウェアでは、イプシロンはマシンイプシロンまたは相対イプシロンを指します(同じ記事を参照)。丸め誤差があるため、典型的には、これは、近似等価受付で使用したのと同じ量ではない倍数機械イプシロンまたは相対イプシロンの、典型的にはそれよりも大きな大きさのいくつかの順序。
rwong 2013

1
@rwongこれはepsilonという用語の特化の1つであり、他にもたくさんあります。一般的にエンジニアリングでは、イプシロンは少量またはエラーを指し、マシンイプシロンはそのアイデアと互換性があります。
アッシリアス2013

@assylias、標準的な定義を持つ名前を使用して、標準的な定義が意味のあるコンテキストで、標準的な定義に対応していないものは問題の領収書です。
AProgrammer 2013

@AProgrammerイプシロンの一般的な定義がコンピューティングに適用できないことに同意しません。
アサイリア2013

1
@assylias:説明をありがとう。-1を削除しました。
rwong 2013

16

数学では、デルタは値との差を表すために使用され、イプシロンは任意のエラー値を表すために使用されます。この場合、イプシロンが従来の名前になります。


8

質問に直接答えるには、用語を使用しepsilonます。より正確には、それはmachine epsilon一般的使用法は「機械」を落とし、ただ使用するだけepsilonです。

私のローカルコピーを見ると、次のfloat.hことがわかります。

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

そして関連するコメントは、イプシロンがあなたが言及している用語であることを明確にします。

しかし、それがepsilon正しい用語であることを確認するために、他の外部参照に依存することもできます。ここここここ、そして最後に、SOクエリタグのこの組み合わせを参照してください。引用するIEEE 754標準への直接参照を見つけることができませんでした。


あなたは尋ねませんでしたが、質問を明確にするために提供した例に非常に関連するこの参照を見つけました。

見てい浮動小数点値を比較した上で、弁のブルース・ドーソン、このブログの記事あなたが提案していることの比較を使用したくない理由として、いくつかの洞察力のために。

その記事にはかなりの情報が詰め込まれていますが、これはそこからの最も関連性の高い抜粋です。

フロートが等しいかどうかを比較することが悪い考えである場合、それらの違いが次のように、エラー範囲またはイプシロン値内にあるかどうかを確認するのはどうでしょうか。

bool isEqual = fabs(f1 – f2) <= epsilon;

この計算により、2つのフロートが等しいと見なすのに十分近い2つのフロートの概念を表すことができます。しかし、イプシロンにはどのような値を使用する必要がありますか?
上記の実験を考えると、合計で1.19e-7fの誤差を使用したくなるかもしれません。実際、float.hにはその正確な値の定義さえあり、FLT_EPSILONと呼ばれています。
明らかにそれだけです。ヘッダーファイルの神々が話しており、FLT_EPSILONは1つの真のイプシロンです!
それがゴミだということを除いて。1.0〜2.0の数値の場合、FLT_EPSILONは隣接するフロート間の差を表します。1.0より小さい数値の場合、FLT_EPSILONのイプシロンはすぐに大きくなりすぎます。十分に小さい数値では、FLT_EPSILONは比較している数値よりも大きくなる可能性があります。

ドーソンは、浮動小数点数を比較し、このような非常に小さな値を処理する際の複雑さに関する他の多くの考慮事項を検討しているので、彼の投稿の残りを読むことをお勧めします。


回答の最初の部分を明確にすることをお勧めします。Bruceの記事では、公差の比較に定数のイプシロン(ヘッダーファイルで定義されているイプシロンなど)を使用してはならない理由が既に説明されています。また、多くの場合、数百万のULPのエラーは心配する必要はありません。これは、ほとんどのアプリケーションでは、最下位桁のエラーよりも有効桁のほうが重要であるためです。必要以上の桁数。
rwong 2013

@rwong-私が読んだときの質問は、定数の名前に使用する正しい用語を特定することでした。だから、私はfloat.h参照を他のいくつかと一緒に提供して、イプシロンを機械加工しました。ドーソンの記事は、IEEE 754リファレンスを検索しているときに見つけたものでありsimplest formula、比較のためにOPに関連していると思いました。多くの人が最初の試みとしてそのアプローチを使用し、比較がどれほどトリッキーであるかについての微妙な違いに本当に入るので、私はドーソンの記事を含めました。だから私は質問に直接答えてみて、なぜそれをそのように使わないのかを指摘しました。

5

これはエラー関数です。絶対誤差は、通常呼ばれるε(イプシロン)またはΔは、xは、いくつかの量のためにX:

ε = |予想される-実際|

Δ X = | x 0x  |

相対誤差は、η(eta)と呼ばれることもあります。

η = | 1 −実際/予想|

プログラミングの目的でabsoluteErrorrelativeErrorまたは(またはそのいくつかの略語)は、より説明的です。エラーが特定の値より小さいと主張したい場合、その値は単にしきい値または許容範囲と呼ばれます。

見る:


3

私はそれを「寛容」と呼んでいます。

多分それは数学的に正しい用語ではないかもしれませんが、あなたが質問をするという単なる事実は、「デルタ」も「イプシロン」も使用するのに適した変数名ではないことを意味します。

私の経験では、実際にコードを読む人にとって意味のある識別子名を使用することをお勧めします。それが意味を理解するために読者がウィキペディアでそれを調べなければならないということを意味するならば、完全に正しい名前は何が良いのでしょうか?


+1。ここに投稿するだけでなく、人々がこれらの名前の質問について同僚に尋ねることを常に望んでいます。
MarkJ 2013

6
-1、慣習を避けるよりも学ぶほうがよい。
djechlin 2013

これは私がこの質問を投稿したのとまったく同じ理由です。
NobleUplift 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.