Bruce. @さーたーあんだぎー買い損ねて悲しい です。
<mb.2004856659.248628097.6126406.431019@...>
Bruce. wrote:
>
> な感じ(上がfloat、下がdoubleです)。
> 純粋に命令の所要クロック数の違いなんだろうか?
気になったのでちょっと調べてみました。決定的な証拠は見つからなかったのですが、
どうも、Pentium(とそれ以降)では単精度の掛け算と倍精度の掛け算で所要クロックに
差はないようです。
んで、
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int
main()
{
DWORD dw1, dw2, dw3;
float f,g;
double m,n;
int i;
f = 12.99;
g = 2.1;
dw1 = timeGetTime();
for (i=0; i<1000000; i++) {
f *= g;
}
dw2 = timeGetTime();
m = 12.99;
n = 2.1;
for (i=0; i<1000000; i++) {
m *= n;
}
dw3 = timeGetTime();
printf("float: %dms\n", dw2-dw1);
printf("double: %dms\n", dw3-dw2);
return 0;
}
というプログラムで実測してみたところ、以下のような結果となりました
#乗数が2.1なのは2だと最適化かけたときに足し算に変化してしまうからです
最適化あり (-Ox)
float: 406ms
double: 406ms
float: 406ms
double: 390ms
float: 391ms
double: 406ms
float: 406ms
double: 406ms
float: 406ms
double: 406ms
最適化なし
float: 421ms
double: 407ms
float: 421ms
double: 407ms
float: 406ms
double: 422ms
float: 406ms
double: 422ms
float: 406ms
double: 422ms
どうも測定誤差の類のようで。でもまあ関数の引数に使うときはpromotionの
問題があるのでdoubleのほうが有利というのは確かなんですが。
--
木村浩一
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
mail kbk@...
web www.kt.rim.or.jp/~kbk/
homepage3.nifty.com/farstar/