如何在双variables中检查inf(和|或)NaN

考虑下面的代码:

#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是否代表双variables? 对于这个问题,任何variables?
  3. 当我将d1,d2,dRes的数据types更改为int并传递0和0时,出现Floating exception 。 有什么不同?
  4. 如何检查variables的值是否等于inf

Solutions Collecting From Web of "如何在双variables中检查inf(和|或)NaN"

  1. double应该使用%lf来读取,而不是%f%f将输入转换为32位float ,所以变量的前32位将填充一些无效数据,最后32位将被保留为垃圾。

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

  3. 整数类型没有NaN或无穷大。 整数除以零将导致异常(SIGFPE) 。

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