Wie erstelle ich oder Test für NaN oder unendlich in Perl?
Frage
Wie kann ich erstellen oder Test für NaN oder unendlich Werte in Perl?
Lösung 2
Hier ist eine ziemlich zuverlässige Art und Weise:
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));
}
Die Ausgabe ist:
inf: isinf: 1, isnan: 0, signbit: 0
-inf: isinf: 1, isnan: 0, signbit: 1
nan: isinf: 0, isnan: 1, signbit: 0
Andere Tipps
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
Bearbeiten :. Feste für negative Unendlichkeit
Verwenden Sie Data :: Float von CPAN. Es exportiert die folgenden Funktionen:
-
float_is_infinite(
) -
float_is_nan()
- ...
Und im Gegensatz zu den anderen Halbarbeitslösungen hier gepostet, es hat eine Testsuite .
Persönlich würde ich Math::BigFloat
(oder BigInt
) für alles, was Unendlichkeit NaN
berühren wird.
Warum das Rad neu erfinden mit einem Hack-Lösung, wenn es bereits Module sind, die die Arbeit tun?
Als ich gesucht Ich habe diese Website (hier) und
Knappe Antwort, die Werke folgen. 1: Wie für die Ausgabe eines "NAN" Variable erstellen (zu printf, zum Beispiel): 2: Wie Test für "NAN" (sieht aus wie ascii art): 3: Wie eine "INF" und INFN Variablen erstellen: 4: Wie Test für "INF" (alle Zeichen): {no strict 'subs'; $NAN="NAN"+1;}
sub isnan {!($_[0]<=0||$_[0]>=0)}
{$INF="INF"+1; $INFN=-"INF"+1}
sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}