Pregunta

¿Cómo se crea o prueba para NaN o infinitos valores en Perl?

¿Fue útil?

Solución 2

Aquí está una manera bastante 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));
}

La salida es:

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

Otros consejos

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

Editar . Fijo para el infinito negativo

de datos :: Float de CPAN. Exporta las siguientes funciones:

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

Y al contrario de las otras soluciones y medio de trabajo publicadas aquí, tiene un banco de pruebas .

En lo personal, me gustaría utilizar Math::BigFloat (o BigInt) para cualquier cosa que se va a tocar infinidad de NaN.

¿Por qué reinventar la rueda con una solución de corte cuando ya hay módulos que hacen el trabajo?

Cuando busqué Tengo este sitio (aquí) y http://www.learning-perl.com/2015/05/perls-special-not-a-numbers/

El artículo enlazado señala que "nan" == "nan" nunca es cierto, cuando la implementación subyacente c apoya NaN porque Nan no puede compararse con sí mismo.

Esto se ilustra muy bien con

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

Creo que el riesgo de que la ejecución de código en un entorno en el Perl se ha degradado con gracia y su código no se puede ser lo suficientemente bajo como para que no se preocupe demasiado.

Y por supuesto, si usted no quiere Perl para interpolar como un número, utilice 'eq' no '=='

respuesta sucinta que trabaja sigue.

1: Cómo crear una variable "NAN" para la salida (a printf, por ejemplo):

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

2: Cómo probar para "NAN" (se parece a arte ASCII):

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

3: Cómo crear un "INF" y las variables INFN:

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

4: Cómo probar la "INF" (de cualquier signo):

sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top