Есть ли в Java что-нибудь, что представляет бесконечность для каждого числового типа данных? Как это реализовано так, что я могу делать математические операции с ним?
Например
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
Я пытался использовать очень большие числа, но я хочу правильное и простое решение.
∞-∞==0
быть правдой? А также: зачем тебе такая вещь?Ответы:
double
поддерживает бесконечностьпечать
примечание:
Infinity - Infinity
это не число .источник
float
возможности, так как его точность довольно низкая. ;)Я полагаю, вы используете целочисленную математику по причине. Если это так, вы можете получить результат, который функционально почти такой же, как POSITIVE_INFINITY, используя поле MAX_VALUE
Integer
класса:(А для NEGATIVE_INFINITY вы можете использовать MIN_VALUE.) Конечно, будут некоторые функциональные различия, например, при сравнении
myInf
со значением, которое оказывается MAX_VALUE: ясно, что это число не меньше, чемmyInf
.Есть также библиотека, которая на самом деле имеет поля POSITIVE_INFINITY и NEGATIVE_INFINITY, но на самом деле это просто новые имена для MAX_VALUE и MIN_VALUE.
источник
Integer.MAX_VALUE
как бесконечности, а не какDouble.POSITIVE_INFINITY
вы сказали, что они «практически одинаковы», так в чем же разница?Integer.MAX_VALUE
по-прежнему конечно, это просто взломать для имитации бесконечности. Кроме того,Integer.MAX_VALUE
только 32-битные, аDouble.POSITIVE_INFINITY
64-битные.Чтобы использовать
Infinity
, вы можете использоватьDouble
который поддерживаетInfinity
: -ВЫХОД : -
источник
Double
ИFloat
типы имеютPOSITIVE_INFINITY
постоянную.источник
Я не уверен, что в Java есть бесконечность для каждого числового типа, но для некоторых числовых типов данных ответ положительный:
или
Также вам может пригодиться следующая статья, в которой представлены некоторые математические операции, включающие бесконечность +/-: Java-числа с плавающей запятой .
источник
Только Double и Float поддерживают
POSITIVE_INFINITY
константу.источник
Для числовых типов оболочек.
например, Double.POSITVE_INFINITY
Надеюсь, это поможет вам.
источник
Общее решение состоит в том, чтобы ввести новый тип. Он может быть более сложным, но имеет преимущество работы с любым типом, который не определяет свою бесконечность.
Если
T
это тип , для которогоlteq
определяется, вы можете определить ,InfiniteOr<T>
сlteq
чем - то вроде этого:Я оставлю это вам, чтобы перевести это на точный синтаксис Java. Я надеюсь, что идеи ясны; но позвольте мне разобрать их в любом случае.
Идея состоит в том, чтобы создать новый тип, который имеет все те же значения, что и некоторый уже существующий тип, плюс одно специальное значение, которое, насколько вы можете судить с помощью открытых методов, действует именно так, как вы хотите, чтобы бесконечность действовала, например, она больше, чем что-нибудь еще. Я использую,
null
чтобы представить бесконечность здесь, так как это кажется самым простым в Java.Если вы хотите добавить арифметические операции, решите, что они должны делать, а затем реализуйте это. Вероятно, проще всего сначала обработать бесконечные случаи, а затем повторно использовать существующие операции с конечными значениями исходного типа.
Может существовать или не существовать общая закономерность того, выгодно или нет принять соглашение об обработке бесконечностей левой стороны перед бесконечностью правой стороны или наоборот; Я не могу сказать, не попробовав это, но для менее или равно (
lteq
) я думаю, что проще сначала взглянуть на бесконечность с правой стороны. Хочу отметить , чтоlteq
это не коммутативной, ноadd
иmul
являются; может быть, это актуально.Примечание: придумать хорошее определение того, что должно происходить с бесконечными значениями, не всегда легко. Это для сравнения, сложения и умножения, но, возможно, не вычитания. Кроме того, существует различие между бесконечными кардинальными и порядковыми числами, на которые вы можете обратить внимание.
источник
-(yourvalue)
работать должным образом. И это также позволит вам поддержать концепцию NaN (не число). Кроме того, добавление специальных значений поверх целочисленных типов может быть хорошей идеей, особенно когда приложению нужна семантика, которая нарушается числами с плавающей запятой.Так как класс Number не окончательный, вот идея, которую я пока не нахожу в других постах. А именно для подкласса класса Number.
Это каким-то образом доставит объект, который можно рассматривать как бесконечность для Integer, Long, Double, Float, BigInteger и BigDecimal.
Поскольку существует только два значения, мы можем использовать шаблон синглтона:
Каким-то образом я думаю, что остальные методы intValue (), longValue () и т. Д. Должны быть переопределены, чтобы вызвать исключения. Так что значение бесконечности не может быть использовано без дополнительных мер предосторожности.
источник
Я новичок в Java ... Я нашел другую реализацию бесконечности в документации Java, для
boolean
иdouble
типов. https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3Это выглядит некрасиво, но это работает.
источник