web-dev-qa-db-ja.com

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

Javaはあらゆる数値データ型に対して無限大を表現するための何かを持っていますか?数学的な操作ができるようにどのように実装されていますか?

例えば。

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

私は非常に大きな数を使用しようとしました、しかし、私は適切な、簡単な解決策が欲しいです。

119
user1753100

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数字ではないです。

165
Peter Lawrey

私はあなたが理由で整数数学を使っていると思います。もしそうなら、IntegerクラスのMAX_VALUEフィールドを使うことでPOSITIVE_INFINITYと機能的にほぼ同じ結果を得ることができます。

Integer myInf = Integer.MAX_VALUE;

もちろん、myInfをMAX_VALUEとなる値と比較する場合など、機能上の違いがいくつかあります。明らかにこの数はmyInfより小さくはありません。

実際にはPOSITIVE_INFINITYとNEGATIVE_INFINITYのフィールドを持つ ライブラリ もありますが、それらはMAX_VALUEとMIN_VALUEの新しい名前です。

30
JohnK

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);

OUTPUT: -

Infinity
-Infinity
-Infinity

Infinity 
NaN
11
Rohit Jain

DoubleおよびFloat型は、POSITIVE_INFINITY定数を持ちます。

5
Tudor

Javaがすべての数値型に対して無限大であるかどうかはわかりませんが、数値データ型によってはその答えは肯定的です。

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

または

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

また、+/ - 無限大を含むいくつかの数学演算を表す次の記事も役に立ちます。 Java Floating-Point Number Intricacies

4
Akos K

DoubleおよびFloat型のみがPOSITIVE_INFINITY定数をサポートしています。

3
NKM

数値ラッパー型用です。

例:Double.POSITVE_INFINITY

これが助けになることを願っています。

2
Ankit HTech

一般的な解決策は新しい型を導入することです。もっと複雑かもしれませんが、無限大を定義していない型ならどれでも使えるという利点があります。

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

アイデアは、既存の型とまったく同じ値を持つ新しい型を作成することです。それには、パブリックメソッドを介して伝えることができる範囲で、無限大にしたい方法とまったく同じように機能する1つの特別な値を付けます。それは何よりも大きいです。私はここで無限を表すためにnullを使っています、なぜならそれはJavaにおいて最も簡単なように思われるからです。

算術演算を追加したい場合は、それらが何をすべきかを決定し、それを実装します。最初に無限大の場合を扱い、次に元の型の有限値に対して既存の演算を再利用するのがおそらく最も簡単です。

右側の無限大の前に左側の無限大を処理するという規則を採用することが有益であるかどうかには、一般的なパターンがあるかもしれません。試してみなければわかりませんが、以下(lteq)の場合は、まず右辺の無限大を見るほうが簡単だと思います。 lteqnot交換可能ですが、addmulはそうです。多分それは関係があります。

注意:無限の値で起こるべきことの良い定義を思いつくことは必ずしも容易ではありません。それは比較、足し算、掛け算のためですが、引き算のためではないかもしれません。また、無限大の基数と序数の間には注意が必要な区別があります。

2
Jonas Kölker

Numberクラスは最終的なものではないので、これは他の記事ではまだ見つけられないという考えです。つまり、クラスNumberをサブクラス化します。

これはどういうわけか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
j4n bur53