C, C ++, java, C #, ocaml, jest częścią wielu języków.
zelinka
2
NaN w C jest NAN; jest to stała zdefiniowana w math.hC99. (Uważam, że najnowszą znormalizowaną wersję języka można nazwać tym językiem. Zatem „C” to C11.) (Patrz stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in -c ); w C ++ jest NANteż, jest też nan(), nanf()i nanl()chociaż jestem nieco mniej pewny tego, co robią. double.NaNw Javie, Double.NaNw C #…
>>>from math import nan
>>>print(nan)
nan
>>>print(nan +2)
nan
>>> nan == nan
False>>>import math
>>> math.isnan(nan)True
Przed Pythonem 3.5 można było używać float("nan") (bez rozróżniania wielkości liter).
Zauważ, że sprawdzenie, czy dwie rzeczy, które są NaN są sobie równe, zawsze zwróci fałsz. Dzieje się tak po części dlatego, że o dwóch rzeczach, które „nie są liczbą”, nie można (ściśle rzecz biorąc) powiedzieć, że są sobie równe - zobacz: Jakie jest uzasadnienie dla wszystkich porównań zwracających fałsz dla wartości NaN IEEE754?aby uzyskać więcej szczegółów i informacji.
Zamiast tego użyj math.isnan(...) jeśli chcesz określić, czy wartość to NaN, czy nie.
Ponadto dokładna semantyka ==operacji na wartości NaN może powodować subtelne problemy podczas próby przechowywania NaN wewnątrz typów kontenerów, takich jaklist lub dict(lub podczas korzystania z niestandardowych typów kontenerów). Aby uzyskać więcej informacji, zobacz Sprawdzanie obecności NaN w kontenerze .
Możesz również konstruować liczby NaN, używając dziesiętnych znaków Pythona modułu :
>>>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(...) będzie również działać z obiektami Decimal.
Jednak nie można konstruować liczb NaN w module ułamków Pythona :
>>>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.
Nawiasem mówiąc, możesz także zrobić float('Inf'), Decimal('Inf')lub math.inf(3,5+), aby przypisać nieskończone liczby. (A także zobaczmath.isinf(...) )
Jednak robi Fraction('Inf')lubFraction(float('inf')) nie jest dozwolone i spowoduje zgłoszenie wyjątku, podobnie jak NaN.
Jeśli chcesz szybko i łatwo sprawdzić, czy liczba nie jest ani NaN, ani nieskończona, możesz użyć math.isfinite(...)od wersji Python 3.2+.
Jeśli chcesz wykonać podobne sprawdzenia na liczbach zespolonych, cmathmoduł zawiera podobny zestaw funkcji i stałych jak mathmoduł:
Zauważ, że użycie float ('nan) jest 3 razy wolniejsze niż użycie np.nan i około 6,5 razy wolniej niż przypisanie nan = float (' nan ') raz, a następnie użycie zmiennej' nan 'dla wszystkich kolejnych przypisań (zgodnie z sugestią abarnerta odpowiedź).
Daniel Goldfarb,
18
nan = float('nan')
A teraz masz stałą, nan .
Możesz w podobny sposób utworzyć wartości NaN dla dziesiętnych.Decimal .:
Jest to najbardziej wydajna odpowiedź w przypadku wielu przypisań nan: oznacza to, że użyj zmiennej float („nan”) tylko raz, a następnie użyj przypisanej stałej dla wszystkich pozostałych przypisań. Jeśli jednak wykonujesz tylko jedno lub dwa przypisania z sumy nan, to użycie numpy.nan jest najszybsze.
Ta odpowiedź została bezzasadnie odrzucona. Piszę wiele małych testów parsowania w plikach .txt i używam ast.literal_eval, aby uzyskać oczekiwaną część wyjściową. Nie można tam nazwać float („nan”) i ta odpowiedź była dla mnie pomocna.
Vitalik Verhovodov
0
Bardziej spójnym (i mniej nieprzejrzystym) sposobem generowania inf i -inf jest ponowne użycie float ():
Zauważ, że rozmiar pływaka różni się w zależności od architektury, więc prawdopodobnie najlepiej jest unikać używania magicznych liczb, takich jak 9e999, nawet jeśli to prawdopodobnie zadziała.
NAN
; jest to stała zdefiniowana wmath.h
C99. (Uważam, że najnowszą znormalizowaną wersję języka można nazwać tym językiem. Zatem „C” to C11.) (Patrz stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in -c ); w C ++ jestNAN
też, jest teżnan()
,nanf()
inanl()
chociaż jestem nieco mniej pewny tego, co robią.double.NaN
w Javie,Double.NaN
w C #…Odpowiedzi:
Tak - użyj
math.nan
.Przed Pythonem 3.5 można było używać
float("nan")
(bez rozróżniania wielkości liter).Zauważ, że sprawdzenie, czy dwie rzeczy, które są NaN są sobie równe, zawsze zwróci fałsz. Dzieje się tak po części dlatego, że o dwóch rzeczach, które „nie są liczbą”, nie można (ściśle rzecz biorąc) powiedzieć, że są sobie równe - zobacz: Jakie jest uzasadnienie dla wszystkich porównań zwracających fałsz dla wartości NaN IEEE754?aby uzyskać więcej szczegółów i informacji.
Zamiast tego użyj
math.isnan(...)
jeśli chcesz określić, czy wartość to NaN, czy nie.Ponadto dokładna semantyka
==
operacji na wartości NaN może powodować subtelne problemy podczas próby przechowywania NaN wewnątrz typów kontenerów, takich jaklist
lubdict
(lub podczas korzystania z niestandardowych typów kontenerów). Aby uzyskać więcej informacji, zobacz Sprawdzanie obecności NaN w kontenerze .Możesz również konstruować liczby NaN, używając dziesiętnych znaków Pythona modułu :
math.isnan(...)
będzie również działać z obiektami Decimal.Jednak nie można konstruować liczb NaN w module ułamków Pythona :
Nawiasem mówiąc, możesz także zrobić
float('Inf')
,Decimal('Inf')
lubmath.inf
(3,5+), aby przypisać nieskończone liczby. (A także zobaczmath.isinf(...)
)Jednak robi
Fraction('Inf')
lubFraction(float('inf'))
nie jest dozwolone i spowoduje zgłoszenie wyjątku, podobnie jak NaN.Jeśli chcesz szybko i łatwo sprawdzić, czy liczba nie jest ani NaN, ani nieskończona, możesz użyć
math.isfinite(...)
od wersji Python 3.2+.Jeśli chcesz wykonać podobne sprawdzenia na liczbach zespolonych,
cmath
moduł zawiera podobny zestaw funkcji i stałych jakmath
moduł:cmath.isnan(...)
cmath.isinf(...)
cmath.isfinite(...)
(Python 3.2+)cmath.nan
(Python 3.6+; odpowiednikcomplex(float('nan'), 0.0)
)cmath.nanj
(Python 3.6+; odpowiednikcomplex(0.0, float('nan'))
)cmath.inf
(Python 3.6+; odpowiednikcomplex(float('inf'), 0.0)
)cmath.infj
(Python 3.6+; odpowiednikcomplex(0.0, float('inf'))
)źródło
A teraz masz stałą,
nan
.Możesz w podobny sposób utworzyć wartości NaN dla dziesiętnych.Decimal .:
źródło
Zastosowanie
float("nan")
:źródło
Możesz zrobić,
float('nan')
aby uzyskać NaN.źródło
Możesz uzyskać NaN z „inf - inf”, a „inf” z liczby większej niż 2e308, więc generalnie użyłem:
źródło
Bardziej spójnym (i mniej nieprzejrzystym) sposobem generowania inf i -inf jest ponowne użycie float ():
Zauważ, że rozmiar pływaka różni się w zależności od architektury, więc prawdopodobnie najlepiej jest unikać używania magicznych liczb, takich jak 9e999, nawet jeśli to prawdopodobnie zadziała.
źródło