作者: Bruce.
日時: 2004/12/17(20:04)
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/