Какво означават тези три специални стойности с плаваща запетая: положителна безкрайност, отрицателна безкрайност, NaN?

Как можем да ги използваме в нашите кодове и какво ще причини NaN (не число)?


person Johanna    schedule 17.06.2009    source източник


Отговори (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.

person Cameron    schedule 17.06.2009
comment
Опитах се да поправя повредената връзка, но беше отхвърлена. Ето един наистина добър ресурс, който включва също QA раздел с връзки за по-нататъшно проучване . - person Michael Hogenson; 12.07.2013
comment
Не съм съгласен с характеристиката (тук и другаде), че положителната безкрайност е толкова голямо число, че не може да бъде представено нормално. То може да бъде толкова голямо число, че да не може да бъде представено като нормално плаващо число, но на практика обикновено произлиза от нещо като 5f/0f, което не е голямо (реално) число; това е наивна версия на безкрайността. (Технически +inf, -inf и NaN са разширения на Reals, които осигуряват затваряне на всяка аритметична операция, но с цената на нарушаване на основните аксиоми на полето. Това няма голямо значение за компютърните учени, има за математиците). - person Peter Webb; 14.08.2013
comment
@PeterWebb: Фактът, че NaN за съжаление беше дефиниран не само като некласиран, но и като неравен на себе си, означава, че float и double не само нарушават аксиомите на полето - те дори не са класове на еквивалентност. Това представлява интерес за много повече хора, отколкото само за математиците, тъй като налага използването на грозни глупости, за да работят колекциите. - person supercat; 16.04.2014
comment
@PeterWebb всъщност дори без ±inf/NaN 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
person coobird    schedule 17.06.2009
comment
но мисля, че 1/0 ще доведе до положителна безкрайност :-? - person Johanna; 17.06.2009
comment
Да, прав си - това беше моя грешка и тя беше поправена. - person coobird; 17.06.2009

  • 1/0 ще доведе до положителна безкрайност.
  • 0/0 ще доведе до Nan. Можете да използвате NaN като всяко друго число, напр.: NaN+NaN=NaN, NaN+2.0=NaN
  • -1/0 ще доведе до отрицателна безкрайност.

Безкрайност (в java) означава, че резултатът от операция ще бъде толкова голямо положително или отрицателно число, че не може да бъде представено нормално.

person kadam    schedule 17.06.2009

Идеята е да се представят специални числа, които могат да възникнат естествено от операции върху "нормални" числа. Можете да видите безкрайността (както положителна, така и отрицателна) като "преливане" на представянето с плаваща запетая, като идеята е, че поне при някои условия, като такава стойност, върната от функция, все още дава смислен резултат. Те все още имат някои свойства за подреждане, например (така че няма да прецакат операциите за сортиране, например).

Nan е много конкретен: ако x е Nan, x == x е невярно (това всъщност е един от начините за тестване за nan, поне в C, отново). Това може да бъде доста объркващо, ако не сте свикнали с особеностите на плаващата запетая. Освен ако не правите научни изчисления, бих казал, че връщането на Nan чрез операция е грешка, поне в повечето случаи, които ви идват на ум. Nan може да дойде за различни операции: 0/0, inf - inf, inf/inf, 0 * inf. Nan също няма собственост за подреждане.

person David Cournapeau    schedule 17.06.2009

Можете да ги използвате като всеки друг номер:

e.g:

float min = Float.NEGATIVE_INFINITY;
float max = Float.POSITIVE_INFINITY;
float nan = Float.NaN;
person Freddy    schedule 17.06.2009

Положителната безкрайност е положително число, толкова голямо, че не може да бъде представено нормално. Отрицателната безкрайност е отрицателно число, толкова голямо, че не може да бъде представено нормално. NaN означава „Не е число“ и е резултат от математическа операция, която не дава число- като деление на 0 на 0.

това не е пълен отговор (или не е достатъчно изяснен) - помислете за това:

double a = Math.pow(10,600) - Math.pow(10,600); //==NaN

математически всеки може да види, че е 0. но за машината това е "Безкрайност" - "Безкрайност" (от същия порядък), която наистина е NaN...

person Alex    schedule 30.03.2016
comment
Ако цитирате отговор, обикновено е по-добре да го оставите като коментар или като предложение за редакция. Отговорите трябва да могат да стоят самостоятелно. - person chrisbajorin; 30.03.2016
comment
добре, не знаех, че мога да редактирам други публикации... като git :) - person Alex; 30.03.2016