gpt4 book ai didi

c++ - AlmostEqual2sComplement 实现不处理退化的情况

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:17 26 4
gpt4 key购买 nike

我按照 Bruce Dawson 的建议实现了 AlmostEqual2sComplement , 但用于比较 double 值而不是浮点值。

类似的实现可以在很多地方找到。

bool AlmostEqual2sComplement(double A, double B, int maxUlps= 10)
{
// Make sure maxUlps is non-negative and small enough that the
// default NAN won't compare as equal to anything.
// assert maxUlps > 0 && maxUlps < 4 * 1024 * 1024;

long long aInt = *(long long*)&A;
// Make aInt lexicographically ordered as a twos-complement int
if (aInt < 0)
aInt = 0x8000000000000000 - aInt;

// Make bInt lexicographically ordered as a twos-complement int
long long bInt = *(long long*)&B;
if (bInt < 0)
bInt = 0x8000000000000000 - bInt;

long long intDiff = aInt - bInt;
if (intDiff < 0)
intDiff= intDiff*-1;

if (intDiff <= maxUlps)
return true;
return false;
}

不幸的是,当比较 double 值 -1.0 和 4.0 时,函数返回 true。这是因为在这种情况下 intDiff 结果等于 0x8000000000000000 并且0x8000000000000000 的绝对值又是 0x8000000000000000

我目前对这个问题的解决方案不是取 intDiff 的绝对值,而是将 intDiff 和 maxUlps 的比较更改为:

if (intDiff <= maxUlps && -maxUlps <= intDiff)
return true;

肯定有更多(也许不是那么明显)intDiff 导致 0x8000000000000000 的情况。

我想知道 AlmostEqual2sComplement 的其他实现是否只是没有意识到这个问题,或者我在最初的实现中是否犯了错误?

最佳答案

在这里http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition是更正后的版本,其中额外检查两个 float 是否具有相反的符号。

关于c++ - AlmostEqual2sComplement 实现不处理退化的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420528/

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