Comment vérifier inf (et | ou) NaN dans une variable de type double
Considérons le code suivant:
#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";
}
Quelques questions:
- Lorsque je passe de 0 et 0 comme arguments, il les sorties
dRes = inf
. Mais je m'attendais àdRes = NaN
ou quelque chose comme ça. - Est NaN représentable en double variables? De même que pour toute variable?
- Quand j'ai changé le type de données d1,d2,dRes d'int et de la passée de 0 et de 0, j'ai eu un
Floating exception
. Quelle est la différence? - Comment vérifier si la valeur d'une variable est égale à
inf
?
Vous devez vous connecter pour publier un commentaire.
Lors de l'utilisation de
scanf()
double
doit être lu à l'aide de%lf
, pas%f
.%f
va convertir l'entrée en 32 bitsfloat
, de sorte que les 32 premiers bits de vos variables sera remplie avec des données non valides, et les 32 derniers bits sera à gauche comme des ordures.Oui.
#include <limits>
, puisstd::numeric_limits<double>::quiet_NaN()
. Certains compilateurs (par exemple gcc) fournit également leNAN
macro<cmath>
.Il n'est pas NaN ou de l'infini pour les types d'entiers. Division par zéro pour entier sera la cause de une exception (SIGFPE).
#include <cmath>
, puisstd::isinf(x)
. Utilisationstd::isfinite(x)
pour assurerx
n'est pas NaN ou l'Infini.int
."%f"
poignées de double précision: cplusplus.com/reference/cstdio/printfprintf
. La question porte sur lesscanf
.La fonction
fpclassify
vous permettra d'inspecter une valeur à virgule flottante pour tous les cas particuliers.On en trouve dans
<math.h>
comme une macro depuis C99, et dans<cmath>
comme une famille de fonctions, pourfloat
,double
, etlong double
en vertu de la surcharge nomstd::fpclassify
depuis C++11.cppreference a un bel exemple
Juste le faire comme ça:
dRes
est un NaN, alors mêmedRes == dRes
est faux. Ce fait crée une nouvelle façon de vérifier NaN, mais cela signifie aussi que votre chèque est totalement rompu.