Comment puis-je créer ou test pour NaN ou infini en Perl?
Question
Comment puis-je créer ou test pour NaN ou des valeurs infinies en Perl?
La solution 2
Voici une façon assez fiable:
my $inf = 9**9**9;
my $neginf = -9**9**9;
my $nan = -sin(9**9**9);
sub isinf { $_[0]==9**9**9 || $_[0]==-9**9**9 }
sub isnan { ! defined( $_[0] <=> 9**9**9 ) }
# useful for detecting negative zero
sub signbit { substr( sprintf( '%g', $_[0] ), 0, 1 ) eq '-' }
for my $num ( $inf, $neginf, $nan ) {
printf("%s:\tisinf: %d,\tisnan: %d,\tsignbit: %d\n", $num, isinf($num), isnan($num), signbit($num));
}
sortie est la suivante:
inf: isinf: 1, isnan: 0, signbit: 0
-inf: isinf: 1, isnan: 0, signbit: 1
nan: isinf: 0, isnan: 1, signbit: 0
Autres conseils
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
EDIT :. Fixe pour l'infini négatif
Utilisez de CPAN. Elle exporte les fonctions suivantes:
-
float_is_infinite(
) -
float_is_nan()
- ...
Et contrairement aux autres solutions demi-travail posté ici, il a une testsuite.
Personnellement, j'utiliser Math::BigFloat
(ou BigInt
) pour tout ce qui va toucher l'infini de NaN
.
Pourquoi réinventer la roue avec une solution de hack quand il y a déjà des modules qui font le travail?
Quand je suis arrivé, je cherchai ce site (ici) et
Succinct réponse qui fonctionne suit. 1: Comment créer une variable "NAN" pour la sortie (à printf, par exemple): 2: Comment tester pour "NAN" (qui ressemble à l'art ascii): 3: Comment créer un "INF" et les variables INFN: 4: Comment tester "INF" (des signes): {no strict 'subs'; $NAN="NAN"+1;}
sub isnan {!($_[0]<=0||$_[0]>=0)}
{$INF="INF"+1; $INFN=-"INF"+1}
sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}