浮点数的二进制相等比较是否正确
Is binary equality comparison of floats correct?
我正在研究不同的内存块操作函数,在基准测试期间,我注意到我对IsEqualRange(double* begin1, double* end1, double* begin2, double* end2)
的实现比MSVC和GCC上的std::equals(...)
要快得多。进一步的研究表明,双精度和浮点数不是memcmp
的块,而是在一个一个接一个的for循环中。
在什么情况下,浮点数的二进制比较会导致不正确的结果?什么时候可以对浮点数/双精度数组进行二进制比较(相等)数组?还有其他我不应该使用memcmp
的基本类型吗?
如果我是你,我要做的第一件事就是检查你的优化设置。
对浮点数组使用 memcmp
是可以的,但请注意,您可以逐个元素==
获得不同的结果。特别是,对于IEEE754浮点:
+0.0 定义为比较等于 -0.0。
NaN 被定义为比较不等于 NaN。
主要问题是nan
值,因为它们永远不会等于它们自己。0(+0
和-0
)也有两种表示形式相等但不等于二进制。
所以严格来说,你不能对它们使用memcmp
,因为答案在数学上是不正确的。
如果您知道自己没有nan
或0
值,则可以使用 memcmp
。
二进制比较对于许多实际应用程序来说精度太高。 例如,在javascript中,0.2/10.0 != 0.1 * 0.2 如果你有两个变量,它们最终都以非常非常轻微的舍入误差结束,尽管表示"相同"的数字,但它们将不相等。
相关文章:
- std::less是否应该允许在编译时比较不相关的指针?
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 用户定义的结构是否有默认C++比较器?
- gcc 是否在 2 条短裤的过度对齐结构的比较中错过了优化机会?
- 这种比较是否不一致(或者存在其他问题)?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- 我如何比较这些不同的输出,看看它们是否相等
- C++中是否有任何常量可以用作比较中的最小值/最大值
- 函数指针的比较是否合法
- 是否有任何统一的方法可以在 c++ 中创建自定义比较器?
- C++是否保证标准容器比较中操作数的顺序?
- C++中的结构是否按顺序分配内存?每次都以某种方式获得指针比较的正确答案
- C 是否具有对两个STD :: sets,vectors等进行三角比较的标准方法
- 比较BGR图像是否完全相同
- qsort C++是否曾经将元素与自身进行比较?
- 是否可以将两个任意函数与 C++17 中的 std::any 进行比较
- 是否可以比较两个函子的相等性
- 将无符号的 int 与 std::string::size_type 进行比较是否安全
- 三向比较运算符是否始终有效