2012-04-10 5 views
8

私はDouble.POSITIVE_INFINITY == Float.POSITIVE_INFINITY

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

を試してみましたが、出力は

true 
true 

だったので、これは "インフィニティ" は、両方のデータタイプで同じであることを意味しますか?

答えて

8

はい、いいえ。はい、抽象的な意味では無限大です(そして、以下で説明するように、ほとんどのコード浮動小数点数は、とにかく倍精度に変換されるためです)。

ただし、ビットレベルでは2つの無限大が異なるため、 Javaではdoubleが64ビット、floatはJavaでは32ビットなので、表現レベルでは多少異なります。

Javaでは、浮動小数点数(浮動小数点数と浮動小数点数)は、浮動小数点形式のIEEE 754を使用して表されています。これは、今日誰もがほとんど使用している標準です。各数値は、符号ビット、ある数の指数ビット、ある数の仮数(仮数)ビットを加えたものとして、2進数で表されます。 floatまたはdoubleのいずれかで正の無限大は符号ビットが0、指数ビットがすべて1、仮数ビットがすべて0です。負の無限大は符号ビットが1以外の場合と同じ方法で表されます。したがって無限大は2つの非常に似たような方法ですが、浮動小数点数と複素数の間の指数と仮数のビットの数が異なるため、ビットレベルパターンは異なります。

コードを書くために、コードを同じものとして扱うことができます。倍精度と浮動小数点を一緒に使用するときは、明示的にそうしない限り、浮動小数点は自動的にdoubleにキャストされ、式は倍精度になります。したがって、浮動小数点の無限大は最も実用的な目的で二重の無限大のように動作します。

+0

floatをアップキャストした後doubledoubleを比較します。 'Double.compare(double、double)'メソッドは、 'Double.compare(Float.POSITIVE_INFINITY、Double.POSITIVE_INFINITY)'に対して0を返すのに十分なほどスマート(あるいは多分ダム? – user113454

+1

@ user1064918これは 'Doubleとは関係ありません。'(double、double)'を比較します。私が私の答えで述べたように、doubleが期待され、floatが与えられると、floatは自動的にdoubleにキャストされるので、 'Double.compare(double、double)'は2倍しか見えません。 * JVMとハードウェア*は、32ビットの無限大(浮動小数点数)を認識し、64ビットの無限大(2倍)に変換するほどスマートです。 –

+0

それは理にかなっています。ありがとうございました – user113454

1

"同じ"とは何を意味するかによって異なります。符号が異なるためビットパターンが異なりますが、の場合はまだの両方が無限です。

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

+0

「同じ」とは、2つの違いを取るとゼロになることを意味します。どちらのビットパターンがどういうものかは確認していません。 Double.compare(...)メソッドが依存しているので、同じであるべきではありませんか? – user113454

+3

@ user1064918いいえ、ビットパターンは同じではありません。浮動小数点数は32ビットであり、倍精度は64ビットです。さらに、Infinity - Infinityも数学の数字ではないので、2つの違いを取るとNaNが得られます。 –

+1

@ user1064918:実際、 'Float.POSITIVE_INFINITY - Float.POSITIVE_INFINITY'も' NaN'であり、 'Float.POSITIVE_INFINITY + Float.NEGATIVE_INFINITY'です。 2つの無限大の減算は、使用するデータタイプに関係なく、単に定義されません。 – Amadan

1

Javaでは、doublefloatを直接比較することはできません。むしろ、これを実行しようとすると、floatは自動的にdoubleに変換されます。 floatdouble引数を取るメソッドに渡すと、同じ処理が行われます。 Float.POSITIVE_INFINITY(たとえば)をdoubleに変換すると、Double.POSITIVE_INFINITYとなります。

だからあなたの質問への答えはDouble.POSITIVE_INFINITYFloat.POSITIVE_INFINITYは全く同じものではありませんが、それらの両方は、したがって==はあなたを与えることの答えは、論理的に一貫している「を表すには大きすぎる番号」を示すことです。

1

floatdoubleをJavaで比較する方法はありません。あなたが使用する可能性があるすべての操作はimplcitly私が見double

float f= 
double d = 
Double.compare(f, d); 
// equivelent to 
Double.compare((double) f, d); 
関連する問題