如何在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
Double
和Float
types有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
不是可交换的,但是add
和mul
是; 也许这是相关的。
注意:对无限值应该发生的一个很好的定义并不总是容易的。 这是为了比较,加法和乘法,但也许不是减法。 另外,你可能要注意的是无限的基数和序数之间的区别。