如何在 Java 中实现无穷大?

对于每种数值数据类型,Java 是否有代表无穷大的东西?它是如何实现的,以便我可以使用它进行数学运算?

例如。

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

我已经尝试使用非常大的数字,但我想要一个适当的,放松解决方案。

424751 次浏览

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

DoubleFloat类型具有 POSITIVE_INFINITY常量。

用于数值包装类型。

Double.POSITIVE_INFINITY

希望这个能帮到你。

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

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

或者

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

下面这篇文章也许对你有用,它描述了一些涉及 +/-无穷大的数学运算: 错综复杂的浮点数

要使用 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 类型支持 POSITIVE_INFINITY常量。

我猜你使用整数数学是有原因的。如果是这样,您可以通过使用 Integer类的 MAX _ VALUE 字段获得与 POSITIVE _ INFINITY 在功能上几乎相同的结果:

Integer myInf = Integer.MAX_VALUE;

(对于 NEGATIVE _ INFINITY,可以使用 MIN _ VALUE。)当然会有一些功能上的差异,例如,当比较 myInf和一个恰好是 MAX _ VALUE 的值时: 很明显,这个数字不小于 myInf。另外,正如下面的评论中所指出的,递增的正无穷大将把你包裹回负数(递减的负无穷大将把你包裹回正数)。

还有一个 图书馆,它实际上包含 POSITIVE _ INFINITY 和 NEGATIVE _ INFINITY 字段,但它们实际上只是 MAX _ VALUE 和 MIN _ VALUE 的新名称。

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

如果 T是定义了 lteq的类型,那么可以用 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 语法。我希望这些想法是清楚的,但无论如何让我把它们说清楚。

我们的想法是创建一个新类型,它的值与某些已有类型的值完全相同,再加上一个特殊的值,就目前而言,你可以通过公共方法来判断这个值,它的行为完全符合你希望无穷大行为的方式,例如,它比其他任何东西都大。我在这里使用 null来表示无穷大,因为这似乎是 Java 中最直接的。

如果您想要添加算术运算,请决定它们应该做什么,然后实现它们。如果您首先处理无限情况,然后重用原始类型的有限值上的现有操作,那么这可能是最简单的。

对于采用左边无穷大优先于右边无穷大或者反之亦然的处理惯例是否有益,可能存在或者可能没有一个一般的模式; 我不试验一下就不知道,但是对于小于等于(lteq) ,我认为首先看右边无穷大更简单。我注意到 lteq没有交换的,但是 addmul是; 也许这是相关的。

注意: 想出一个关于无限值上应该发生什么的好定义并不总是容易的。它用于比较、加法和乘法,但不一定用于减法。此外,无限基数和序数之间也有区别,您可能需要注意这一点。

因为类 Number 不是 final,所以这里有一个 我在其他帖子中还没有发现这个想法。 即对类 Number 进行子类化。

这会以某种方式传递一个可以治疗的对象 作为整数,长,双,浮点数的无穷大, 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 文档中找到了另一个实现,用于 booleandouble类型的无穷大。 Https://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.3

正零和负零比较相等; 因此 表达式0.0 = =-0.0为 true,而结果0.0 >-0.0为 false 其他运算可以区分正负零; 例如,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;