よくdouble同士の==
による比較は危険だと言われます。実際,二進数で表せないような小数はどうしても切り捨てによる誤差が生まれる,ということは分かります。
そこに小数を(double型の)整数で返すようなfloor
やceil
といった関数があります。整数はdouble型で確かにきっかり表せると思いますが,僅かにゴミの残ったほとんど整数,のような値が返ることはないのでしょうか。そうだとすると,このような関数が返すような整数値は==
で比較してもよいのでしょうか。(ただし,関数に渡す値にINFやNaNや非正規化数などの変な入力はないとします。)
一応,例えば次のようなプログラムを書いてみて,自分の環境ではこれが1
を表示したはしたのですが
cpp
1double x = floor(2.1); 2std::cout << (x == 2.) << std::endl;
自分の環境では次のプログラムも同様に1
を表示するので,誤差が現れていないだけなのか,存在しないのか,2.1という数字が都合良かっただけなのか,自分には分かりません・・・。
cpp
1double x = 0.5; 2double y = 0; 3for (int i = 0; i < 5; i++) { 4 y += 0.1; 5} 6std::cout << (x == y) << std::endl;
お力をお貸しください。
環境
sh
1$ clang++ --version 2clang version 4.0.0 (tags/RELEASE_400/final) 3Target: x86_64-unknown-linux-gnu 4Thread model: posix 5InstalledDir: /usr/bin

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/01 15:55
2017/07/01 16:30
2017/07/06 13:51