gpt4 book ai didi

c++ - 比较运算符的数值精度

转载 作者:太空狗 更新时间:2023-10-29 20:21:03 25 4
gpt4 key购买 nike

简短的问题:比较运算符的行为是否以最大精度定义?意思是,如果我有两个精确度相同的数字(x 和 y),当我做 x < y 时,我是否应该总是期待相同的答案?

我意识到这似乎是一个愚蠢的问题,但让我详细说明一下。我正在使用 double 并且我有一组数字,例如:

0:  62536.5477752959
1: 62536.4840613718
2: 62536.4576412381
3: 62522.8487197062
4: 62536.5473896233
5: 62536.5467941254
6: 62527.3508907998
7: 62536.5477752959
8: 62517.5900098039
9: 62536.5477752959

请注意条目 0、7 和 9 具有相同的值。

当我这样做时(像这样):

int low = 0, high = 0;
for(int i = 0; i < N; ++i) {
if(x[i] < x[low])
low = i;
if(x[i] > x[high])
high = i;
}
cout << "low: " << low << " high: " << high << endl;

我有时得到:low: 8 high: 0,有时:low: 8 high: 7我本来期望总是最低的索引值。

有什么想法吗?

[编辑缺失的大括号。]

最佳答案

是的,假设您的浮点类型为 IEEE754。任意两个doublexy说的是 x < y 中的一个, x == y , 或 x > y成立,除了一些边缘情况,如 +Inf、-Inf 或 NaN。

当您使用十进制表示法表示浮点值时,混淆开始出现;例如没有这样的double作为 62536.5477752959(或您列表中的任何其他人)。

您提供的数字已被调试器/标准输出器截断,它们不是您提供的实际算法中使用的数字。请放心,相同的十进制数总是产生相同的double。 ,这里没有任意选择:IEEE754 要求最接近的 double被选中。

如需进一步阅读,请参阅 Is floating point math broken?

最后,替换int iint i = 0 .目前您的程序的行为是未定义

关于c++ - 比较运算符的数值精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46283465/

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