Consider the following code:
#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";
}
Couple of questions:
- When I pass 0 and 0 as arguments, it outputs
dRes = inf. But I was expectingdRes = NaNor something like that. - Is NaN representable in double variables? For that matter, any variable?
- When I changed the data type of d1,d2,dRes to int and passed 0 and 0, I got a
Floating exception. What is the difference? - How to check if a variable’s value is equal to
inf?
When using
scanf()doubleshould be read using%lf, not%f.%fwill convert the input into a 32-bitfloat, so the first 32 bits of your variables will be filled with some invalid data, and the last 32 bits will be left as garbage.Yes.
#include <limits>, thenstd::numeric_limits<double>::quiet_NaN(). Some compilers (e.g. gcc) also provides theNANmacro in<cmath>.There is no NaN or infinity for integer types. Divide-by-zero for integer will cause an exception (SIGFPE).
#include <cmath>, thenstd::isinf(x). Usestd::isfinite(x)to ensurexis not NaN or Infinity.