¿Cómo creo o pruebo para NaN o valores infinitos en Perl?¿Cómo creo o pruebo para NaN o infinito en Perl?
Respuesta
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));
}
de salida es:
inf: isinf: 1, isnan: 0, signbit: 0
-inf: isinf: 1, isnan: 0, signbit: 1
nan: isinf: 0, isnan: 1, signbit: 0
print "Is NaN\n" if $a eq 'nan';
print "Is Inf\n" if $a eq 'inf' or $a eq '-inf';
EDITAR: Se ha corregido para infinito negativo.
Quien abajo vote esta respuesta, le permitirá dejar la publicación si no se siente avergonzado. De esta manera, funciona absolutamente perfecto en Perl. Si $ a es el número que la representación de cadena será 'nan' o 'inf' solo si es valor NaN o Inf. –
¿Qué pasa si $ a no es un número, pero en realidad es la cadena "nan"? –
@Ryan: String "nan" no es un número de curso. La solución de ysth funciona exactamente igual. Marque 'perl -le 'sub isnan {! definido ($ _ [0] <=> 9 ** 9 ** 9)}; print isnan ("nan") '' si no confías en mí. –
Personalmente, yo usaría Math::BigFloat
(o BigInt
) para cualquier cosa que vaya a tocar el infinito de NaN
.
¿Por qué reinventar la rueda con una solución de hack cuando ya hay módulos que hacen el trabajo?
Respuesta sucinta que funciona de la siguiente manera.
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 para "INF" (de cualquier signo):
sub isinf {($_[0]==+"INF")||($_[0]==-"INF")}
(1) y (3) no son diferentes de '$ NAN =" NAN "+1;', '$ INF =" INF "+1; $ INFN = - "INF"; 'simplemente más detallado – ysth
oh, veo que (4) usa también palabras sin contraseña, solo sin deshabilitar estrictamente. Y todos estos que dependen de cadenas como "NAN" e "INF" convirtiéndose en el "número" apropiado en contexto numérico fallarán en perls anteriores o cuando el tiempo de ejecución de C no lo soporte (por ejemplo, fresa perl o activeperl en Windows) – ysth
Una _comprehensive_ respuesta incluiría una suite de pruebas. – dolmen
Use Data::Float de CPAN. Exporta las siguientes funciones:
float_is_infinite(
)float_is_nan()
- ...
Y al contrario de las otras soluciones de medio de trabajo publicadas aquí, que tiene un testsuite.
Debe mencionarse que 'Data :: Float's cheque para' NaN' depende del soporte 'NaN' en la plataforma. –
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 igualar en sí .
Esto ilustra muy bien con
die "This perl does not support NaN!\n" if "NaN" == "NaN";
supongo 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 preocupa demasiado .
Y por supuesto, si usted no quiere Perl para interpolar como un número, utilice 'eq' no '=='
- 1. ¿Cómo se obtiene VB6 para inicializar los dobles con + infinito, -infinito y NaN?
- 2. ¿Cómo creo una clase Perl?
- 3. Cómo comprobar inf (y | o) NaN en una variable doble
- 4. NaN ASCII I/O con Visual C++
- 5. JavaScript: ¿qué es NaN, Object o primitive?
- 6. Fórmula SSRS o expresión para cambiar NaN a 0
- 7. ¿Cómo creo una matriz 2D en Perl?
- 8. ¿Cómo pruebo para typeof (dinámico)?
- 9. ¿Cómo creo un archivo CSV usando Perl?
- 10. python nan and inf values
- 11. ¿Cómo pruebo la unidad para EXC_BAD_ACCESS?
- 12. ¿Cómo ver si existe un directorio o no en Perl?
- 13. Cómo finalizar un programa en Perl: ¿salir o morir?
- 14. Perl: ¿Múltiples condiciones globales de expresiones regulares "o" separadas en el bloque conduce a un bucle infinito?
- 15. ¿Debo usar Perl/Tk, Tcl :: Tk o Tkx para una GUI de Perl?
- 16. En Perl, ¿cómo creo de manera segura una FIFO temporal?
- 17. Respuesta multiparte HTTP usando Perl o PHP
- 18. ¿Cómo creo un hash de hashes en Perl?
- 19. ¿Cómo creo los programas de arrastrar y soltar Strawberry Perl?
- 20. Python y/o Perl VS bash
- 21. ¿Cuál es la mejor manera de marcar algunos elementos en MATLAB? usando NaN o Inf? ¿o algo mas?
- 22. ¿Cómo comprobar si el vector completo no tiene valores distintos de NA (o NAN) en R?
- 23. Renombrar y mover archivos en Bash o Perl
- 24. Simplificación de patrones O regex O
- 25. PHP interface Interfaz o enlaces Perl
- 26. Hasta el infinito y volver
- 27. ¿Cómo pruebo un método asíncrono con NUnit (o posiblemente con otro marco)?
- 28. ¿Cómo uso una determinada versión (o superior) de un módulo perl en mi script perl?
- 29. Perl: ¿Es buena o mala expresión regular y cómo mejorarla?
- 30. ¿NaN es igual a NaN?
En 5.10 y arriba, donde está la biblioteca C soporta, simplemente 0+ "nan" , 0+ "inf", o 0 + "- inf" también funcionan. – ysth
Muy enérgico de ti: hace 13 minutos, haces la pregunta; Hace 11 minutos, lo respondes; Hace 9 minutos, publicaste un comentario. Deberías comprarte una cerveza o algo así. – Telemachus
@Telemachus: Excepto que no bebo nada ... – ysth