xmath.cpp

来自「一个简单的数学库.但是很实用..大家可以下载过去研究一下.」· C++ 代码 · 共 82 行

CPP
82
字号
#include "stdafx.h"

#include <cmath>
#include "xmath.h"

float sin_table[361];
float cos_table[361];

//
// 构造正/余弦函数值查找表
//
void BuildSinCosTable()
{
	// 从0度到360度
	float tmp;
	for(int ang=0;ang<=360;++ang)
	{
		// 转化为弧度
		tmp=DEG_TO_RAD(ang);

		// 使用C数学函数填充查找表
		sin_table[ang]=sin(tmp);
		cos_table[ang]=cos(tmp);
	}
}

//
// 使用线性插值快速计算sin/cos,传入的参数为角度
//
float FastSin(float ang)
{
	ang=fmodf(ang,360);
	if(ang<0)
		ang+=360;
	int alpha=(int)ang;
	float beta=ang-alpha;
	return (sin_table[alpha]+beta*(sin_table[alpha+1]-sin_table[alpha]));
}

float FastCos(float ang)
{
	ang=fmodf(ang,360);
	if(ang<0)
		ang+=360;
	int alpha=(int)ang;
	float beta=ang-alpha;
	return (cos_table[alpha]+beta*(cos_table[alpha+1]-cos_table[alpha]));
}

//
// 快速计算x的平方根的倒数,相对误差约为0.177585%
//
float InvSqrt (float x)
{
    float xhalf=0.5f*x;
    int i=*(int*)&x;
    i=0x5f37642f-(i>>1);	// 估计初值
    x=*(float*)&i;
    x=x*(1.5f-xhalf*x*x);	// NR过程
    return x;
}

//
// 快速计算x的平方根,相对误差约为0.177585%
//
float FastSqrt(float x)
{
	union{
		int intPart;
		float floatPart;
	} convertor;
	union{
		int intPart;
		float floatPart;
	} convertor2;
	convertor.floatPart = x;
	convertor2.floatPart = x;
	convertor.intPart = 0x1FBCF800 + (convertor.intPart >> 1);
	convertor2.intPart = 0x5f37642f - (convertor2.intPart >> 1);
	return 0.5f*(convertor.floatPart + (x * convertor2.floatPart));
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?