"==" in C++ 为相同的双打提供_有时_不同的结果
"==" in C++ gives _sometimes_ different results for the same doubles
以下是代码:
#define MIN_RESOLUTION ( 0.0000001)
double yMax, yMin;
// calculate yMax, yMin
//....
if( fabs( yMax - yMin) > MIN_RESOLUTION)
{
scaleMin = yMin;
scaleMax = yMax;
}
else
{
// following two lines are executing
scaleMin = yMin - 1.0;
scaleMax = yMax + 1.0;
// could still be the same...
if(scaleMin == scaleMax)
{
if(scaleMax > 0) // decrease min
scaleMin = 0;
else // increase max
scaleMax = 0;
}
}
assert(scaleMin != scaleMax);
在我的示例yMin == yMax == 1.6170737412027187 e17
。正因为如此,第14行和第15行始终执行:
scaleMin = yMin - 1.0;
scaleMax = yMax + 1.0;
我知道双精度是有限的(15位),加/减1的运算对这么大的数字没有多大意义。但我希望"=="运算总是给出"true"作为结果。事实并非如此。
有时,第18行中的两个双精度不相等(scaleMin=scaleMax),并且几行之后它们相等(即,触发第27行中的断言)。数字完全相同(1.6170737412027187 e17)
我也试着用这个替换第(27)行:
if (scaleMin == scaleMax)
{
assert(false);
}
行为仍然是一样的。有什么想法吗?
请记住,浮点值在寄存器中的表示不一定与内存中的表示相同。
例如,在x86上,默认情况下(尽管您可以更改此设置),FPU寄存器对尾数为80位的值执行计算,当IEEE加倍时,这些值存储在内存中时,尾数将被截断为53位。
因此,在优化的代码中,由于潜在的不相关代码需要寄存器或其他不受您控制的原因,当值被刷新到内存时,C行之间的值完全有可能出现轻微变化。
正因为如此,您通常不能将==用于示例代码之类的目的。
不能对浮点和双精度使用精确相等检查。
即使在这样的情况下:
float a = calculate_sin_in_0();
float b = calculate_cos_in_pi_2();
由于机器的工作方式,a和b的值可能略有不同
要正确执行这样的检查,您必须将一些小值视为无关紧要:
const float eps = 0.00001;
if (abs(a - b) < eps) { // consider a == b
// ...
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- "==" in C++ 为相同的双打提供_有时_不同的结果
- 我尝试用c ++编写一个bmp文件,但是bmp文件的宽度和高度似乎会影响结果,有时我得到一个坏的bmp文件