对于每种数值数据类型,Java 是否有任何东西可以表示无穷大?它是如何实现的,以便我可以用它进行数学运算?
例如
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
我尝试过使用非常大的数字,但我想要一个适当、简单的解决方案。
对于每种数值数据类型,Java 是否有任何东西可以表示无穷大?它是如何实现的,以便我可以用它进行数学运算?
例如
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
我尝试过使用非常大的数字,但我想要一个适当、简单的解决方案。
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
不是数字。
我假设您使用整数数学是有原因的。如果是这样,您可以通过使用该类的 MAX_VALUE 字段获得在功能上与 POSITIVE_INFINITY 几乎相同的结果Integer
:
Integer myInf = Integer.MAX_VALUE;
(对于 NEGATIVE_INFINITY,您可以使用 MIN_VALUE。)当然会有一些功能差异,例如,当与myInf
恰好是 MAX_VALUE 的值进行比较时:显然这个数字不小于myInf
。此外,正如下面的评论中所指出的,增加正无穷大将使您回到负数(而减少负无穷大将使您回到正数)。
还有一个库实际上具有字段 POSITIVE_INFINITY 和 NEGATIVE_INFINITY,但它们实际上只是 MAX_VALUE 和 MIN_VALUE 的新名称。
要使用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
和Double
类型Float
具有POSITIVE_INFINITY
常数。
我不确定 Java 是否对每种数值类型都有无穷大,但对于某些数值数据类型,答案是肯定的:
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
或者
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
此外,您可能会发现以下文章很有用,它代表了一些涉及 +/- 无穷大的数学运算:Java Floating-Point Number Intricacies。
只有 Double 和 Float 类型支持POSITIVE_INFINITY
常量。
整数无穷大:
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;
对于数字包装器类型。
例如 Double.POSITVE_INFINITY
希望这可以帮助你。
一个通用的解决方案是引入一种新类型。它可能涉及更多,但它具有适用于任何未定义其自身无穷大的类型的优势。
如果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
注意:想出一个关于无限值应该发生什么的良好定义并不总是那么容易。它用于比较,加法和乘法,但可能不是减法。此外,您可能需要注意无限基数和序数之间的区别。
由于课程编号不是最终的,这里有一个想法,我在其他帖子中还没有找到。即对类号进行子类化。
这将以某种方式提供一个对象,该对象可以被视为 Integer、Long、Double、Float、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
anddouble
类型。
https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3
正零和负零比较相等;因此表达式 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);
}
}