Pon*_*dle 0 c++ floating-point equality ieee-754
NaN可能具有许多不同的二进制表示,这通常可用于提供有关NaN导致的更多信息.任何IEEE 32位浮点格式x111 1111 1xxx xxxx xxxx xxxx xxxx xxxx为NaN.此外,2个NaN(可能不同的二进制值)之间的任何比较评估为假.
给两个花车:
float a = NaN1;
float b = NaN2;
Run Code Online (Sandbox Code Playgroud)
两者都是NaN,但x上面的位可能有不同的值,比较它们的二进制内容的最正确方法是什么(即检查它们是否是相同类型的NaN)?
对我来说最明显的方法是执行c样式转换,*(uint32_t*)&a == *(uint32_t*)&b 但是,浮点数的大小不能保证为32位.
我想第二个最明显的是使用memcmp(),这是比较两个内存位的标准函数:
const bool equal = memcmp(&a, &b, sizeof a) == 0;
Run Code Online (Sandbox Code Playgroud)
此外,正如评论中所建议的那样,验证大小是否相同是个好主意:
const bool equal = (sizeof a == sizeof b) && (memcmp(&a, &b, sizeof a) == 0);
Run Code Online (Sandbox Code Playgroud)
我不确定static_assert()在这里使用是否胜利,但我也不是C++ 11专家.