浮点数的二元相等比较是否正确?

Zol*_*nda 29 c++ floating-point std

我正在研究不同的内存块操作函数,在基准测试中我注意到,我的实现IsEqualRange(double* begin1, double* end1, double* begin2, double* end2)速度比std::equals(...)MSVC和GCC 快得多.进一步的调查表明,双打和浮标不是比较的memcmp,而是一个接一个的for循环.

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

Bat*_*eba 50

如果我是你,我会做的第一件事就是检查你的优化设置.

可以memcmp用于浮点数组,但请注意,您可以逐个元素获得不同的结果==.特别是对于IEEE754浮点:

  1. +0.0定义为比较等于-0.0.

  2. 定义NaN比较不等于NaN.

  • 还要注意,从技术上讲,C和C++标准不需要使用IEEE 754来实现`float`和`double`.当然,大多数"合理的"(现代)平台都会在实践中这样做.但是如果您不确定IEEE 754是否正在使用,那么您几乎不能保证`==`运算符将如何对任意位模式起作用.例如,"怪异"架构可以决定`((float)0x00000000)==((float)0x12345678),但`memcmp`显然会认为这些字节不同. (3认同)

Mat*_*her 14

主要问题是nan价值观,因为它们永远不会与自己相等.还有两个0(+0-0)的表示相等但不是二进制相等.

严格来说,你不能使用memcmp它们,因为答案在数学上是不正确的.

如果您知道自己没有nan0有价值,那么您可以使用memcmp.

  • 零在IEEE-754二进制浮点中有两个表示,表示为-0和+0.它们代表相同的数学值,应该报告为相等,`==`但``memcmp`却没有. (5认同)