-2

基本的な浮動小数点精度の問題に苦しんでいます。問題は次のとおりです。

double d = 0.1;
d += 0.1;
d += 0.1;

d == 0.3 ? std::cout << "yes" : std::cout << "no";

コードを実行すると、「いいえ」が返されます

C/C++ は値をバイナリで格納し、バイナリ ストレージはすべての値を正確に格納できないことを理解しています。また、これらの小さなエラーは、さまざまな数学演算 (つまり、d += 0.1;) を実行するにつれて悪化することも理解しています。

私の質問は、d == 0.3 かどうかをテストする必要があるかどうかです (上記のコードの明確な意図と同様に、妥当な精度で..)...どうすればよいですか? 答えがそうでないことを願っています:

if (d > 0.2999 && d < 0.3001) ...

また..これは動作します

float f = 0.1;
f += 0.1;
f += 0.1;

f == 0.3f ? std::cout << "yes" : std::cout << "no";

しかし、言語に相当する「0.3d」は見つかりません。

ありがとう

4

3 に答える 3

2

おそらく、 と の差を非常に小さい数値と比較する必要がありdます0.3f

あなたは試すことができます:

 float epsilon = 1e-5;
 if (fabs(d - 0.3f) < epsilon)
 {
     std::cout << "yes" ;
 }
 else{
     std::cout << "no " ;
 }
于 2013-05-16T13:39:29.653 に答える