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

What is the most correct way to compare float to a specific NAN value?

本文关键字:比较 是什么 方法 NAN      更新时间:2023-10-16

NaN可能有许多不同的二进制表示,这些表示通常可用于提供有关NaN原因的更多信息。x111 1111 1xxx xxxx xxxx xxxx xxxx xxxx格式的任何IEEE 32位浮点都是NaN。此外,2个NaN(可能具有不同的二进制值)之间的任何比较结果都将为false。

因此,给定两个浮动:

float a = NaN1;
float b = NaN2;

两者都是NaN,但上面的x位可能有不同的值,比较它们的二进制内容的最正确方法是什么(即检查它们是否是NaN的相同类型)?

对我来说,最明显的方法是执行c样式的强制转换,如:*(uint32_t*)&a == *(uint32_t*)&b但是,浮点的大小不能保证为32位。

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