[英]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
,您可以使用支持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 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
不是可交換的,但是add
和mul
是; 也許這是相關的。
注意:想出一個關於無限值應該發生什么的好的定義並不總是那么容易。 它用於比較、加法和乘法,但可能不是減法。 此外,您可能需要注意無限基數和序數之間的區別。
由於 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 文檔中找到了另一個無窮大的實現,用於boolean
和double
類型。 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.