双精度浮点比较

Kir*_*ril 8 c++ floating-point double comparison leveldb

我在这里有点困惑 - 当双打存储为不透明(二进制)字段时,双打的比较仍能正常工作吗?我面临的问题是双重包括符号的前导位(即正或负),当它们存储为二进制数据时,我不确定它是否会被正确比较:

在此输入图像描述

我想确保比较正常,因为我在LevelDB中使用double作为关键元组的一部分(例如),我想保留正数和负数的数据局部性.LevelDB仅使用不透明字段作为键,但它允许用户指定他/她自己的比较器.但是,我只是想确保我没有指定比较器,除非我绝对需要:

// Three-way comparison function:
//   if a < b: negative result
//   if a > b: positive result
//   else: zero result
inline int Compare(const unsigned char* a, const unsigned char* b) const 
{
    if (*(double*)a < *(double*)b) return -1;
    if (*(double*)a > *(double*)b) return +1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Mys*_*ial 3

让我的评论成为答案。

有两件事可能会出错:

  1. 如果其中一个(或两个)参数为NAN,则比较将始终返回 false。所以即使二进制表示相同,NAN == NAN也总是错误的。此外,它违反了比较传递性。

  2. 如果任一参数未正确对齐(因为它们是字符指针),则可能会在不支持未对齐内存访问的计算机上遇到问题。对于那些这样做的人来说,您可能会遇到性能下降。

因此,为了解决这个问题,您需要添加一个陷阱案例,如果任一参数结果为 ,则将调用该陷阱案例NAN。(我不确定 的状态INF。)

由于需要这种陷阱情况,您将需要定义自己的比较运算符。