Domanda

Come faccio a creare o di prova per NaN o infiniti valori in Perl?

È stato utile?

Soluzione 2

Ecco un modo piuttosto affidabile:

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));
}

L'uscita è:

inf:    isinf: 1,   isnan: 0,   signbit: 0
-inf:   isinf: 1,   isnan: 0,   signbit: 1
nan:    isinf: 0,   isnan: 1,   signbit: 0

Altri suggerimenti

print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';

Modifica :. Fisso per infinito negativo

dati :: Float da CPAN. Esporta le seguenti funzioni:

  • float_is_infinite()
  • float_is_nan()
  • ...

E contrariamente alle altre soluzioni a metà lavoro pubblicate qui, ha una testsuite .

Personalmente, vorrei utilizzare Math::BigFloat (o BigInt) per tutto ciò che sta per toccare un'infinità di NaN.

Perché reinventare la ruota con una soluzione di trucco quando ci sono già i moduli che fanno il lavoro?

Quando ho cercato ho ottenuto questo sito (qui) e http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

L'articolo collegato sottolinea che "nan" == "nan" non è mai vero, quando l'attuazione c sottostante supporta NaN perché Nan non può corrispondere in sé.

Questo è ben illustrato con

die "This perl does not support NaN!\n" if "NaN" == "NaN";

Credo che il rischio di voi l'esecuzione di codice in un ambiente dove il Perl ha degradato grazia e il codice non ha potuto essere sufficientemente bassa in modo che non si preoccupi troppo.

E, naturalmente, se non si vuole perl interpolare come un numero, utilizzare 'eq' non '=='

risposta succinta che funziona segue.

1: Come creare una variabile "nan" per l'uscita (a printf, per esempio):

 {no strict 'subs'; $NAN="NAN"+1;}

2: Come testare per "nan" (sembra ascii art):

 sub isnan {!($_[0]<=0||$_[0]>=0)}

3: Come creare un "INF" e variabili INFN:

{$INF="INF"+1; $INFN=-"INF"+1}

4: Come provare per "INF" (di qualsiasi segno):

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top