如何实现无限在Java中?(How to implement infinity in Java?)

2019-06-18 14:01发布

难道Java的有什么表示无穷,每数值数据类型? 它是如何实现的,这样我可以做数学运算呢?

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

我一直在使用非常大的数字试过,但我希望有一个合适的, 简单的解决方案。

Answer 1:

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



Answer 2:

我假设你正在使用整数运算的一个原因。 如果是这样,你可以得到一个结果,这是功能上几乎与使用的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只是新的名称。



Answer 3:

要使用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


Answer 4:

DoubleFloat类型有POSITIVE_INFINITY不变。



Answer 5:

我不知道Java有无穷的每一个数值类型,但由于某种数值数据类型的答案是肯定的:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

要么

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

你还可以找到有用下面的文章表示,涉及+/-无穷大一些数学运算: Java的浮点数余光中 。



Answer 6:

只有double和float类型支持POSITIVE_INFINITY不变。



Answer 7:

对于数值包装类型。

例如Double.POSITVE_INFINITY

希望这可以帮助你。



Answer 8:

一个通用的解决方案是引入一个新类型。 这可能是更复杂,但它对于任何类型的没有定义自己的无限合作的优势。

如果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语法。 我希望的想法是明确的; 但让我拼出来反正。

我们的想法是创建一个新的类型,其具有所有的相同的价值观一些已经存在的类型,再加上一个特殊值,只要你可以通过public方法,行为告诉正是你想要无限行事的方式,例如,它是大于还要别的吗。 我使用的是null在这里表示无穷大,因为这似乎是最简单的Java编写的。

如果你想添加的算术运算,决定他们应该做的事情,然后实现。 如果你处理了无限的情况下,再重新使用原始类型的有限值的现有业务这可能是最简单的。

有可能会或可能不会是它是否很有好处采用的前右手边无穷大,反之亦然处理左手端无穷公约的一般模式; 我不能说没有想出来,但低于或相等( lteq )我认为这是简单的右手边无穷先看看。 我注意到, lteq不可交换的,但addmul的; 也许这是相关的。

注:想出应该发生在无限的价值是什么一个很好的定义并不容易。 这是一个比较加法和乘法,但也许不是减法。 此外,还有无限的基数,哪些是你可能要注意序数之间的区别。



Answer 9:

由于类号是不是终点,这里是一个想法,我没有在其他职位找到呢。 即子类类数。

这会在一定程度交付可视为无穷大的整数,长,双,浮法,BigInteger和BigDecimal的对象。

由于只有两个值,我们可以使用Singleton模式:

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()等。然后应该重写抛出异常。 所以不能没有进一步的预防措施,使用的无穷价值。



文章来源: How to implement infinity in Java?