Comment puis-je créer ou de test pour NaN ou l'infini en Perl?
Comment puis-je créer ou de test pour NaN ou des valeurs infinies en Perl?
Vous devez vous connecter pour publier un commentaire.
Comment puis-je créer ou de test pour NaN ou des valeurs infinies en Perl?
Vous devez vous connecter pour publier un commentaire.
MODIFIER: Correction de l'infini négatif.
perl -le 'sub isnan { ! defined( $_[0] <=> 9**9**9 ) }; print isnan("nan")'
si vous n'avez pas confiance en moi.Ici une assez fiable:
De sortie est:
Utilisation Data::Float sur le CPAN. Il exporte les fonctions suivantes:
float_is_infinite(
)float_is_nan()
Et contrairement aux autres demi-solutions de travail posté ici, il a un testsuite.
Data::Float
s vérifierNaN
dépend deNaN
appui sur la plate-forme.Personnellement, je voudrais utiliser
Math::BigFloat
(ouBigInt
) pour tout ce qui va toucher l'infini deNaN
.Pourquoi réinventer la roue avec un hack solution lorsqu'il existe déjà des modules qui font le travail?
Quand j'ai cherché j'ai eu ce site (ici) et http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/
L'article lié souligne que "nan" == "nan" n'est jamais vrai, lorsque le sous-jacent c prend en charge la mise en œuvre de NaN Nan parce que ne peuvent pas rivaliser avec elle-même.
C'est joliment illustré avec
Je suppose que le risque d'exécution de code dans un environnement où perl s'est dégradée avec élégance et votre code n'a pas peut-être assez faible pour que vous ne vous inquiétez pas trop.
Et bien sûr, si vous ne voulez pas de perl pour interpoler comme un nombre, utilisez 'eq' non '=='
Succincte réponse qui fonctionne de la façon suivante.
1: Comment créer un "NAN" variable de sortie (à printf, par exemple):
2: Comment faire pour tester le "NAN" (qui ressemble ascii art):
3: Comment créer un "INF" et l'INFN variables:
4: Comment faire pour tester le "INF" (un signe):
$NAN = "NAN"+1;
,$INF = "INF"+1; $INFN = -"INF";
peu plus détailléno strict 'subs'
plus si vous n'utilisez pas barewords. Donc votre solution (toujours sans testsuite) pourrait être plus succinct. Etisinf
est pas encore efficace.