我正在使用不同的内存块操作功能,在基准测试期间,我注意到IsEqualRange(double* begin1, double* end1, double* begin2, double* end2)
的实现比在MSVC和GCC上的std::equals(...)
快得多。进一步的研究表明,memcmp
不会对double和float进行阻塞,而是在for循环中逐一进行。
在什么情况下浮点数的二进制比较会导致错误的结果?什么时候可以对浮点数/双精度数进行二进制比较(相等)数组?还有其他我不应该使用memcmp
的基本类型吗?
答案 0 :(得分:50)
如果我是我,第一件事就是检查您的优化设置。
可以将memcmp
用于浮点数组,但是请注意,与逐个元素==
可能会得到不同的结果。特别是对于IEEE754浮点:
+0.0被定义为等于-0.0。
NaN被定义为不等于NaN。
答案 1 :(得分:14)
主要问题是nan
值,因为它们永远不会等于自己。还有两种表示形式为0(+0
和-0
)是相等的,但不是二进制相等。
严格来说,您不能为他们使用memcmp
,因为答案在数学上是错误的。
如果您知道自己没有nan
或0
值,则可以使用memcmp
。
答案 2 :(得分:-6)
对于许多实际应用,二进制比较的工作精度很高。例如,在javascript中,0.2 / 10.0!= 0.1 * 0.2如果您有两个变量都以非常非常小的舍入错误结尾,则尽管表示“相同”数字,它们也不相等。