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
は数字ではないです。
私はあなたが理由で整数数学を使っていると思います。もしそうなら、Integer
クラスのMAX_VALUEフィールドを使うことでPOSITIVE_INFINITYと機能的にほぼ同じ結果を得ることができます。
Integer myInf = Integer.MAX_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);
OUTPUT: -
Infinity
-Infinity
-Infinity
Infinity
NaN
Double
およびFloat
型は、POSITIVE_INFINITY
定数を持ちます。
Javaがすべての数値型に対して無限大であるかどうかはわかりませんが、数値データ型によってはその答えは肯定的です。
Float.POSITIVE_INFINITY
Float.NEGATIVE_INFINITY
または
Double.POSITIVE_INFINITY
Double.NEGATIVE_INFINITY
また、+/ - 無限大を含むいくつかの数学演算を表す次の記事も役に立ちます。 Java Floating-Point Number Intricacies 。
DoubleおよびFloat型のみがPOSITIVE_INFINITY
定数をサポートしています。
数値ラッパー型用です。
例:Double.POSITVE_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構文に変換するのはあなたに任せます。アイデアが明確であることを願います。とにかくそれらを綴りましょう。
アイデアは、既存の型とまったく同じ値を持つ新しい型を作成することです。それには、パブリックメソッドを介して伝えることができる範囲で、無限大にしたい方法とまったく同じように機能する1つの特別な値を付けます。それは何よりも大きいです。私はここで無限を表すためにnull
を使っています、なぜならそれはJavaにおいて最も簡単なように思われるからです。
算術演算を追加したい場合は、それらが何をすべきかを決定し、それを実装します。最初に無限大の場合を扱い、次に元の型の有限値に対して既存の演算を再利用するのがおそらく最も簡単です。
右側の無限大の前に左側の無限大を処理するという規則を採用することが有益であるかどうかには、一般的なパターンがあるかもしれません。試してみなければわかりませんが、以下(lteq
)の場合は、まず右辺の無限大を見るほうが簡単だと思います。 lteq
はnot交換可能ですが、add
とmul
はそうです。多分それは関係があります。
注意:無限の値で起こるべきことの良い定義を思いつくことは必ずしも容易ではありません。それは比較、足し算、掛け算のためですが、引き算のためではないかもしれません。また、無限大の基数と序数の間には注意が必要な区別があります。
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()などは、例外をスローするためにオーバーライドされるべきだと思います。それで、無限値はさらなる予防策なしには使用できないように。