01.Blogs :
mocchi  

浮動小数

ちょっと研究の関係で浮動少数のフォーマットについて調べてた。
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

posted on Monday, June 06, 2005 10:39 AM by mocchi


 
03.UPDATE CALENDAR :
<June 2005>
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

05.MY LINKS :

07.Subscriptions :

Subscriptions


© Copyright 2005 Microsoft Corporation. All Rights Reserved.
Terms of Use | Privacy Statement | Code of Conduct | Hosted by MaximumASP for Microsoft
WHO-BAR