快速开平法并取到数的算法


看看这段神奇的快速开平方并取倒数代码:
[cpp]   view plain   copy   派生到我的代码片
  1. float InvSqrt(float x )  
  2. {  
  3.     float xhalf = 0.5f * x;  
  4.     int i = *( int *)& x;  
  5.     i = 0x5f3759df - ( i>>1);  
  6.     x = *( float *)& i;  
  7.     x = x * (1.5f - xhalf * x * x);  
  8.   
  9.     return x;  
  10. }  
关于该段代码的更多说明,请参看这篇文章《 0x5f3759df的数学原理 》。
       下面为我编写的简单测试代码:
[cpp]   view plain   copy   派生到我的代码片
  1. #include "stdafx.h"  
  2. #include <stdio.h>    
  3. #include <stdlib.h>  
  4. #include <windows.h>  
  5. #include <math.h>  
  6.   
  7. // 开平方取倒数  
  8. float InvSqrt(float x )  
  9. {  
  10.     float xhalf = 0.5f * x;  
  11.     int i = *( int *)& x;  
  12.     i = 0x5f3759df - ( i>>1);  
  13.     x = *( float *)& i;  
  14.     x = x * (1.5f - xhalf * x * x);  
  15.   
  16.     return x;  
  17. }  
  18.   
  19. int main()  
  20. {  
  21.     // 比较精度  
  22.     float val = 0.0f;  
  23.     val = 1.0f;  
  24.     printf("计算精度比较: \n");  
  25.     printf("输入值:   %f    快速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));  
  26.   
  27.     val = 16.0f;  
  28.     printf("输入值:  %f    快速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));  
  29.   
  30.     val = 25.0f;  
  31.     printf("输入值:  %f    快速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));  
  32.   
  33.     val = 100.0f;  
  34.     printf("输入值: %f    快速算法: %f    VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));  
  35.   
  36.     printf("\n计算性能比较: \n");  
  37.     int count = 1000000;  
  38.     DWORD timeStart = 0, timeEnd = 0;  
  39.     timeStart = GetTickCount();  
  40.     for (int i = 0; i < count; i++)    
  41.     {    
  42.         val = InvSqrt(100.0f);    
  43.     }    
  44.     timeEnd  = GetTickCount();    
  45.     printf("快速算法耗时: %f \n", (timeEnd - timeStart) * 0.001);   
  46.   
  47.     timeStart = GetTickCount();  
  48.     for (int i = 0; i < count; i++)    
  49.     {    
  50.         val = 1.0f / sqrt(100.0f);    
  51.     }    
  52.     timeEnd  = GetTickCount();    
  53.     printf("VC函数耗时:   %f \n", (timeEnd - timeStart) * 0.001);   
  54.   
  55.     printf("\n");  
  56.     system("pause");  
  57.     return 0;  
  58. }  
       这里与sqrt()分别比较了计算精度及计算性能,测试环境为vs2005,普通pc笔记本(其实是一台年久的、玩的了游戏、写得了代码的小黑)。从对比结果看,该快速算法在计算结果上有一点点误差,但是计算性能上很可观。下图为对比结果:

                               
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值