如何在Java中实现无穷大?

问题描述 投票:119回答:9

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

EG

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

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

java double infinity
9个回答
169
投票

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


30
投票

我假设你使用整数数学是有原因的。如果是这样,通过使用Integer类的MAX_VALUE字段,您可以获得与POSITIVE_INFINITY功能几乎相同的结果:

Integer myInf = Integer.MAX_VALUE;

(对于NEGATIVE_INFINITY,您可以使用MIN_VALUE。)当然会有一些功能差异,例如,当将myInf与恰好是MAX_VALUE的值进行比较时:显然这个数字不小于myInf

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


11
投票

要使用Infinity,你可以使用支持DoubleInfinity: -

    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

5
投票

DoubleFloat类型具有POSITIVE_INFINITY常数。


4
投票

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

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

要么

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

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


3
投票

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


2
投票

对于数字包装器类型。

例如Double.POSITVE_INFINITY

希望这可能对你有所帮助。


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是;也许这是相关的。

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


0
投票

由于班级编号不是最终的,这是一个想法,我在其他帖子中还没有找到。即为子类Number。

这会以某种方式传递一个对象,可以将其视为Infinity,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()等应该被覆盖以抛出异常。因此,如果没有进一步的预防措施,无法使用无限值​​。

© www.soinside.com 2019 - 2024. All rights reserved.