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)
让我的评论成为答案。
有两件事可能会出错:
如果其中一个(或两个)参数为NAN,则比较将始终返回 false。所以即使二进制表示相同,NAN == NAN也总是错误的。此外,它违反了比较传递性。
如果任一参数未正确对齐(因为它们是字符指针),则可能会在不支持未对齐内存访问的计算机上遇到问题。对于那些这样做的人来说,您可能会遇到性能下降。
因此,为了解决这个问题,您需要添加一个陷阱案例,如果任一参数结果为 ,则将调用该陷阱案例NAN。(我不确定 的状态INF。)
由于需要这种陷阱情况,您将需要定义自己的比较运算符。