164

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

例えば

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

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

4

11 に答える 11

223

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

于 2012-10-18T10:04:20.667 に答える
56

何らかの理由で整数演算を使用していると思います。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 の新しい名前です。

于 2013-07-31T14:21:57.317 に答える
12

を使用するには、次をサポートするものをInfinity使用できます: -DoubleInfinity

    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
于 2012-10-18T10:06:03.327 に答える
6

および型には定数がDoubleあります。FloatPOSITIVE_INFINITY

于 2012-10-18T10:04:32.227 に答える
4

Double 型と Float 型のみがPOSITIVE_INFINITY定数をサポートします。

于 2012-10-18T10:25:13.797 に答える
4

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

Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY

また

Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY

また、+/- 無限大を含むいくつかの数学演算を表す次の記事が役立つ場合があります: Java Floating-Point Number Intricacies

于 2012-10-18T10:05:46.673 に答える
2

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

例: Double.POSITVE_INFINITY

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

于 2012-10-18T10:05:29.720 に答える
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) の場合は、最初に右側の無限大を見る方が簡単だと思います。それは交換可能ではありませんが、lteqandはそうaddですmul。多分それは関連しています。

注: 無限値で何が起こるべきかについて適切な定義を考え出すことは、必ずしも容易ではありません。比較、足し算、掛け算用ですが、引き算ではないかもしれません。また、注意が必要な無限基数と序数には違いがあります。

于 2016-07-08T13:24:01.547 に答える