请考虑以下代码:
#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";
}
几个问题:
dRes = inf
。但我期待dRes = NaN
或类似的东西。Floating exception
。有什么区别?inf
?答案 0 :(得分:27)
使用scanf()
double
时,应使用%lf
而不是%f
阅读。 %f
会将输入转换为32位float
,因此变量的前32位将填充一些无效数据,最后32位将保留为垃圾。
是。 #include <limits>
,then std::numeric_limits<double>::quiet_NaN()
。一些编译器(例如gcc)也提供NAN
macro in <cmath>
。
整数类型没有NaN或无穷大。整数除以零会导致an exception (SIGFPE)。
#include <cmath>
,然后std::isinf(x)
。使用std::isfinite(x)
确保x
不是NaN或无限。
答案 1 :(得分:0)
函数fpclassify
将允许您检查所有特殊情况的浮点值。
在<math.h>
中可以找到自C99以来的宏,在<cmath>
中作为一系列函数在float
,double
和long 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)