Y at-il une meilleure façon de vérifier si une valeur est plus grande que de type double?

StackOverflow https://stackoverflow.com/questions/2854301

  •  27-09-2019
  •  | 
  •  

Question

double x;
cin>>x;
if( x > 1.7976931348623157e+308 || x < -1.7976931348623157e+308 )
{
  cout<<"value not in range"<<endl;
  exit(1);
}

Y at-il comme un DOUBLE_MAX ou DOUBLE_MIN et aurais-je besoin d'inclure tous les fichiers d'en-tête?

Était-ce utile?

La solution

Il existe des constantes pour les plus grands et les plus petits types doubles, mais comme x est de type double, x ne peut être supérieure ou inférieure à ces valeurs! Si vous souhaitez comparer une valeur à ces limites entré est que vous aurez besoin d'analyser la chaîne vous-même et vérifier débordement.

Autres conseils

Le <cfloat> d'en-tête est équivalent à l'en-tête C <float.h> et contient DBL_MIN et DBL_MAX parmi beaucoup d'autres choses. Les limites de nombre entier (de <limits.h> en C) sont maintenues en <climits>.

Ceci est détaillé dans 18.3.2 du projet de C ++ 0x. Mais, comme l'a souligné ailleurs, un double peut contenir pas des valeurs en dehors de cette plage de toute façon. Vous devez utiliser un « plus grand » type tel que long double (bien que, selon la norme, qui pourrait être la même taille que le double, donc ne peut pas nécessairement l'aide).

Voici un programme complet de l'échantillon pour votre plaisir: -)

#include <iostream>
#include <cfloat>

int main (void) {
    long double bignum;
    std::cout << "Enter number: ";
    std::cin >> bignum;
    if ((bignum > (long double)DBL_MAX) || (bignum < (long double)DBL_MIN)) {
        std::cout << "Value not in range" << std::endl;
    } else {
        double x = bignum;
        std::cout << "Number was " << x << std::endl;
    }
    return 0;
}

avec transcription d'accompagnement:

$ ./qq.exe
Enter number: 1.7976931348623157e+308
Number was 1.79769e+308

$ ./qq.exe
Enter number: 1.7976931348623158e+308
Value not in range
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top