如何在Java中实现无穷大?

Java有没有什么能代表每种数值数据types的无穷大? 它是如何实现的,我可以用它做math运算?

例如

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

我已经尝试使用非常大的数字,但我想要一个适当的, 简单的解决scheme。

double支持Infinity

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

我假设你正在使用整数math的原因。 如果是这样,通过使用Integer类的MAX_VALUE字段,可以得到与POSITIVE_INFINITY几乎相同的结果:

 Integer myInf = Integer.MAX_VALUE; 

(而对于NEGATIVE_INFINITY,则可以使用MIN_VALUE。)当然会有一些function上的差异,例如,当比较myInf和恰好是MAX_VALUE的值时:显然这个数字不小于myInf

还有一个库实际上有字段POSITIVE_INFINITY和NEGATIVE_INFINITY,但它们实际上只是MAX_VALUE和MIN_VALUE的新名称。

要使用Infinity ,可以使用支持Infinity Double : –

  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 

DoubleFloattypes有POSITIVE_INFINITY常量。

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

 Float.POSITIVE_INFINITY Float.NEGATIVE_INFINITY 

要么

 Double.POSITIVE_INFINITY Double.NEGATIVE_INFINITY 

另外你可能会发现下面的文章代表一些涉及+/-无穷大的math运算: Java浮点数错综复杂 。

只有Double和Floattypes支持POSITIVE_INFINITY常量。

对于数字包装types。

例如Double.POSITVE_INFINITY

希望这可以帮助你。

一个通用的解决scheme是引入一个新的types。 它可能涉及更多,但是它具有为任何没有定义自己的无限的types工作的优势。

如果T是定义了lteq的types,则可以用lteq定义InfiniteOr<T> ,如下所示:

 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语法。 我希望这些想法是清楚的。 但是让我把它们拼出来。

这个想法是创build一个新的types,它具有与某些已经存在的types相同的值,再加上一个特殊的值,就像你通过公共方法所能判断的一样,它的行为方式就是你想要无限的行为,例如它大于还要别的吗。 我在这里使用null来表示无穷大,因为在Java中这似乎是最直接的。

如果你想添加算术运算,决定他们应该做什么,然后执行。 如果您先处理无限个案例,然后重用原始types的有限值的现有操作,那么这可能是最简单的。

在右手无穷之前采取处理左手无穷的惯例是否有利,或者可能没有一个通用的模式,反之亦然。 如果没有尝试,我就说不出来,但是对于小于或等于( lteq ),我认为先看右手边的无穷大是比较简单的。 我注意到lteq 不是可交换的,但是addmul是; 也许这是相关的。

注意:对无限值应该发生的一个很好的定义并不总是容易的。 这是为了比较,加法和乘法,但也许不是减法。 另外,你可能要注意的是无限的基数和序数之间的区别。