164

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

例如

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

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

4

11 回答 11

223

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

于 2012-10-18T10:04:20.667 回答
56

我假设您使用整数数学是有原因的。如果是这样,您可以通过使用该类的 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 的新名称。

于 2013-07-31T14:21:57.317 回答
12

要使用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
于 2012-10-18T10:06:03.327 回答
6

Double类型Float具有POSITIVE_INFINITY常数。

于 2012-10-18T10:04:32.227 回答
4

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

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

或者

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

此外,您可能会发现以下文章很有用,它代表了一些涉及 +/- 无穷大的数学运算:Java Floating-Point Number Intricacies

于 2012-10-18T10:05:46.673 回答
4

只有 Double 和 Float 类型支持POSITIVE_INFINITY常量。

于 2012-10-18T10:25:13.797 回答
3

整数无穷大:

  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;
于 2021-04-05T20:06:22.747 回答
2

对于数字包装器类型。

例如 Double.POSITVE_INFINITY

希望这可以帮助你。

于 2012-10-18T10:05:29.720 回答
2

一个通用的解决方案是引入一种新类型。它可能涉及更多,但它具有适用于任何未定义其自身无穷大的类型的优势。

如果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可交换的,而是和是;也许这是相关的。addmul

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

于 2016-07-08T13:24:01.547 回答
0

由于课程编号不是最终的,这里有一个想法,我在其他帖子中还没有找到。即对类号进行子类化。

这将以某种方式提供一个对象,该对象可以被视为 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() 等应该被覆盖以引发异常。因此,如果没有进一步的预防措施,就无法使用无穷大值。

于 2019-03-08T16:29:54.523 回答
0

我是 Java 的初学者...我在 Java 文档中找到了另一个实现 infinity 的booleananddouble类型。 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);
    }

}
于 2020-06-02T14:12:57.260 回答