将浮点值与特定NAN值进行比较的最正确方法是什么
What is the most correct way to compare float to a specific NAN value?
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专家。
相关文章:
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?
- 比较两个节点坐标的最佳方法是什么?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 在查找子集中元素和元素数量之间的二进制比较背后的逻辑是什么?
- 比较操作员对字符串的含义是什么?
- 比较UINTPTR_T和指针类型的最佳方法是什么?
- 将多个值与同一变量进行比较时'!='运算符最简洁的方法是什么?
- 为同一类提供不同比较运算符的最佳策略是什么?
- 比较字符串大小写不区分的简单方法是什么?
- 比较阵列相似性的最佳比较算法是什么?
- 在客户端和远程服务器中比较文件列表的有效方法是什么?
- 比较运算符的行为是什么?
- 移动和键比较在 C++ 中是什么意思
- 双倍和NaN比较的结果是什么
- 将一个字符串与另一个字符串进行比较的最佳方法是什么
- 比较浮点数与零的标准方法是什么
- C++ 比较,结果是什么
- 条件语句在比较表达式时的基础是什么?
- 有符号/无符号比较警告是什么意思