C 比较功能结果
c++ compare function result
我具有以下代码,这些代码表现出一些非常奇怪的行为。有人知道为什么吗?
#include <iostream>
long global = 20001;
double foo() {return global / 1000.0;}
int main(int,char**) {
if (foo() == foo()) {
std::cout << "truen";
} else {
std::cout << "falsen";
}
return 0;
}
这应该在函数每次返回相同的结果时打印true,而是打印false;
这是在Solaris 10上使用G 构建的。我不知道操作系统很重要,但是我没有机会在其他OS
OS可能无关紧要,但是编译器和编译器体系结构做。在英特尔上,通常的惯例是返回浮点寄存器中的浮点值64位精度(而不是双重的53位)。和当然,编译器将算术直接完成注册,因此您最终以64位返回值精度。
当然,当编译器生成代码调用函数时,它不能将值留在寄存器中,因为该功能可能使用该寄存器。因此,它将其溢出到内存。作为双重56位。==
操作员比较了此56位值第一次打电话给第二个位值,并发现他们不等。
我可能会补充说,如果编译器嵌入了功能,问题可能会消失。
根据标准,所有这些都是完全合法的。
可能的问题可能会始终无法评估到完全相同的值(本质上是四舍五入错误)。
如果要将功能更改为返回整数,则可能会有预期的行为。
与这个问题非常相似:涉及比较浮子
尝试以下操作:
#include <iostream>
#include <limits>
long global = 20001;
double epsilon = std::numeric_limits::epsilon<double>();
double foo() {return global / 1000.0;}
int main(int,char**) {
if (foo() - foo() > epsilon) {
std::cout << "truen";
} else {
std::cout << "falsen";
}
return 0;
}
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- valgrind-hellgrind与泄漏检查的结果不同
- 多态性和功能结合
- 用C++20 fmt限制结果的总大小
- 如何从主.cpp中的cpp文件中获取功能结果?
- 左移<<如何在不同的功能中给出不同的结果?
- STL:将功能应用于Adchacent_difference的结果,而无需额外的容器
- 检查数字在C 中未返回正确结果的功能
- 功能模板与Variadic模板过载:Intel C 编译器版本18产生的结果不同于其他编译器.英特尔是错误的
- 如何否定lambda功能结果
- 多功能阵列最后一行相同的结果
- 功能相同的代码,不同的结果
- 为什么我的功能(在二进制树上)打印出意外的结果
- 如何否定MEM_FN创建的功能指针的结果
- C 比较功能结果
- 如何打印添加功能的结果.
- 谁能告诉我为什么这些功能没有在合理的频谱中给我一个结果
- 地图的查找功能得到错误的结果
- 绕过虚拟模板功能以实现期望的结果