Javaには、すべての数値データ型の無限を表すものがありますか? 数学演算を実行できるように、どのように実装されていますか?
例えば
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
非常に大きな数を使用してみましたが、適切で簡単な解決策が必要です。
Javaには、すべての数値データ型の無限を表すものがありますか? 数学演算を実行できるように、どのように実装されていますか?
例えば
int myInf = infinity; //However it is done
myInf + 5; //returns infinity
myInf*(-1); //returns negative infinity
非常に大きな数を使用してみましたが、適切で簡単な解決策が必要です。
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
は数値ではありません。
何らかの理由で整数演算を使用していると思います。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
使用できます: -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
および型には定数がDouble
あります。Float
POSITIVE_INFINITY
Double 型と Float 型のみがPOSITIVE_INFINITY
定数をサポートします。
Javaがすべての数値型に対して無限大であるかどうかはわかりませんが、一部の数値データ型については答えが肯定的です:
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
また
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
また、+/- 無限大を含むいくつかの数学演算を表す次の記事が役立つ場合があります: Java Floating-Point Number Intricacies。
数値ラッパー タイプの場合。
例: Double.POSITVE_INFINITY
これがお役に立てば幸いです。
一般的な解決策は、新しい型を導入することです。より複雑になる可能性がありますが、独自の無限を定義しない型に対して機能するという利点があります。
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
andはそうadd
ですmul
。多分それは関連しています。
注: 無限値で何が起こるべきかについて適切な定義を考え出すことは、必ずしも容易ではありません。比較、足し算、掛け算用ですが、引き算ではないかもしれません。また、注意が必要な無限基数と序数には違いがあります。