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 为 false。
但我将类型更改为 void* 并且我认为编译器不知道a
是一个浮点数。
对于 IEEE 754 二进制浮点,有两种重要情况,逐位相等比较会产生与浮点相等比较不同的结果。
第一个,可能也是最重要的一个是零。 IEEE 754 具有正零和负零的表示形式。它们在浮点比较中比较相等,但在按位比较中比较不相等。
第二个是 NaN,涉及 NaN 的比较,甚至与另一个相同的 NaN 相等也总是错误的,但在按位比较下,两个相同的 NaN 会比较相同。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)