gpt4 book ai didi

具有双重比较的 C++ 奇怪行为

转载 作者:可可西里 更新时间:2023-11-01 16:15:25 24 4
gpt4 key购买 nike

我正在为我的应用程序开发单元测试,但我遇到了一个我不明白的奇怪问题。

代码是:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp);

我正在使用 gcc(主机 64 位)从 Linux 机器(主机 64 位)为 Linux 64 位编译,并使用 Linux 的 mingw32 编译器为 Windows 32 位进行交叉编译。

在调试和 Release模式下,Linux 编译程序运行良好(断言成功)。对于 Windows 版本,它在 debug 版本中工作正常,但在 release 版本中却不行;断言失败。

奇怪的是,如果我插入一条轨迹,测试在 Windows 中有效:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
printf("test");
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp); // Is TRUE when printf("test") is present, FALSE otherwise

我迷路了,我真的不明白发生了什么。为什么 printf 让它起作用?

感谢您的帮助。

最佳答案

printf 将使其工作,因为 float 将从内部 FPU 80 位表示(假设 x86“旧式”数学)转换为以 double 形式保存的 64 位。

这样做的原因是当您调用另一个函数时必须将寄存器值移动到堆栈(同样,假设 x86 旧式 FPU 调用约定),这将导致它被四舍五入到 64 位精度。

您的其他编译很可能有效,因为它们使用的是 SSE2+ 数学,它具有 native 64 位浮点类型。

== 测试 float 是否相同,这对于 float 来说几乎从来都不是正确的做法。

在这种情况下,它不是因为内部 CPU 表示与存储在 double 中的不同。

比较 float 时,始终检查它们是否足够接近而不是相等。

#include <math.h>

QVERIFY( fabs(res-tmp) < DBL_EPSILON )

关于具有双重比较的 C++ 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22152349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com