浮点数的二进制相等比较正确吗?

时间:2019-01-03 10:46:03

标签: c++ floating-point std

我正在使用不同的内存块操作功能,在基准测试期间,我注意到IsEqualRange(double* begin1, double* end1, double* begin2, double* end2)的实现比在MSVC和GCC上的std::equals(...)快得多。进一步的研究表明,memcmp不会对double和float进行阻塞,而是在for循环中逐一进行。

在什么情况下浮点数的二进制比较会导致错误的结果?什么时候可以对浮点数/双精度数进行二进制比较(相等)数组?还有其他我不应该使用memcmp的基本类型吗?

3 个答案:

答案 0 :(得分:50)

如果我是我,第一件事就是检查您的优化设置。

可以将memcmp用于浮点数组,但是请注意,与逐个元素==可能会得到不同的结果。特别是对于IEEE754浮点:

  1. +0.0被定义为等于-0.0。

  2. NaN被定义为不等于NaN。

答案 1 :(得分:14)

主要问题是nan值,因为它们永远不会等于自己。还有两种表示形式为0(+0-0)是相等的,但不是二进制相等。

严格来说,您不能为他们使用memcmp,因为答案在数学上是错误的。

如果您知道自己没有nan0值,则可以使用memcmp

答案 2 :(得分:-6)

对于许多实际应用,二进制比较的工作精度很高。例如,在javascript中,0.2 / 10.0!= 0.1 * 0.2如果您有两个变量都以非常非常小的舍入错误结尾,则尽管表示“相同”数字,它们也不相等。