簡體   English   中英

如何在 Java 中實現無窮大?

[英]How to implement infinity in Java?

Java 是否有任何東西可以代表每種數字數據類型的無窮大? 它是如何實現的,以便我可以用它進行數學運算?

例如

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

我嘗試過使用非常大的數字,但我想要一個合適、簡單的解決方案。

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 is Not A Number

我假設您出於某種原因使用整數數學。 如果是這樣,您可以通過使用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 的新名稱。

要使用Infinity ,您可以使用支持InfinityDouble :-

    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

DoubleFloat類型具有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;

我不確定 Java 是否對每種數字類型都有無窮大,但對於某些數字數據類型,答案是肯定的:

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

要么

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

此外,您可能會發現以下文章很有用,它表示涉及 +/- 無窮大的一些數學運算: Java Floating-Point Number Intracacies

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

對於數字包裝器類型。

例如Double.POSITIVE_INFINITY

希望這對你有幫助。

一個通用的解決方案是引入一個新類型。 它可能涉及更多,但它具有適用於任何未定義其自身無窮大的類型的優勢。

如果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是; 也許這是相關的。

注意:想出一個關於無限值應該發生什么的好的定義並不總是那么容易。 它用於比較、加法和乘法,但可能不是減法。 此外,您可能需要注意無限基數和序數之間的區別。

由於 class Number 不是最終的,這里有一個想法,我在其他帖子中還沒有找到。 即對類 Number 進行子類化。

這將以某種方式提供一個對象,該對象對於 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 文檔中找到了另一個無窮大的實現,用於booleandouble類型。 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);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM