私は試した
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
そして出力は
true
true
つまり、これは「無限大」が両方のデータ型で同じであることを意味しますか?
私は試した
System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));
そして出力は
true
true
つまり、これは「無限大」が両方のデータ型で同じであることを意味しますか?
はいといいえ。はい、抽象的な意味で無限大は無限大であるためです(そして、以下で説明するように、ほとんどのコードの目的のために、floatはとにかくdoubleに変換されます)。
ただし、ビットレベルでは、2つの無限大が異なるためです。doubleはJavaでは64ビット、floatはJavaでは32ビットであるため、表現レベルでは自明に異なります。
Javaでは、浮動小数点数(floatsとdoubles)は、IEEE 754浮動小数点形式を使用して表されます。これは、現在ほとんどの人が使用している標準です。各数値は、符号ビット、特定の数の指数ビット、および特定の数の仮数(仮数)ビットとして2進数で表されます。浮動小数点または倍精度のいずれかで、正の無限大は符号ビット0、指数ビットはすべて1、仮数ビットはすべて0で表されます。負の無限大は、符号ビットが1であることを除いて、同じ方法で表されます。 2つの非常によく似た方法ですが、floatとdoubleの間で指数ビットと仮数ビットの数が異なるため、ビットレベルのパターンは異なります。
コードを書くために、それらを同じものとして扱うことができます。doubleとfloatを一緒に使用する場合は常に、特に明記しない限り、floatは自動的にdoubleにキャストされ、式はdoubleになります。したがって、float無限大は、ほとんどの実用的な目的でdouble無限大のように「機能」します。
それはあなたが「同じ」とはどういう意味かによります。符号が異なるためビットパターンは異なりますが、それでも両方とも無限大です。
さらに、floatのプロモーションルールは、doubleに変換するときに無限の性質を保持します。
double
Javaでは、を直接比較することはできませんfloat
。むしろ、これを行おうとすると、float
は自動的にdouble
最初のものに変換されます。float
引数を取るメソッドにを渡すと、同じシンギングが発生しますdouble
。Float.POSITIVE_INFINITY
そして、 (たとえば)をに変換すると、double
が得られますDouble.POSITIVE_INFINITY
。
したがって、あなたの質問に対する答えは、完全に同じものではDouble.POSITIVE_INFINITY
ありFloat.POSITIVE_INFINITY
ませんが、どちらも「大きすぎて表現できない数」を示しているため、==
論理的に一貫しています。
Java自体でfloat
とを比較する方法はありません。を暗黙的にアップキャストした後と比較してdouble
、使用する可能性のあるすべての操作double
double
float
double
float f=
double d =
Double.compare(f, d);
// equivelent to
Double.compare((double) f, d);