Comment produire un NaN float en c?
float f = (float)'a';
if(f < 0){
}
else if(f == 0){
}
else if(f > 0){
}
else{
printf("NaN\n");
}
f
ne sera pas supérieure/égale/moins de 0
si c'est un NaN
.
Mais comment produire un tel f
en premier lieu?
J'ai essayé différentes façons de produire de l'un NaN
,mais aucun travail..
gnu.org/s/hello/manual/libc/Infinity-and-NaN.html
Pouvez-vous utiliser un peu de C++? C++ std::numeric_limits des trucs qui inclut des constantes pour à la fois calme et de signalisation NaN. Aussi, êtes-vous sûr que votre système prend en charge NaN correctement? Parce que je suis VRAIMENT surpris quand vous dites que 0.0/0.0 n'est pas NaN, et je commence à soupçonner votre bibliothèque, ce n'est pas le programme d'installation de la façon dont vous pensez qu'elle est.
Pouvez-vous utiliser un peu de C++? C++ std::numeric_limits des trucs qui inclut des constantes pour à la fois calme et de signalisation NaN. Aussi, êtes-vous sûr que votre système prend en charge NaN correctement? Parce que je suis VRAIMENT surpris quand vous dites que 0.0/0.0 n'est pas NaN, et je commence à soupçonner votre bibliothèque, ce n'est pas le programme d'installation de la façon dont vous pensez qu'elle est.
OriginalL'auteur Je Rog | 2011-08-27
Vous devez vous connecter pour publier un commentaire.
En utilisant des nombres à virgule flottante,
0.0 /0.0
n'est pas une "division par zéro" erreur; il en résulteNaN
.Ce programme C imprime
-nan
:En termes de ce que
NaN
ressemble à de l'ordinateur, deux "invalide" numéros sont réservés pour "signalisation" et "calme" NaN (similaire aux deux numéros non valides réservés pour la positif et négatif de l'infini). Le L'entrée de Wikipedia a plus de détails sur la façon de NaN est représenté comme un IEE nombre à virgule flottante.NaN
n'est pas imprimé,il n'est donc pas de travail.De la balle,ça veut dire IEEE contient la définition de moins 2^128 flottent des valeurs de point? Seulement dans ce cas, il peut y avoir certaines valeurs particulières utilisé comme NaN OMI
VC++ 2012 compilateur obtient
C2124
erreur si0.0/0.0
.Cécile: je pense que la division par zéro se produire pour une période Indéterminée (IND), de ne pas NaN.
Oui, le problème avec les compilateurs Microsoft est bien connu. Voir ma réponse (j'ai posté seulement) pour une solution avec ces compilateurs (utilisé par GNU MPFR) et d'autres solutions pour les différentes implémentations, à chaque fois mentionner des problèmes de portabilité.
OriginalL'auteur Dan Cecile
Pour produire un nan, il existe quelques façons:
1) générer manuellement (lire
ieee754
pour configurer les bits correctement)2) utiliser une macro. GCC expose une macro
NAN
. Il est défini en mathématiques.hLa manière générale de façon à vérifier pour un nan est de vérifier
if (f == f)
(qui devrait échouer pour des valeurs nan)Pour nan, les bits d'exposant dans la représentation du flotteur devraient tous être mis à 1 (float se compose d'un bit signé, un ensemble de bits d'exposant et d'un ensemble de bits de la mantisse)
isnan()
de vérifier pour un NaN (nécessite C99 ou (sur les systèmes unix) les indicateurs de fonctionnalités, consultez la page de manuel pour plus de détails)un peu OT mais sa fait étrange que python n'introduisent pas de isnan jusqu'à 2.6
Je trouve NAN en bits/nan.h pour mon jeu d'outils.
Pour (1), il existe divers problèmes de portabilité ne sont pas couverts par la norme IEEE 754 (voir ma réponse pour quelques détails). Au sujet de (2), le
NAN
ne vient pas de GCC, mais à partir de la bibliothèque C de. Par exemple, voir les.../bits/nan.h
fichier pour la GNU libc (comme mentionné par @DarenW); cependant, la définition de la macro est spécifique à GCC lorsqu'il est détecté par le préprocesseur tests.OriginalL'auteur Foo Bah
De la GNU GCC manuel
math.h
définit les macros qui vous permettent de définir explicitement une variable à l'infini ou NaN. Puisque c'est une partie de C99 vous pouvez utiliser les macros suivantes avec d'autres c99 conforme compilateurs j'espère.— Macro: float INFINI
Une expression qui représente l'infini positif. Il est égal à la valeur produite par des opérations mathématiques comme 1.0 /0.0. -L'INFINI représente l'infini négatif.
Vous pouvez tester si une valeur à virgule flottante est infini, en la comparant à cette macro. Cependant, ce n'est pas recommandé; vous devez utiliser la isfinite de macro. Voir À Virgule Flottante Classes.
Cette macro a été introduite dans la norme ISO C99.
— Macro: float NAN
Une expression représentant une valeur qui n'est “pas un nombre”. Cette macro est une extension GNU, disponible uniquement sur les ordinateurs qui prennent en charge les “pas un nombre” valeur—c'est-à-dire, sur toutes les machines à virgule flottante IEEE.
Vous pouvez utiliser ‘#ifdef NAN’ pour tester si la machine prend en charge NaN. (Bien sûr, vous devez prendre des dispositions pour GNU extensions pour être visible, par exemple en définissant _GNU_SOURCE, et puis vous devez inclure les mathématiques.h.)
pour plus d'informations vous pouvez le voir ici:
http://www.gnu.org/s/hello/manual/libc/Infinity-and-NaN.html
NAN
macro n'est pas une extension GNU (à tout le moins, pas plus). Il a été introduit dans la norme ISO C99. Donc, au lieu de définir_GNU_SOURCE
, de compiler dans une certaine forme de C99 mode ou plus (au lieu de C89) est suffisante.OriginalL'auteur A. K.
Vous pouvez soit utiliser
NAN
macro, ou tout simplement l'un desnan/nanf
fonctions à attribuer un nan, la valeur d'une variable.pour vérifier si vous faites affaire avec une valeur nan, vous pouvez utiliser
isnan()
.Voici un exemple:
De l'exécution de l'extrait de code ci-dessus va vous donner ce résultat:
Exécuter le code vous-même : http://ideone.com/WWZBl8
lire plus d'informations : http://www.cplusplus.com/reference/cmath/NAN/
C'est peut-être parce
nan
etnanf
ne sont pas standard C fonctions.et
nanf
standard ISO C fonctions depuis 1999.OriginalL'auteur Breeze
Cela fonctionne pour les constantes (0/0 donnera une erreur de compilation sur vs):
~
sur un entier signé de type,int
potentiellement trop court (par exemple sur certains systèmes embarqués), NaN représentation, et brisé aliasing règles. Voir ma réponse pour plus de détails.OriginalL'auteur Oliver Zendel
Pour hébergés sur des implémentations C, on peut faire un
#include <math.h>
et l'utilisation de laNAN
macro si elle est définie. Par exemple, avec GCC, il est mis en œuvre par un builtin:(__builtin_nanf (""))
.Autonomes des implémentations C (sur lequel le
<math.h>
- tête peut ne pas être disponible) ou lorsque leNAN
macro n'est pas définie (ce qui pourrait se produire même si NaN peut être pris en charge), on peut générer un NaN avec une opération en virgule flottante comme0.0 / 0.0
. Cependant, il peut y avoir plusieurs problèmes avec elle.Tout d'abord, une telle opération génère une exception, avec un possible piège sur certaines implémentations C. On peut assurez-vous qu'il est calculé au moment de la compilation avec:
Un autre problème est que Microsoft Visual C++ (au moins certaines versions) tente d'évaluer les
0.0 / 0.0
au moment de la compilation (même si cette expression est dans un endroit arbitraire dans le code) et se plaint de sa validité. Donc, la solution ici est à l'opposé: assurez-vous que le compilateur ne l'évaluer au moment de la compilation, en faisant:et ensuite utiliser
zero / zero
. Depuis ces solutions sont contradictoires, on peut tester le compilateur avec les directives de préprocesseur (#if
...) sur des macros spécifiques.On peut aussi choisir une solution basée sur le NaN encodage, mais il y a aussi des problèmes de portabilité. Tout d'abord, la norme IEEE 754 la norme n'a pas complètement définir l'encodage d'un NaN, en particulier pour distinguer le calme et la signalisation NaNs (et le matériel diffère dans la pratique); la signalisation NaNs donnera un comportement indéfini. En outre, la norme IEEE 754 la norme ne définit pas la façon dont la chaîne de bits est représenté en mémoire, c'est à dire l'endianness peut-être besoin d'être détecté. Si ces problèmes sont résolus, à un syndicat ou à un tableau de
unsigned char
avec un pointeur cast est bien d'obtenir la variable de type point. Ne pas utiliser un entier à un pointeur coulé sur son adresse à faire de ce type de beaucoup les jeux de mots car cela va casser le C aliasing règles.OriginalL'auteur vinc17
Programme C suivant va produire un NaN. La deuxième déclaration entraînera un NaN.
Suivante sera la sortie du programme.
1.#QNAN0
OriginalL'auteur MNS
nan est produite lorsque nous avons programme contient la valeur comme 0.0/0.0 comme dit par @Dan Cécile OU sqrt(-1).
OriginalL'auteur Vinod Kumar Chauhan