1. ホーム
  2. c++

[解決済み】ε(イプシロン)を使ってdoubleと0を比較する

2022-04-16 03:29:30

質問

今日、(他の人が書いた)いくつかのC++のコードを見ていたら、このセクションを見つけました。

double someValue = ...
if (someValue <  std::numeric_limits<double>::epsilon() && 
    someValue > -std::numeric_limits<double>::epsilon()) {
  someValue = 0.0;
}

これが意味を持つのかどうか、考えているところです。

のドキュメントでは epsilon() と書いてあります。

この関数は、1と、1より大きい値で[double]で表現できる最小の値との差を返します。

これは0にも適用されるのでしょうか、つまり epsilon() は0より大きい最小の値ですか?それとも 00 + epsilon で表すことができるもの。 double ?

そうでない場合、比較対象は以下と同等ではないでしょうか? someValue == 0.0 ?

解決方法は?

64ビットのIEEEダブルと仮定すると、仮数は52ビット、指数は11ビットとなります。これをビットに分解してみましょう。

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^0 = 1

1より大きい表現可能な最小の数。

1.0000 00000000 00000000 00000000 00000000 00000000 00000001 × 2^0 = 1 + 2^-52

したがって

epsilon = (1 + 2^-52) - 1 = 2^-52

0とεの間の数字はあるのか?たくさん... 例えば、最小の正の表現可能な(普通の)数です。

1.0000 00000000 00000000 00000000 00000000 00000000 00000000 × 2^-1022 = 2^-1022

実際には (1022 - 52 + 1)×2^52 = 4372995238176751616 0からεまでの数、これは表現可能な正の数の47%にあたる...。