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

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

unw*_*ind 5

我想第二个最明显的是使用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专家.