ちょっと研究の関係で浮動少数のフォーマットについて調べてた。
IEEE-754という形式がよく使われているらしい。
研究のことはそれで解決したが、それを調べるためにサイトを巡回してたら、
ちょっと気になることが書いてあった。
JVM は浮動少数は内部で32ビットで扱っていて、倍精度(64bit)は2つの浮動少数の重ね合わせとして表現している。
これを見て、もしかしたらjavaではfloatの方がdoubleより速いかも、と思った。で、早速、下のコードを使って実験してみた。
class float_double{
public static void main(String[] args){
long time1, time2;
int i, j;
float f1 = 0.0F, f2 = 0.4F;
// double d1 = 0.0, d2 = 0.4;
time1 = System.currentTimeMillis();
for (i = 0; i < 123456789; i++){
f1 = f2 + f1;
// d1 = d2 + d1;
}
System.out.println(f1);
// System.out.println(d1);
time2 = System.currentTimeMillis();
System.out.println(time2 - time1);
}
}
// doubleを調べるときは、コメントアウトしてある行のコメントアウトを外して、対応するfloatのところをコメントアウトしてください。
それぞれ2回ずつやった結果は・・・
(doubleバージョン1回目)
> 4.938271548956446E7
> 1500
(doubleバージョン2回目)
> 4.938271548956446E7
> 1484
(floatバージョン1回目)
> 8388608.0
> 1500
(floatバージョン2回目)
> 8388608.0
> 1485
何回やってもこれと似たような値がでた。実行時の最適化とかが効いているかもしれないが、時間の差はほとんど無い様子。
それよりも、floatの方の足し算した後の数字がdoubleと全然違う。よく見ると、 8388608.0
オーバーフローでもしたんだろうか?この数字をみて、ドラクエ4の某裏技を思い出してしまったw