【发布时间】:2014-03-07 19:57:49
【问题描述】:
据我了解,NaN 由双精度表示的指数部分中的全 1 和非零分数表示。 (来自here的信息)
使用以下方法测试 NaN 是否安全:
double num = 1.0;
// Do something to make num NaN
double* pointer = #
unsigned long long num2 = *((unsigned long long*)pointer);
if((unsigned long long)num2 == 0x7FF8000000000001)
{
// Got a NaN
}
我希望 0x7FF8000000000001 是正确的测试。
由于小数必须为非零才能表示 NaN,所以我猜双精度表示的小数部分可以是任何东西,因此可能需要更复杂的测试,将小数部分转换为 1,如显示在数字 0x7FF8000000000001 中。 (注意末尾的 1,在小数部分。)
那么,这样的东西可以安全使用吗?
编辑:正如迈克所说,在示例中我应该使用指针来获取位,我现在将进行此更改...
【问题讨论】:
-
有不同种类的 NAN,还有 std::isnan...
-
该演员进行了数字转换;您需要转换引用或指针以将
double的位重新解释为整数类型。正如您所说,您需要测试该分数是否非零,不等于 1。std::isnan将正确且可移植地测试 NaN;我就用那个。 -
Mike 提到的重要部分是
std::isnan的使用。我没有理由不使用它。 -
是的,在 C++ 中使用
std::isnan( ),在 C 中使用isnan( )。
标签: c++ c floating-point double nan