Frage

Wie kann ich erstellen oder Test für NaN oder unendlich Werte in Perl?

War es hilfreich?

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?

scroll top