Подтвердить что ты не робот

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

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

например.

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

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

4b9b3361

Ответ 1

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 - это не номер.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

или

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

Если 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 являются; возможно, это актуально.

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