C, C ++, java, C #, ocaml, es parte de muchos lenguajes.
zelinka
2
NaN, en C, es NAN; es una constante definida en math.h, a partir de C99. (Creo que es justo llamar a la versión estandarizada más reciente del idioma como ese idioma. Por lo tanto, "C" es C11.) (Consulte stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in -c ); en C ++, es NANasí, también hay nan(), nanf()y nanl(), aunque estoy un poco menos seguro en cuanto a lo que hacen. double.NaNen Java, Double.NaNen C #…
En su lugar, utilícelo math.isnan(...)si necesita determinar si un valor es NaN o no.
Además, la semántica exacta de la ==operación en el valor de NaN puede causar problemas sutiles al intentar almacenar NaN dentro de tipos de contenedores como listo dict(o cuando se utilizan tipos de contenedores personalizados). Consulte Comprobación de la presencia de NaN en un contenedor para obtener más detalles.
También puede construir números NaN usando el módulo decimal de Python :
>>>from decimal importDecimal>>> b =Decimal('nan')>>>print(b)NaN>>>print(repr(b))Decimal('NaN')>>>>>>Decimal(float('nan'))Decimal('NaN')>>>>>>import math
>>> math.isnan(b)True
math.isnan(...) también funcionará con objetos Decimal.
Sin embargo, no puede construir números NaN en el módulo de fracciones de Python :
>>>from fractions importFraction>>>Fraction('nan')Traceback(most recent call last):File"<stdin>", line 1,in<module>File"C:\Python35\lib\fractions.py", line 146,in __new__
numerator)ValueError:Invalid literal forFraction:'nan'>>>>>>Fraction(float('nan'))Traceback(most recent call last):File"<stdin>", line 1,in<module>File"C:\Python35\lib\fractions.py", line 130,in __new__
value =Fraction.from_float(numerator)File"C:\Python35\lib\fractions.py", line 214,in from_float
raiseValueError("Cannot convert %r to %s."%(f, cls.__name__))ValueError:Cannot convert nan to Fraction.
Por cierto, también puede hacer float('Inf'), Decimal('Inf')o math.inf(3.5+) para asignar números infinitos. (Y ver también math.isinf(...))
Sin embargo, hacerlo Fraction('Inf')o Fraction(float('inf'))no está permitido y generará una excepción, como NaN.
Si desea una forma rápida y fácil de verificar si un número no es NaN ni infinito, puede usarlo a math.isfinite(...)partir de Python 3.2+.
Si desea realizar comprobaciones similares con números complejos, el cmathmódulo contiene un conjunto similar de funciones y constantes que el mathmódulo:
Tenga en cuenta que usar float ('nan) es 3 veces más lento que usar np.nan, y aproximadamente 6.5 veces más lento que asignar nan = float (' nan ') una vez y luego usar la variable' nan 'para todas las asignaciones siguientes (como se sugiere en abarnert's responder).
Daniel Goldfarb
18
nan = float('nan')
Y ahora usted tiene la constante nan.
De manera similar, puede crear valores NaN para decimal.Decimal .:
Esta es la respuesta más eficiente para múltiples asignaciones nan: es decir, use float ('nan') solo una vez y luego use la constante asignada para todas las asignaciones restantes. Sin embargo, si solo está haciendo una o dos asignaciones de nan total, entonces usar numpy.nan es más rápido.
Esta respuesta votó en contra irrazonablemente. Estoy escribiendo muchas pequeñas pruebas de análisis en archivos .txt y usando ast.literal_eval para obtener la parte de salida esperada. Es imposible llamar a float ('nan') allí, y esta respuesta fue útil para mí.
Vitalik Verhovodov
0
Una forma más consistente (y menos opaca) de generar inf y -inf es usar nuevamente float ():
Tenga en cuenta que el tamaño de un flotador varía según la arquitectura, por lo que probablemente sea mejor evitar el uso de números mágicos como 9e999, incluso si es probable que funcione.
NAN
; es una constante definida enmath.h
, a partir de C99. (Creo que es justo llamar a la versión estandarizada más reciente del idioma como ese idioma. Por lo tanto, "C" es C11.) (Consulte stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in -c ); en C ++, esNAN
así, también haynan()
,nanf()
ynanl()
, aunque estoy un poco menos seguro en cuanto a lo que hacen.double.NaN
en Java,Double.NaN
en C #…Respuestas:
Sí, use
math.nan
.Antes de Python 3.5, se podía usar
float("nan")
(no distingue entre mayúsculas y minúsculas).Tenga en cuenta que comprobar si dos cosas que son NaN son iguales entre sí siempre devolverá falso. Esto se debe en parte a que no se puede decir (estrictamente hablando) que dos cosas que "no son un número" sean iguales entre sí; consulte ¿Cuál es el motivo de que todas las comparaciones devuelvan falsas para los valores de NaN IEEE754? para más detalles e información.
En su lugar, utilícelo
math.isnan(...)
si necesita determinar si un valor es NaN o no.Además, la semántica exacta de la
==
operación en el valor de NaN puede causar problemas sutiles al intentar almacenar NaN dentro de tipos de contenedores comolist
odict
(o cuando se utilizan tipos de contenedores personalizados). Consulte Comprobación de la presencia de NaN en un contenedor para obtener más detalles.También puede construir números NaN usando el módulo decimal de Python :
math.isnan(...)
también funcionará con objetos Decimal.Sin embargo, no puede construir números NaN en el módulo de fracciones de Python :
Por cierto, también puede hacer
float('Inf')
,Decimal('Inf')
omath.inf
(3.5+) para asignar números infinitos. (Y ver tambiénmath.isinf(...)
)Sin embargo, hacerlo
Fraction('Inf')
oFraction(float('inf'))
no está permitido y generará una excepción, como NaN.Si desea una forma rápida y fácil de verificar si un número no es NaN ni infinito, puede usarlo a
math.isfinite(...)
partir de Python 3.2+.Si desea realizar comprobaciones similares con números complejos, el
cmath
módulo contiene un conjunto similar de funciones y constantes que elmath
módulo:cmath.isnan(...)
cmath.isinf(...)
cmath.isfinite(...)
(Python 3.2+)cmath.nan
(Python 3.6+; equivalente acomplex(float('nan'), 0.0)
)cmath.nanj
(Python 3.6+; equivalente acomplex(0.0, float('nan'))
)cmath.inf
(Python 3.6+; equivalente acomplex(float('inf'), 0.0)
)cmath.infj
(Python 3.6+; equivalente acomplex(0.0, float('inf'))
)fuente
Y ahora usted tiene la constante
nan
.De manera similar, puede crear valores NaN para decimal.Decimal .:
fuente
Utilizar
float("nan")
:fuente
Puede hacer
float('nan')
para obtener NaN.fuente
Puede obtener NaN de "inf - inf" y puede obtener "inf" de un número mayor que 2e308, por lo que generalmente usé:
fuente
Una forma más consistente (y menos opaca) de generar inf y -inf es usar nuevamente float ():
Tenga en cuenta que el tamaño de un flotador varía según la arquitectura, por lo que probablemente sea mejor evitar el uso de números mágicos como 9e999, incluso si es probable que funcione.
fuente