如何在double变量中检查inf(和|或)NaN

时间:2010-11-04 09:35:39

标签: c++ linux floating-point g++

请考虑以下代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

template<class T>
bool IsNaN(T t)
{
    return t != t;
}

int main(int argc, char**argv)
{
    double d1, d2;
    sscanf(argv[1], "%f", &d1);
    sscanf(argv[2], "%f", &d2);

    double dRes = d1/d2;

    cout << "dRes = " << dRes << "\n";

    if(IsNaN(dRes))
        cout << "Is NaN\n";
    else
        cout << "Not NaN\n";

}

几个问题:

  1. 当我将0和0作为参数传递时,它输出dRes = inf。但我期待dRes = NaN或类似的东西。
  2. NaN在双变量中是否可表示?就此而言,任何变量?
  3. 当我将d1,d2,dRes的数据类型更改为int并传递0和0时,我得到了Floating exception。有什么区别?
  4. 如何检查变量的值是否等于inf

3 个答案:

答案 0 :(得分:27)

  1. 使用scanf() double时,应使用%lf而不是%f阅读。 %f会将输入转换为32位float,因此变量的前32位将填充一些无效数据,最后32位将保留为垃圾。

  2. 是。 #include <limits>then std::numeric_limits<double>::quiet_NaN()。一些编译器(例如gcc)也提供NAN macro in <cmath>

  3. 整数类型没有NaN或无穷大。整数除以零会导致an exception (SIGFPE)

  4. #include <cmath>,然后std::isinf(x)。使用std::isfinite(x)确保x不是NaN或无限。

答案 1 :(得分:0)

函数fpclassify将允许您检查所有特殊情况的浮点值。

<math.h>中可以找到自C99以来的宏,在<cmath>中作为一系列函数在floatdoublelong double下找到自C ++ 11以来重载的名称std::fpclassify

cppreference有a nice example

答案 2 :(得分:-1)

就这样做:

if (dRes  == +1.0/0.0 || dRes  == -1.0/0.0) ... //+INF, -INF
if (dRes  == +0.0/0.0 ) ... //+NaN; i.e. pow(2.0 ,16384.0)