标签:代码 数学 技术 details style href window 大量 今天
这么设计也有道理,仅仅有不嫌麻烦的人。才会耐心的完毕转载,算是提高了转载的门槛。避免出现大量反复文章。只是,这么设计的副作用就是,浪费了非常多时间和精力。吐槽就到这里,还是看看这段奇妙的高速开平方并取倒数代码:
float InvSqrt(float x )
{
float xhalf = 0.5f * x;
int i = *( int *)& x;
i = 0x5f3759df - ( i>>1);
x = *( float *)& i;
x = x * (1.5f - xhalf * x * x);
return x;
}关于该段代码的很多其它说明。请參看这篇文章《0x5f3759df的数学原理》。#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
// 开平方取倒数
float InvSqrt(float x )
{
float xhalf = 0.5f * x;
int i = *( int *)& x;
i = 0x5f3759df - ( i>>1);
x = *( float *)& i;
x = x * (1.5f - xhalf * x * x);
return x;
}
int main()
{
// 比較精度
float val = 0.0f;
val = 1.0f;
printf("计算精度比較: \n");
printf("输入值: %f 高速算法: %f VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));
val = 16.0f;
printf("输入值: %f 高速算法: %f VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));
val = 25.0f;
printf("输入值: %f 高速算法: %f VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));
val = 100.0f;
printf("输入值: %f 高速算法: %f VC函数: %f \n", val, InvSqrt(val), 1.0f / sqrt(val));
printf("\n计算性能比較: \n");
int count = 1000000;
DWORD timeStart = 0, timeEnd = 0;
timeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
val = InvSqrt(100.0f);
}
timeEnd = GetTickCount();
printf("高速算法耗时: %f \n", (timeEnd - timeStart) * 0.001);
timeStart = GetTickCount();
for (int i = 0; i < count; i++)
{
val = 1.0f / sqrt(100.0f);
}
timeEnd = GetTickCount();
printf("VC函数耗时: %f \n", (timeEnd - timeStart) * 0.001);
printf("\n");
system("pause");
return 0;
} 这里与sqrt()分别比較了计算精度及计算性能,測试环境为vs2005。普通pc笔记本(事实上是一台年久的、玩的了游戏、写得了代码的小黑)。从对照结果看,该高速算法在计算结果上有一点点误差,可是计算性能上非常可观。下图为对照结果:
标签:代码 数学 技术 details style href window 大量 今天
原文地址:http://www.cnblogs.com/yangykaifa/p/6985247.html