Как реализовать бесконечность в Java?

Есть ли в Java что-нибудь, что могло бы представлять бесконечность для каждого числового типа данных? Как это реализовано, чтобы я мог выполнять с ним математические операции?

E.g.

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

Я пробовал использовать очень большие числа, но мне нужно подходящее, простое решение.


person user1753100    schedule 18.10.2012    source источник
comment
существует бесконечное количество бесконечностей, какую из них вы хотели бы смоделировать?   -  person Dave Richardson    schedule 18.10.2012
comment
Почему ∞-∞==0 должно быть правдой? А также: Зачем вам такая вещь?   -  person brimborium    schedule 18.10.2012


Ответы (11)


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 - не число.

person Peter Lawrey    schedule 18.10.2012
comment
Я избегаю использования float, когда это возможно, поскольку его точность довольно низкая. ;) - person Peter Lawrey; 18.10.2012
comment
Реализация алгоритмов вроде Дейкстры заставляет меня задаться вопросом, действительно ли POSITIVE_INFINITY ‹POSITIVE_INFINITY. - person Joey Carson; 21.11.2013

Я полагаю, вы не зря используете целочисленную математику. Если это так, вы можете получить результат, который функционально почти такой же, как 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.

person JohnK    schedule 31.07.2013
comment
Сколько стоит Integer.MAX_VALUE + 5? - person Erwin Smout; 20.07.2015
comment
Integer.MAX_VALUE + 5 превращается в отрицательные целые числа. Целое.MAX_VALUE + 5 = Целое.MIN_VALUE + 4 = -2147483644. - person Erick G. Hagstrom; 11.08.2015
comment
В чем разница между использованием Integer.MAX_VALUE в качестве бесконечности, а не Double.POSITIVE_INFINITY, вы сказали, что они «функционально почти одинаковы», так в чем же разница? - person ahitt6345; 02.07.2017
comment
@ ahitt6345 Integer.MAX_VALUE по-прежнему конечен, это просто хитрость для имитации бесконечности. Кроме того, Integer.MAX_VALUE только 32-битный, тогда как Double.POSITIVE_INFINITY 64-битный. - person mgthomas99; 19.09.2017
comment
Спасибо, @GeorgeThomas. Да, использовать любое конечное значение для представления бесконечности - это хитрость. Но пока не будет способа представить бесконечность в целых числах, какая альтернатива в целых числах? - person JohnK; 19.09.2017
comment
Integer.MAX_VALUE - допустимое число, которое можно использовать во вводе. op запросил бесконечность, которая является НЕ числом, а математическим символом. - person refaelio; 03.04.2019
comment
@ yarden.refaeli, поэтому я сказал, что функционально почти то же самое, а также объяснил, когда это не сработает. - person JohnK; 03.04.2019
comment
Да, это иногда полезно, но в случаях, когда вы обновляете это значение (особенно увеличиваете его), вы должны быть особенно осторожны, так как это может вызвать переполнение и оставить вас с очень маленьким значением вместо действительно большого! - person Lan Vukušič; 23.12.2020

Чтобы использовать 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
person Rohit Jain    schedule 18.10.2012

Типы Double и Float имеют константу POSITIVE_INFINITY.

person Tudor    schedule 18.10.2012
comment
@ user1753100: По умолчанию нет, но некоторые библиотеки, например эта: jscience.org, очевидно, реализуют это. - person Tudor; 18.10.2012
comment
Кажется произвольным ограничивать бесконечные значения числами Double и Floats. Их максимальные значения ближе к бесконечности, чем максимальное значение целых чисел, но не намного ближе. - person Patrick Brinich-Langlois; 28.05.2013
comment
Типы с плавающей запятой @ PatrickBrinich-Langlois (такие как double и float) обычно могут напрямую выражать бесконечность (т.е. существует битовый шаблон, который конкретно означает «бесконечность», отличный от максимального значения типа). Double и Float имеют MAX_VALUE, как и Integer. - person David Morris; 06.11.2013
comment
Их максимальные значения ближе к бесконечности, чем максимальное значение целых чисел, но не намного ближе .. Любое конечное число бесконечно удалено от бесконечности;) - person carlsb3rg; 15.04.2016

Я не уверен, что в Java есть бесконечность для каждого числового типа, но для некоторых числовых типов данных ответ положительный:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

or

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

Также вам может быть полезна следующая статья, в которой представлены некоторые математические операции с использованием +/- бесконечности: Java Проблемы с числами с плавающей точкой.

person Akos K    schedule 18.10.2012

Только типы Double и Float поддерживают константу POSITIVE_INFINITY.

person NKM    schedule 18.10.2012

Для числовых типов оболочки.

например, Double.POSITVE_INFINITY

Надеюсь, это поможет тебе.

person Ankit HTech    schedule 18.10.2012
comment
Не для всех типов числовых оболочек. Только для Double и Float. - person Erick G. Hagstrom; 11.08.2015

Общее решение - ввести новый тип. Он может быть более сложным, но он имеет то преимущество, что работает с любым типом, который не определяет собственную бесконечность.

Если 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 для представления бесконечности здесь, поскольку это кажется наиболее простым в Java.

Если вы хотите добавить арифметические операции, решите, что они должны делать, а затем реализуйте это. Это, вероятно, проще всего, если вы сначала обрабатываете бесконечные случаи, а затем повторно используете существующие операции с конечными значениями исходного типа.

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

Примечание: придумать хорошее определение того, что должно происходить с бесконечными значениями, не всегда легко. Это для сравнения, сложения и умножения, но, возможно, не для вычитания. Кроме того, существует различие между бесконечными количественными и порядковыми числами, на которые вы, возможно, захотите обратить внимание.

person Jonas Kölker    schedule 08.07.2016
comment
Возможно, стоит использовать дополнительное поле перечисления для представления дополнительных состояний, так что вы также можете иметь отрицательную бесконечность, что часто желательно и заставляет -(yourvalue) работать должным образом. И это также позволит вам поддерживать концепцию NaN (не числа). Кроме того, добавление специальных значений поверх целочисленных типов может быть хорошей идеей, особенно когда приложению требуется семантика, которая нарушается числами с плавающей запятой. - person blubberdiblub; 12.02.2017

Поскольку класс Number не является окончательным, вот идея, которую я еще не нашел в других сообщениях. А именно создать подкласс класса Number.

Это каким-то образом доставляет объект, который можно рассматривать как бесконечность для Integer, Long, Double, Float, BigInteger и BigDecimal.

Поскольку есть только два значения, мы могли бы использовать шаблон singleton:

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 () и т. Д. Должны быть переопределены, чтобы генерировать исключения. Так что значение бесконечности нельзя использовать без дополнительных мер предосторожности.

person Mostowski Collapse    schedule 08.03.2019

Я новичок в 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);
    }

}
person Kislik    schedule 02.06.2020

Целочисленная бесконечность:

  Integer maxNumber = Integer.MAX_VALUE

Двойная бесконечность

  Double maxNumber = Double.MAX_VALUE;
  Double positiveInf = Double.POSITIVE_INFINITY;
  Double negativeInf = Double.NEGATIVE_INFINITY

Плавающая бесконечность

   Float positiveInf = Float.POSITIVE_INFINITY;
   Float negativeInf = Float.NEGATIVE_INFINITY
   Float maxNumber = Float.MAX_VALUE;
person Sneha Mule    schedule 05.04.2021
comment
Я считаю Integer.MAX_VALUE достижимым значением, поэтому ему можно сопоставить представимое количество цифр. Это не всегда имеет значение, поскольку большее число невозможно, так как +1 будет переполняться до Integer.MIN_VALUE. Тем не менее, это не совсем то же самое, что Infinity? - person Craig.C; 20.05.2021
comment
Однако вы можете использовать MAX_VALUE во многих ситуациях, например, при сортировке слиянием, где его можно использовать в качестве контрольного значения. Если, например, вы хотели вернуть наименьшее из пары, и вам довелось сравнить дозор со значением 2147483647, встречающимся в вашем списке. Неважно, что вы вернете. - person Craig.C; 20.05.2021
comment
Единственная проблема заключается в том, что если у вас есть правильная комбинация MAX_VALUE во входных данных, вы можете выполнять итерацию за пределами индекса вашего массива. В этот момент вы можете также отбросить дозорного и просто проверить длину списка. - person Craig.C; 20.05.2021