Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较不';t与<;=操作人员 我有以下C++代码: float test(0.2); cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;_C++_C++11_Floating Point - Fatal编程技术网

比较不';t与<;=操作人员 我有以下C++代码: float test(0.2); cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;

比较不';t与<;=操作人员 我有以下C++代码: float test(0.2); cout << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;,c++,c++11,floating-point,C++,C++11,Floating Point,但问题是我应该有这样的输出: 2 false 2 true 我怎样才能纠正这个问题 错误在哪里 这是一个舍入误差。1.8和0.2都不能以二进制浮点格式精确表示,因此使用的实际值略有不同。这意味着最终结果可能不完全是2;但是将其流式传输到cout会将其四舍五入到小数点后几位,然后打印2 通过更精确地打印,您可以自己看到这一点: cout << setprecision(20) << 1.8 + test << " " << boolalpha &

但问题是我应该有这样的输出:

2 false
2 true
我怎样才能纠正这个问题

错误在哪里

这是一个舍入误差。
1.8
0.2
都不能以二进制浮点格式精确表示,因此使用的实际值略有不同。这意味着最终结果可能不完全是2;但是将其流式传输到
cout
会将其四舍五入到小数点后几位,然后打印
2

通过更精确地打印,您可以自己看到这一点:

cout << setprecision(20) << 1.8 + test << " " << boolalpha << (1.8 + test <= 2) << endl;

// Output: 2.0000000029802320611 false

cout解决浮点运算相关问题的一种方法是使用阈值而不是原始值来比较相等性

也就是说,而不是像

double a = // some value
double b = // another value

if (a == b)
    // ...
您可以执行以下操作

if (abs(a - b) <= 1e-5)
    // ...

if(abs(a-b)错误是浮点运算。@chris Ok。我该如何纠正这个问题呢?小心
double
升级(例如
1.8F+test!=1.8+test
)和浮点数字,这不是十进制arithmetic@LucasWillems设置相等的阈值怎么样?
隐式转换为
double
也没有帮助
if (abs(a - b) <= 1e-5)
    // ...