1

このコードスニペットを検討します。

int i = 0;
double d1 = (double) i;
long l = 0L;
double d2 = (double) l;

0.0これを私のマシンで実行すると、両方の変換が印刷されます。しかしd1d2これまでにないことはでき0.0ますか?

私が理解しているように、これは仕様が言う拡張プリミティブ変換です:

拡大プリミティブ変換は、数値の全体的な大きさに関する情報を失うことはありません。

と同様

intまたはlong値をfloatに、またはlong値をdoubleに変換すると、精度が低下する可能性があります。

私が仕様を理解しているように、上記はint 0常になるdouble 0.0が、long 0他の何か(例えば、そのようなもの)に変換できることを意味し1E-20ます。私のスペックの解釈は正しいですか?

4

1 に答える 1

3

完全な見積もりは次のとおりです。

intまたはlong値をfloatに、またはlong値をdoubleに変換すると、精度が低下する可能性があります。つまり、値の最下位ビットの一部が失われる可能性があります。この場合、結果の浮動小数点値は、IEEE 754の最も近い丸めモードを使用して、整数値の正しく丸められたバージョンになります。

(エンファシスマイン)

intこれは、 /値を/longで正確に表すことができない場合をカバーしています(この場合、最も近い表現可能な値が選択されます)。明らかに、表現できるので、精度の低下は予想されません。floatdouble0

于 2013-02-05T11:25:56.203 に答える