[解決済み】ε(イプシロン)を使って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より大きい最小の値ですか?それとも
0
と
0 + 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%にあたる...。
関連
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] C#でDecimalをDoubleに変換する方法は?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】coutはstdのメンバではない
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】'cout'は型名ではない
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む