将float与特定NAN值进行比较的最正确方法是什么?

时间:2014-10-01 07:40:45

标签: c++ floating-point equality ieee-754

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位。

1 个答案:

答案 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专家。