Как можем да ги използваме в нашите кодове и какво ще причини NaN (не число)?
Какво означават тези три специални стойности с плаваща запетая: положителна безкрайност, отрицателна безкрайност, NaN?
Отговори (6)
Това може да е добра справка, ако искате да научите повече за числата с плаваща запетая в Java .
Положителната безкрайност е положително число, толкова голямо, че не може да бъде представено нормално. Отрицателната безкрайност е отрицателно число, толкова голямо, че не може да бъде представено нормално. NaN означава "Не е число" и е резултат от математическа операция, която не дава число - като деление на 0 на 0.
В Java класовете Double и Float имат константи за представяне и на трите случая. Те са POSITIVE_INFINITY, NEGATIVE_INFINITY и NaN.
Освен това помислете за това:
double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN
Математически всеки може да види, че е 0. Но за машината това е "Безкрайност" - "Безкрайност" (от същия ранг), което наистина е NaN.
float
и double
не само нарушават аксиомите на полето - те дори не са класове на еквивалентност. Това представлява интерес за много повече хора, отколкото само за математиците, тъй като налага използването на грозни глупости, за да работят колекциите.
- person supercat; 16.04.2014
float
, double
и т.н. нарушават аксиомите на полето, а именно асоциативността. Във всеки случай, те не трябва да бъдат основни градивни елементи за математиците, които искат да работят с истински реални числа - за тези има системи за компютърна алгебра, които могат да работят с точни числа.
- person Ruslan; 02.02.2017
- Положителна безкрайност означава отиване до безкрайност в положителна посока -- преминаване към стойности, които са все по-големи и по-големи по величина в положителна посока.
- Отрицателна безкрайност означава отиване до безкрайност в отрицателна посока -- преминаване към стойности, които са все по-големи и по-големи по величина в отрицателна посока.
- Not-a-number (NaN) е нещо, което е недефинирано, като например резултата от
0/0
.
И константите от спецификацията на Float
клас:
Повече информация можете да намерите на страницата IEEE-754 в Wikipedia.
Ето малка програма за илюстриране на трите константи:
System.out.println(0f / 0f);
System.out.println(1f / 0f);
System.out.println(-1f / 0f);
Изход:
NaN
Infinity
-Infinity
- 1/0 ще доведе до положителна безкрайност.
- 0/0 ще доведе до Nan. Можете да използвате NaN като всяко друго число, напр.: NaN+NaN=NaN, NaN+2.0=NaN
- -1/0 ще доведе до отрицателна безкрайност.
Безкрайност (в java) означава, че резултатът от операция ще бъде толкова голямо положително или отрицателно число, че не може да бъде представено нормално.
Идеята е да се представят специални числа, които могат да възникнат естествено от операции върху "нормални" числа. Можете да видите безкрайността (както положителна, така и отрицателна) като "преливане" на представянето с плаваща запетая, като идеята е, че поне при някои условия, като такава стойност, върната от функция, все още дава смислен резултат. Те все още имат някои свойства за подреждане, например (така че няма да прецакат операциите за сортиране, например).
Nan е много конкретен: ако x е Nan, x == x е невярно (това всъщност е един от начините за тестване за nan, поне в C, отново). Това може да бъде доста объркващо, ако не сте свикнали с особеностите на плаващата запетая. Освен ако не правите научни изчисления, бих казал, че връщането на Nan чрез операция е грешка, поне в повечето случаи, които ви идват на ум. Nan може да дойде за различни операции: 0/0, inf - inf, inf/inf, 0 * inf. Nan също няма собственост за подреждане.
Можете да ги използвате като всеки друг номер:
e.g:
float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
Положителната безкрайност е положително число, толкова голямо, че не може да бъде представено нормално. Отрицателната безкрайност е отрицателно число, толкова голямо, че не може да бъде представено нормално. NaN означава „Не е число“ и е резултат от математическа операция, която не дава число- като деление на 0 на 0.
това не е пълен отговор (или не е достатъчно изяснен) - помислете за това:
double a = Math.pow(10,600) - Math.pow(10,600); //==NaN
математически всеки може да види, че е 0. но за машината това е "Безкрайност" - "Безкрайност" (от същия порядък), която наистина е NaN...