Як реалізувати нескінченність на Java?


138

Чи має Java що-небудь представляти нескінченність для кожного числового типу даних? Як це реалізовано так, що я можу робити з ним математичні операції?

Напр

int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity

Я намагався використовувати дуже велику кількість, але хочу правильне, просте рішення.


10
є нескінченна кількість нескінченностей, яку з них ви б хотіли моделювати?
Дейв Річардсон

11
Чому має ∞-∞==0бути правдою? А також: Навіщо вам таке потрібно?
brimborium

Відповіді:


190

double підтримує нескінченність

double inf = Double.POSITIVE_INFINITY;
System.out.println(inf + 5);
System.out.println(inf - inf); // same as Double.NaN
System.out.println(inf * -1); // same as Double.NEGATIVE_INFINITY

відбитки

Infinity
NaN
-Infinity

Примітка: Infinity - Infinityце не числиться .


23
Я уникаю використання, floatколи це можливо, оскільки його точність є досить поганою. ;)
Пітер Лорі

3
Реалізація таких алгоритмів, як Dijkstra, змушує мене запитати, чи POSITIVE_INFINITY <POSITIVE_INFINITY чи ні.
Джої Карсон

41

Я припускаю, що ви використовуєте цілу математику з причини. Якщо так, ви можете отримати результат, який функціонально майже такий самий, як POSITIVE_INFINITY, використовуючи поле MAX_VALUE Integerкласу:

Integer myInf = Integer.MAX_VALUE;

(І для NEGATIVE_INFINITY ви можете використовувати MIN_VALUE.) Звичайно, існують деякі функціональні відмінності, наприклад, при порівнянні myInfзі значенням, яке трапляється як MAX_VALUE: явно це число не менше myInf.

Також є бібліотека, яка насправді має поля POSITIVE_INFINITY та NEGATIVE_INFINITY, але вони справді лише нові імена для MAX_VALUE та MIN_VALUE.


11
Скільки коштує Integer.MAX_VALUE + 5?
Ервін Смоут

9
Integer.MAX_VALUE + 5 обгортань у мінусові цілі числа. Integer.MAX_VALUE + 5 = Integer.MIN_VALUE + 4 = -2147483644.
Ерік Г. Хагстром

У чому різниця між використанням Integer.MAX_VALUEяк нескінченності, а не Double.POSITIVE_INFINITYви сказали, що вони "функціонально майже однакові", і в чому різниця?
ahitt6345

1
@ ahitt6345 Integer.MAX_VALUEвсе ще кінцевий, це лише хак для імітації нескінченності. Крім того, Integer.MAX_VALUEє лише 32-біт, тоді Double.POSITIVE_INFINITYяк 64-бітний.
mgthomas99

1
Integer.MAX_VALUE - дійсне число, яке можна використовувати у вашому введенні. op попросив нескінченність, яка НЕ ​​число, а математичний символ.
refaelio

11

Для використання Infinityви можете використовувати такі Doubleпідтримувачі Infinity: -

    System.out.println(Double.POSITIVE_INFINITY);
    System.out.println(Double.POSITIVE_INFINITY * -1);
    System.out.println(Double.NEGATIVE_INFINITY);

    System.out.println(Double.POSITIVE_INFINITY - Double.NEGATIVE_INFINITY);
    System.out.println(Double.POSITIVE_INFINITY - Double.POSITIVE_INFINITY);

ВИХІД : -

Infinity
-Infinity
-Infinity

Infinity 
NaN

5

DoubleІ Floatтипи мають POSITIVE_INFINITYпостійну.


@ user1753100: За замовчуванням ні, але деякі бібліотеки, як ця: jscience.org реалізують це, мабуть ,.
Тудор

1
Здається довільним обмеження нескінченних значень парними і поплавковими. Їх максимальні значення ближче до нескінченності, ніж максимальне значення Цілих чисел, але не набагато ближче.
Патрік Брініх-Ланглуа

3
@ Типи з плаваючою комою PatrickBrinich-Langlois (такі як подвійний і плаваючий), як правило, здатні безпосередньо виражати нескінченність (тобто, є бітова картина, яка конкретно означає "нескінченність", відмінна від максимального значення типу). Double і Float мають MAX_VALUE, спільного з Integer.
Девід Морріс

7
"Їх максимальні значення ближче до нескінченності, ніж максимальне значення Цілих чисел, але не набагато ближче." Будь-яке кінцеве число - нескінченність від нескінченності;)
carlsb3rg

4

Я не впевнений, що Java має нескінченність для кожного числового типу, але для деяких числових типів даних відповідь позитивна:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

або

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

Також вам може бути корисна наступна стаття, яка представляє деякі математичні операції, пов’язані з нескінченністю +/-: Внутрішність числа з плаваючою точкою Java .


4

Підтримка POSITIVE_INFINITYпостійної підтримує лише тип Double та Float .


2

Для числових типів обгортки.

напр. Double.POSITVE_INFINITY

Сподіваюся, це може вам допомогти.


1
Не для всіх числових типів обгортки. Просто для Double та Float.
Ерік Г. Хагстром

2

Узагальненим рішенням є впровадження нового типу. Це може бути більше залученим, але це має перевагу працювати для будь-якого типу, який не визначає власну нескінченність.

Якщо Tце тип , для якого lteqвизначається, ви можете визначити , InfiniteOr<T>з lteqчим - щось на зразок цього:

class InfiniteOr with type parameter T:
    field the_T of type null-or-an-actual-T
    isInfinite()
        return this.the_T == null
    getFinite():
        assert(!isInfinite());
        return this.the_T
    lteq(that)
        if that.isInfinite()
            return true
        if this.isInfinite()
            return false
        return this.getFinite().lteq(that.getFinite())

Я залишу це вам, щоб перекласти це в точний синтаксис Java. Сподіваюся, ідеї зрозумілі; але дозвольте мені все-таки прописати їх.

Ідея полягає у створенні нового типу, який має всі ті ж значення, що і деякий вже існуючий тип, плюс одне спеціальне значення, яке - наскільки ви можете сказати за допомогою публічних методів - діє саме так, як ви хочете діяти нескінченність, наприклад, це більше, ніж будь-що інше. Я використовуюnull для представлення нескінченності, оскільки це здається найпростішим на Яві.

Якщо ви хочете додати арифметичні операції, вирішіть, що вони повинні робити, то реалізуйте це. Це, мабуть, найпростіше, якщо спочатку обробити нескінченні випадки, а потім повторно використовувати існуючі операції на кінцевих значеннях оригінального типу.

Може існувати загальна закономірність того, чи корисно приймати конвенцію поводження з лівими сторонами перед нескінченностями правого боку чи навпаки; Я не можу сказати, не спробувавши це, але для менших рівних ( lteq) я думаю, що простіше спочатку подивитися на нескінченність праворуч. Зауважу, що lteqце не комутативно, але addіmul є; можливо, це актуально.

Примітка: придумати чітке визначення того, що має відбуватися з нескінченними значеннями, не завжди легко. Це для порівняння, додавання та множення, але, можливо, не віднімання. Також існує розмежування нескінченних кардинальних і порядкових чисел, на які ви можете звернути увагу.


Можливо, варто використати додаткове поле перерахунку для представлення додаткових станів, так що ви також можете мати негативну нескінченність , що часто бажано і змушує -(yourvalue)працювати належним чином. І це також дозволить вам підтримати концепцію NaN (не число). Крім того, додавання спеціальних значень поверх інтегральних типів може бути хорошою ідеєю, особливо коли додатку потрібна семантика, яка порушується числами з плаваючою комою.
blubberdiblub

0

Оскільки номер класу не є остаточним, ось ідея, яку я ще не знаходжу в інших публікаціях. А саме підкласи класу Number.

Це якось доставить об'єкт, який можна розглядати як нескінченність для Integer, Long, Double, Float, BigInteger та BigDecimal.

Оскільки є лише два значення, ми можемо використовувати одинарний візерунок:

public final class Infinity extends Number {
    public final static Infinity POSITIVE = new Infinity(false);
    public final static Infinity NEGATIVE = new Infinity(true);
    private boolean negative;
    private Infinity(boolean n) {
        negative = n;
    }
}

Я чомусь думаю, що решта методів intValue (), longValue () і т. Д. Повинні бути скасовані, щоб викинути винятки. Так що значення нескінченності не можна використовувати без додаткових запобіжних заходів.


0

Я початківець в Java ... Я знайшов іншу реалізацію для нескінченності в документації на Java, для booleanі doubleтипів. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

Позитивний нуль і від’ємний нуль порівняти рівні; таким чином результат виразу 0,0 == - 0,0 є істинним, а результат 0,0> -0,0 - хибним. Але в інших операціях можна виділити позитивний і негативний нуль; наприклад, 1,0 / 0,0 має значення позитивної нескінченності, тоді як значення 1,0 / -0,0 - негативна нескінченність.

Це виглядає некрасиво, але це працює.

public class Main {

    public static void main(String[] args) {
        System.out.println(1.0/0.0);
        System.out.println(-1.0/0.0);
    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.