NaN可能有许多不同的二进制表示,通常可用于提供有关NaN导致的更多信息。格式为x111 1111 1xxx xxxx xxxx xxxx xxxx xxxx
的任何IEEE 32位浮点数均为NaN。此外,2个NaN(可能不同的二进制值)之间的任何比较评估为假。
所以给了两个花车:
float a = NaN1;
float b = NaN2;
两者都是NaN,但上面的x
位可能有不同的值,比较二进制内容的最正确方法是什么(即检查它们是否相同 type NAN)?
对我来说最明显的方法是执行c样式转换,例如:*(uint32_t*)&a == *(uint32_t*)&b
但是,浮点数的大小不保证为32位。
答案 0 :(得分:5)
我猜第二个最明显的是使用memcmp()
,这是比较两个内存位的标准函数:
const bool equal = memcmp(&a, &b, sizeof a) == 0;
另外,正如评论中所建议的那样,验证尺寸是否相同是一个好主意:
const bool equal = (sizeof a == sizeof b) && (memcmp(&a, &b, sizeof a) == 0);
我不确定使用static_assert()
是否胜利,但我也不是C ++ 11专家。