f
float リテラルで接尾辞を指定する必要があるのはなぜですか?
3 に答える
double
それ以外の場合は、 よりも一般的に使用される浮動小数点型であるにデフォルト設定されるためfloat
です。
浮動小数点リテラルは、末尾に ASCII 文字の F または f が付いている場合、float 型です。それ以外の場合、その型は double であり、オプションで ASCII 文字 D または d をサフィックスとして付けることができます (§4.2.3)。
(個人的には、すべての場合に明確にするために、デフォルトがないようにしたいと思いますが、それは別の問題です。)
接尾辞のない浮動小数点リテラルはdoubleであるため、丸めとは、floatとdoubleに丸めると、小さなリテラルでも異なる値をとることができることを意味します。これは、次の例で確認できます。
float f = (float) 0.67;
if(f == 0.67)
System.out.print("yes");
else
System.out.print("no");
no
0.67は、floatに丸めた場合と、doubleに丸めた場合の値が異なるため、これは出力されます。一方で:
float f = (float) 0.67;
if(f == 0.67f)
System.out.print("yes");
else
System.out.print("no");
…出力yes
。
編集
2番目の例:
if(0.67 == 0.67f)
System.out.print("Equal");
else
System.out.print("Not Equal");
…出力Not Equal
。
として表すことができる浮動小数点型が 2 つあります100.0
。デフォルトにできるのは 1 つだけです。精度が限られているため、float は非常に特殊な型です。通常は double であるため、これが適切なデフォルトです。
最新のプロセッサでは、float と double の計算パフォーマンスは類似しています。float を使用する唯一のケースは、制限された精度を必要とするパフォーマンスが重要な状況での大規模な配列です。float を使用すると、1 つのキャッシュ ラインに収まる浮動小数点値の数が 2 倍になります。それでも、float が特定の計算に十分な精度を与えるかどうかを判断することは、めったに簡単ではありません。