Jeśli pytasz „po co jest NaN?” w Javie (lub jakimkolwiek innym języku), mogę podać przypadek użycia, w którym jest to bardzo przydatne: kiedy mam dwuwymiarową tablicę liczb zmiennoprzecinkowych, ale moje obliczenia nie mają sensownej wartości dla jakiejś części tej dwuwymiarowej tablicy, Wypełnię tę wartość „NaN”. Można to wykorzystać do zasygnalizowania dalszym użytkownikom moich obliczeń (np. Gdy jest on przekształcony w obraz rastrowy) „nie zwracajcie uwagi na wartość w tym momencie”. Bardzo przydatne!
Dan H
A tak przy okazji, co - dokładnie - to znaczy „pomniejszyć” podwójną? Ciekawy ...
„NaN” oznacza „nie jest liczbą”. „Nan” jest wytwarzane, jeśli operacja zmiennoprzecinkowa ma pewne parametry wejściowe, które powodują, że operacja daje niezdefiniowany wynik. Na przykład liczba 0,0 podzielona przez 0,0 jest arytmetycznie niezdefiniowana. Obliczanie pierwiastka kwadratowego z liczby ujemnej również jest niezdefiniowane.
Dodatkowo, NaN jest dość wyraźnie zdefiniowane w IEEE Standard for Floating-Point Arithmetic (IEEE 754), za którym Java ślepo podąża. Czytanie standardu otwiera oczy na wiele rzeczy, a jedną z nich jest wielokrotność zera.
Esko
37
Ponadto, NaNma ciekawą właściwość bycia tylko „numer”, która nie jest taka sama jak sama gdy porównywane. Dlatego powszechny (iw wielu językach jedyny) test, jeśli liczba xjest NaNnastępujący:boolean isNaN(x){return x != x;}
quazgar
3
Link w odpowiedzi jest martwy?
Pang
3
... "Pierwiastek kwadratowy z liczby ujemnej jest nieokreślony (w arytmetyce)" ... Nie! jego faktycznie ii niektóre języki, takie jak umowy Pythona bardzo dobrze z nim ... To może być nie tak w javaty
Rafael T
5
@RafaelT Powiedziałbym, że jest niezdefiniowany w niezłożonej arytmetyce. W Javie nie ma możliwości przypisania liczby zespolonej do liczby zmiennoprzecinkowej lub podwójnej. Python jest wpisywany dynamicznie, dlatego w tym przypadku może być po prostu zwrócenie liczby zespolonej.
sstn
19
NaNoznacza „Not a Number” i jest w zasadzie reprezentacją specjalnej wartości zmiennoprzecinkowej w standardzie zmiennoprzecinkowym IEE 754 . NaN ogólnie oznacza, że wartość jest czymś, czego nie można wyrazić za pomocą prawidłowej liczby zmiennoprzecinkowej.
Konwersja da tę wartość, gdy konwertowana wartość jest czymś innym, na przykład podczas konwersji ciągu, który nie reprezentuje liczby.
Jak konwertować? Z parseFloat()czy parseDouble? Albo coś innego?
Alonso del Arte
14
NaNoznacza „Not a Number” i jest wynikiem niezdefiniowanych operacji na liczbach zmiennoprzecinkowych, takich jak na przykład dzielenie zera przez zero. (Zauważ, że chociaż dzielenie liczby niezerowej przez zero jest zwykle niezdefiniowane w matematyce, nie daje to NaN, ale dodatnią lub ujemną nieskończoność).
NaNoznacza „To nie jest liczba”. Jest to specjalna wartość zmiennoprzecinkowa, która oznacza, że wynik operacji nie został zdefiniowany lub nie można go przedstawić jako liczby rzeczywistej.
Zobacz tutaj, aby uzyskać więcej informacji na temat tej wartości.
Pierwszą rzeczą, którą musisz wiedzieć, jest to, że koncepcja NaN jest implementowana bezpośrednio na sprzęcie procesora.
Wydaje się, że wszystkie główne współczesne procesory są zgodne z IEEE 754, który określa formaty zmiennoprzecinkowe, a NaN, które są po prostu specjalnymi wartościami zmiennoprzecinkowymi, są częścią tego standardu.
Dlatego koncepcja będzie bardzo podobna w każdym języku, w tym w Javie, który po prostu emituje kod zmiennoprzecinkowy bezpośrednio do procesora.
Zanim przejdziesz dalej, możesz najpierw przeczytać następujące odpowiedzi, które napisałem:
dziwne operacje, które są na granicy plus lub minus nieskończoności, dają jednak + - nieskończoność zamiast NaN
1.0f / 0.0f
log(0.0f)
0.0 prawie mieści się w tej kategorii, ale prawdopodobnie problem polega na tym, że może dojść do plusa lub minus nieskończoności, więc pozostawiono ją jako NaN.
jeśli NaN jest wartością wejściową operacji zmiennoprzecinkowej, wyjście również ma tendencję do NaN
istnieje kilka możliwych wartości NaN 0x7fc00000, 0x7fc00001, 0x7fc00002, chociaż x86_64 wydaje się wygenerować tylko 0x7fc00000.
NaN i nieskończoność mają podobną reprezentację binarną.
Rozważmy kilka z nich:
nan =0x7fc00000=01111111110000000000000000000000
positive_inf =0x7f800000=01111111100000000000000000000000
negative_inf =0xff800000=11111111100000000000000000000000||||| mantissa| exponent|
sign
Na tej podstawie potwierdzamy, co określa IEEE754:
zarówno NaN, jak i nieskończoności mają wykładnik == 255 (wszystkie jedynki)
nieskończoności mają mantysę == 0. Dlatego są tylko dwie możliwe nieskończoności: + i -, rozróżniane przez bit znaku
NaN ma mantysę! = 0. Jest zatem kilka możliwości, z wyjątkiem mantysy == 0, która jest nieskończonością
NaN mogą być dodatnie lub ujemne (górny bit), chociaż nie ma to wpływu na normalne operacje
Testowane w Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
Nie jest facetem od Javy, ale w JS i innych językach używam tego "Not a Number", co oznacza, że jakaś operacja spowodowała, że stała się niepoprawną liczbą.
Spieram się z tą odpowiedzią. Po pierwsze: „NaN” JEST prawidłową wartością dla float IEEE! (W końcu jest to zdefiniowane w specyfikacji ... więc jest "ważne", prawda?). Po drugie: „dzielenie przez zero” może być reprezentowane przez IEEE „Pozytywna nieskończoność” lub „Negatywna nieskończoność”; lepszym przykładem „NaN” jest „zero podzielone przez zero”, jak poprawnie wskazały inne odpowiedzi.
Dan H
„Prawidłowa wartość” i „zdefiniowana w specyfikacji” to nie to samo. Zgoda na 0/0.
Odpowiedzi:
Zaczerpnięte z tej strony :
źródło
NaN
ma ciekawą właściwość bycia tylko „numer”, która nie jest taka sama jak sama gdy porównywane. Dlatego powszechny (iw wielu językach jedyny) test, jeśli liczbax
jestNaN
następujący:boolean isNaN(x){return x != x;}
i
i niektóre języki, takie jak umowy Pythona bardzo dobrze z nim ... To może być nie tak wjava
tyNaN
oznacza „Not a Number” i jest w zasadzie reprezentacją specjalnej wartości zmiennoprzecinkowej w standardzie zmiennoprzecinkowym IEE 754 . NaN ogólnie oznacza, że wartość jest czymś, czego nie można wyrazić za pomocą prawidłowej liczby zmiennoprzecinkowej.Konwersja da tę wartość, gdy konwertowana wartość jest czymś innym, na przykład podczas konwersji ciągu, który nie reprezentuje liczby.
źródło
parseFloat()
czyparseDouble
? Albo coś innego?NaN
oznacza „Not a Number” i jest wynikiem niezdefiniowanych operacji na liczbach zmiennoprzecinkowych, takich jak na przykład dzielenie zera przez zero. (Zauważ, że chociaż dzielenie liczby niezerowej przez zero jest zwykle niezdefiniowane w matematyce, nie daje to NaN, ale dodatnią lub ujemną nieskończoność).źródło
NaN
oznacza „To nie jest liczba”. Jest to specjalna wartość zmiennoprzecinkowa, która oznacza, że wynik operacji nie został zdefiniowany lub nie można go przedstawić jako liczby rzeczywistej.Zobacz tutaj, aby uzyskać więcej informacji na temat tej wartości.
źródło
NaN oznacza Not a Number. Służy do oznaczania dowolnej wartości, która jest matematycznie niezdefiniowana. Podobnie jak dzielenie 0,0 przez 0,0. Więcej informacji można znaleźć tutaj: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Opublikuj swój program tutaj, jeśli potrzebujesz dodatkowej pomocy.
źródło
NaN = nie jest liczbą.
źródło
To nie jest liczba. Jest to powszechna reprezentacja niemożliwej wartości liczbowej w wielu językach programowania.
źródło
Minimalny działający przykład
Pierwszą rzeczą, którą musisz wiedzieć, jest to, że koncepcja NaN jest implementowana bezpośrednio na sprzęcie procesora.
Wydaje się, że wszystkie główne współczesne procesory są zgodne z IEEE 754, który określa formaty zmiennoprzecinkowe, a NaN, które są po prostu specjalnymi wartościami zmiennoprzecinkowymi, są częścią tego standardu.
Dlatego koncepcja będzie bardzo podobna w każdym języku, w tym w Javie, który po prostu emituje kod zmiennoprzecinkowy bezpośrednio do procesora.
Zanim przejdziesz dalej, możesz najpierw przeczytać następujące odpowiedzi, które napisałem:
Teraz trochę akcji w Javie. Większość interesujących funkcji, które nie są w języku podstawowym, znajduje się wewnątrz
java.lang.Float
.Nan.java
GitHub upstream .
Biegnij z:
Wynik:
Z tego uczymy się kilku rzeczy:
dziwne operacje pływające, które nie mają żadnego sensownego wyniku, dają NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
wygeneruj plik
NaN
.W C faktycznie można zażądać podniesienia sygnałów w takich operacjach w
feenableexcept
celu ich wykrycia, ale nie sądzę, aby było to ujawnione w Javie: Dlaczego dzielenie liczby całkowitej przez zero 1/0 daje błąd, ale zmiennoprzecinkowe 1 / 0,0 zwraca „Inf”?dziwne operacje, które są na granicy plus lub minus nieskończoności, dają jednak + - nieskończoność zamiast NaN
1.0f / 0.0f
log(0.0f)
0.0
prawie mieści się w tej kategorii, ale prawdopodobnie problem polega na tym, że może dojść do plusa lub minus nieskończoności, więc pozostawiono ją jako NaN.jeśli NaN jest wartością wejściową operacji zmiennoprzecinkowej, wyjście również ma tendencję do NaN
istnieje kilka możliwych wartości NaN
0x7fc00000
,0x7fc00001
,0x7fc00002
, chociaż x86_64 wydaje się wygenerować tylko0x7fc00000
.NaN i nieskończoność mają podobną reprezentację binarną.
Rozważmy kilka z nich:
Na tej podstawie potwierdzamy, co określa IEEE754:
NaN mogą być dodatnie lub ujemne (górny bit), chociaż nie ma to wpływu na normalne operacje
Testowane w Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
źródło
Nie jest facetem od Javy, ale w JS i innych językach używam tego "Not a Number", co oznacza, że jakaś operacja spowodowała, że stała się niepoprawną liczbą.
źródło
Dosłownie oznacza „To nie jest liczba”. Podejrzewam, że coś jest nie tak z procesem konwersji.
Zapoznaj się z sekcją Not A Number w tym odnośniku
źródło
Nieprawidłowa wartość zmiennoprzecinkowa (np. Wynik dzielenia przez zero)
http://en.wikipedia.org/wiki/NaN
źródło