快速反演算法比math.h 1 / sqrt函数慢

时间:2014-03-14 15:46:02

标签: c algorithm sqrt quake

我只是想了解为什么快速反演算法比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;
    }

3 个答案:

答案 0 :(得分:2)

&#34;问题&#34;可能是你现在拥有实现sqrt()的硬件,使其比软件方法更快。如果没有关于您的系统的更多细节以及可能的一些分析和反汇编数据,很难说清楚。

See this answer,例如有关x86 fsqrt指令的周期数的详细信息。

答案 1 :(得分:1)

this问题相反,sqrt或反向sqrt可能已在CPU级别进行了优化 进一步:您是否已使用最高级别的优化对代码进行基准测试?

奇数魔法常量利用32位IEEE浮点的表示,为牛顿迭代提取良好的初始近似。

答案 2 :(得分:1)

如果你真的想要证明“慢”&#39; vs&#39; fast&#39;你需要真正知道两种算法的作用,因为没有特别的理由认为sqrt()很慢。编写自己的slow_sqrt函数。