9

私は試した

System.out.println(Double.isInfinite(Float.POSITIVE_INFINITY))
System.out.println(Double.isInfinite(Float.NEGATIVE_INFINITY));

そして出力は

true
true

つまり、これは「無限大」が両方のデータ型で同じであることを意味しますか?

4

4 に答える 4

7

はいといいえ。はい、抽象的な意味で無限大は無限大であるためです(そして、以下で説明するように、ほとんどのコードの目的のために、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無限大のように「機能」します。

于 2012-04-10T05:13:12.733 に答える
1

それはあなたが「同じ」とはどういう意味かによります。符号が異なるためビットパターンは異なりますが、それでも両方とも無限大です。

さらに、floatのプロモーションルールは、doubleに変換するときに無限の性質を保持します。

于 2012-04-10T05:13:20.153 に答える
1

doubleJavaでは、を直接比較することはできませんfloat。むしろ、これを行おうとすると、floatは自動的にdouble最初のものに変換されます。float引数を取るメソッドにを渡すと、同じシンギングが発生しますdoubleFloat.POSITIVE_INFINITYそして、 (たとえば)をに変換すると、doubleが得られますDouble.POSITIVE_INFINITY

したがって、あなたの質問に対する答えは、完全に同じものではDouble.POSITIVE_INFINITYありFloat.POSITIVE_INFINITYませんが、どちらも「大きすぎて表現できない数」を示しているため、==論理的に一貫しています。

于 2012-04-10T06:35:16.573 に答える
1

Java自体でfloatとを比較する方法はありません。を暗黙的にアップキャストした後と比較してdouble、使用する可能性のあるすべての操作doubledoublefloatdouble

 float f= 
 double d =
 Double.compare(f, d);
 // equivelent to
 Double.compare((double) f, d);
于 2012-04-10T08:19:22.143 に答える