Javaで無限大を実装する方法?


138

Javaには、すべての数値データ型の無限を表すものはありますか?数学演算ができるようにどのように実装されていますか?

例えば

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

非常に大きな数を使用してみましたが、適切で簡単な解決策が必要です。


10
無限の数があり、どれをモデル化しますか?
デイブ・リチャードソン、

11
なぜ∞-∞==0真実であるべきですか?そしてまた:なぜあなたはそのようなものが必要なのですか?
ブリンボリウム

回答:


190

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数字でありません


23
float精度がかなり低いため、可能な限り使用しないようにします。;)
Peter Lawrey、

3
Dijkstraのようなアルゴリズムを実装すると、POSITIVE_INFINITY <POSITIVE_INFINITYであるかどうかがわかりません。
Joey Carson、

41

理由で整数演算を使用していると思います。その場合、IntegerクラスのMAX_VALUEフィールドを使用して、機能的にはPOSITIVE_INFINITYとほぼ同じ結果を得ることができます。

Integer myInf = Integer.MAX_VALUE;

(そしてNEGATIVE_INFINITYの場合はMIN_VALUEを使用できます。)もちろん、たとえばmyInfMAX_VALUEの値と比較する場合など、いくつかの機能上の違いがあります。明らかに、この数は未満ではありませんmyInf

POSITIVE_INFINITYとNEGATIVE_INFINITYのフィールドが実際にあるライブラリありますが、これらはMAX_VALUEとMIN_VALUEの新しい名前にすぎません。


11
Integer.MAX_VALUE + 5はいくらですか?
Erwin Smout、2015

9
Integer.MAX_VALUE + 5は負の整数にラップアラウンドします。Integer.MAX_VALUE + 5 = Integer.MIN_VALUE + 4 = -2147483644。
エリックG.ハグストロム2015

「機能的にほぼ同じ」と言ったのではInteger.MAX_VALUEなく、無限大として使用Double.POSITIVE_INFINITYすることの違いは何ですか?その違いは何ですか?
ahitt6345 2017

1
@ ahitt6345 Integer.MAX_VALUEはまだ有限で、無限を模倣するためのハックにすぎません。さらに、Integer.MAX_VALUEは32ビットのみDouble.POSITIVE_INFINITYですが、64ビットです。
mgthomas99 2017

1
Integer.MAX_VALUEは、入力で使用できる有効な数値です。opは無限大を求めました。これは数値ではなく、数学記号です。
refaelio

11

を使用するには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

5

タイプは持っている定数を。DoubleFloatPOSITIVE_INFINITY


@ user1753100:デフォルトではありませんが、次のような一部のライブラリ:jscience.orgは明らかにそれを実装しています。
Tudor

1
無限大の値を倍精度浮動小数点数と浮動小数点数に制限するのは恣意的です。それらの最大値は、整数の最大値よりも無限大に近いですが、それほど近くはありません。
Patrick Brinich-Langlois 2013

3
@ PatrickBrinich-Langlois浮動小数点型(doubleやfloatなど)は、通常、直接無限大を表現できます(つまり、型の最大値とは異なり、「無限大」を具体的に表すビットパターンがあります)。DoubleとFloatは、整数と同様にMAX_VALUEを持っています。
David Morris、

7
「それらの最大値は、整数の最大値よりも無限に近いですが、それほど近くはありません。」任意の有限数は無限大から無限大です;)
carlsb3rg

4

Javaがすべての数値型に対して無限大を持っているかどうかはわかりませんが、一部の数値データ型については正の答えがあります。

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

または

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

また、+ /-無限大を含むいくつかの数学演算を表す次の記事も役立ちます。Java浮動小数点数の複雑さ


4

DoubleおよびFloatタイプのみがPOSITIVE_INFINITY定数をサポートします。


2

数値ラッパータイプの場合。

例:Double.POSITVE_INFINITY

これがお役に立てば幸いです。


1
すべての数値ラッパータイプに対応しているわけではありません。ダブルとフロートのためだけに。
エリックG.ハグストロム2015

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構文に変換するのは、あなたにお任せします。アイデアが明確であることを願っています。とにかくそれらを綴ってみましょう。

アイデアは、既存のいくつかの型とすべて同じ値を持つ新しい型を作成することです。さらに、パブリックメソッドを通じて確認できる限り、無限に機能させたい方法で機能する特別な値を1つ追加します。他に何か。nullここでは、無限大を表すために使用しています。これは、Javaで最も簡単に思えるからです。

算術演算を追加する場合は、それらの演算を決定してから実装します。最初に無限のケースを処理し、次に元の型の有限値で既存の操作を再利用するのがおそらく最も簡単です。

右側の無限大の前に左側の無限大を処理する、またはその逆を処理するという慣例を採用することが有益かどうかには、一般的なパターンがある場合とない場合があります。試してみないとわからないが、以下(lteq)については、最初に右側の無限大を見る方が簡単だと思う。私はそれが注意lteqされていない可換が、addmulしています。多分それは関連しています。

注:無限値で何が起こるかを適切に定義することは、必ずしも容易ではありません。比較、加算、乗算用ですが、減算ではない可能性があります。また、注意が必要な無限の基数と序数には違いがあります。


追加の状態を表すために追加のenumフィールドを使用して、負の無限大にすることもでき-(yourvalue)ます。これは、多くの場合望ましいことであり、適切に機能します。そして、それによってNaN(非数)の概念をサポートすることもできます。それとは別に、特にアプリケーションで浮動小数点数に違反するセマンティクスが必要な場合は、整数型の上に特別な値を追加することをお勧めします。
blubberdiblub 2017

0

クラス番号は最終的なものではないので、他の投稿ではまだ見つけられないアイデアがあります。つまり、クラス番号をサブクラス化します。

これにより、Integer、Long、Double、Float、BigInteger、BigDecimalの無限大として扱うことができるオブジェクトが何らかの形で提供されます。

値は2つしかないので、シングルトンパターンを使用できます。

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()などは、例外をスローするようにオーバーライドする必要があると思います。したがって、無限値は、さらなる予防策なしでは使用できません。


0

私は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);
    }

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.