如何在Java中实现无穷大?

如何在Java中实现无穷大?,java,integer,double,long-integer,infinity,Java,Integer,Double,Long Integer,Infinity,对于每种数字数据类型,Java都有表示无穷大的东西吗?它是如何实现的,我可以用它做数学运算 例如 我尝试过使用非常大的数字,但我想要一个合适的、简单的解决方案。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

对于每种数字数据类型,Java都有表示无穷大的东西吗?它是如何实现的,我可以用它做数学运算

例如


我尝试过使用非常大的数字,但我想要一个合适的、简单的解决方案。

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
不是一个数字。

双精度和
Float
类型具有
正无穷
常量。

用于数字包装类型

e、 g双正无穷大


希望这能对您有所帮助。

我不确定Java对于每种数字类型都有无穷大,但对于某些数字数据类型,答案是肯定的:

Float.POSITIVE_INFINITY
Float.NEGATIVE_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

只有Double和Float类型支持正无穷大
常量。

我想您使用整数数学是有原因的。如果是这样,您可以通过使用
Integer
类的MAX_VALUE字段获得功能上几乎与正无穷大相同的结果:

Integer myInf = Integer.MAX_VALUE;
(对于负无穷大,您可以使用最小值。)当然会有一些功能上的差异,例如,当将
myInf
与恰好是最大值的值进行比较时:显然这个数字不小于
myInf
。此外,正如下面的评论所指出的,增加正无穷大将使您返回负数(减少负无穷大将使您返回正数)


还有一些字段实际上有正无穷大和负无穷大,但它们实际上只是最大值和最小值的新名称。

一般的解决方案是引入一种新类型。它可能更复杂,但它的优点是适用于任何不定义自身无限的类型

如果
T
是定义了
lteq
的类型,则可以使用
lteq
定义
InfiniteOr
,如下所示:

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
是可交换的;也许这是相关的


注意:对无穷大的值给出一个好的定义并不总是容易的。它用于比较、加法和乘法,但可能不是减法。此外,您可能需要注意无限基数和序数之间的区别。

由于类号不是最终的,下面是一个示例 这个想法,我在其他帖子中还没有找到。 也就是对类号进行子类化

这将以某种方式提供一个可以处理的对象 整数、长、双精度、浮点的无穷大, 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() 等然后应重写以引发异常。以便 如果没有进一步的预防措施,就不能使用无穷大值。

我是Java初学者。。。 我在Java文档中找到了另一个infinity实现,用于
boolean
double
类型。

正零和负零比较相等;因此 表达式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);
    }

}
整数无穷大:

  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;

有无限多个无穷大,您希望对哪一个进行建模?为什么要
∞-∞==0
是否为真?还有:为什么需要这样的东西?我尽量避免使用
float
,因为它的精度很差像Dijkstra这样实现算法让我怀疑是否正无穷<正无穷。@user1753100:默认情况下不是,但是一些库,比如这个:显然实现它。将无限值限制为双倍和浮点似乎是任意的。它们的最大值比整数的最大值更接近无穷大,但距离不远。@PatrickBrinich-Langlois浮点类型(如double和float)通常能够直接表示无穷大(即,有一个位模式专门表示“无穷大”,与类型的最大值不同)。Double和Float有MAX_值,与Integer相同。“它们的最大值比整数的最大值更接近无穷大,但不太接近。”。任何有限数都离无穷远;)Integer.MAX_值+5是多少?
  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;