为什么不能通过使用memcmp()函数来比较浮点类型?

bool floatcmp(const float a, const float b) { const void *p = (void*)&a; const void *q = (void*)&b; if (memcmp(p, q, sizeof(float)) == 0) return true; return false; } 

示例代码在上面,手册页说memcmp(x,y)==0并不意味着x==y和浮点类型通常有一个名为NaN(’不是数字’)的值,其属性为NaN = = NaN是假的。 但我将类型更改为void *,我认为编译器不知道a是浮点数。

它们可以通过memcmp()进行比较 – 但是,比较是逐字节比较,与这些字节的数字解释没有关系。 只要所有的值都是非特殊的(Inf / NaN等各种风格)并进行标准化,它应该是对完全相等的可靠测试,但不能保证这一点,也不能保证它更快比正常的精确等式测试a == b (顺便说一下,大多数小数的问题都不能在浮点中完全表示) – 所以两个应该相等的数字并不是通过浮动来表示的点近似。

编辑:顺便说一句,在我看来,排序可能是一个精确比较可能与浮点数相关的地方 – 如果你告诉qsort数字在’ 井中 ‘相等’ 他们的差异小于2e ‘意义,然后排序将使它们处于某种不确定的顺序,所以看起来完全相等测试给出的顺序应该与任何其他顺序一样好。