2

高速反転アルゴリズムが math.h sqrt 関数よりも遅い理由を知りたいだけです。ここに私のコードサンプルがあります

コードは、低速反転と高速反転の比較を実証しようとします。デバッグ中、低速反転では 1 秒、高速反転では 4 秒と表示されます。問題はどこだ?

    #include<stdio.h>
    #include<time.h>
    #include<math.h>
    #include"inverse.h"

    #define SIZE 256

    int main()
    {
       char buffer[SIZE];
       time_t curtime;
       time_t curtime2;
       struct tm *loctime;
       int i = 0;
       float x = 0;

       curtime = time(NULL);
       loctime = localtime (&curtime);
       fputs (asctime (loctime), stdout);

       while(i < 100000000)
       {
          i++;
          //x = 1/sqrt(465464.015465);
          x = inverse_square_root(465464.015465);
       }

       curtime = time(NULL);
       loctime = localtime (&curtime);
       fputs (asctime (loctime), stdout);

       getchar();
       return 0;
    }

    float inverse_square_root(float number)
    {
       long i;
       float x2, y;
       const float threehalfs = 1.5F;

       x2 = number * 0.5F;
       y  = number;
       i  = * ( long * ) &y;             // evil floating point bit level hacking
       i  = 0x5f3759df - ( i >> 1 );     // what the heck?
       y  = * ( float * ) &i;
       y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    // y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
       return y;
    }
4

3 に答える 3

1

この質問に反して、sqrt または逆 sqrt は CPU レベルで最適化されている可能性があります。
さらに: 最高レベルの最適化でコードをベンチマークしましたか?

奇数マジック定数は、32 ビット IEEE 浮動小数点の表現を利用して、ニュートン反復の適切な初期近似を抽出します。

于 2014-03-14T15:54:29.737 に答える
1

sqrt() が遅いと考える特別な理由はないので、本当に「遅い」対「速い」を実証したい場合は、両方のアルゴリズムが何をするかを実際に知る必要があります。独自の slow_sqrt 関数を記述します。

于 2014-03-14T17:08:02.633 に答える