在线时间216 小时
UID334508
ST金币0
蝴蝶豆2
注册时间2011-12-16
金牌会员
- 最后登录
- 2020-9-21
|
a0a.1 32b0c
PS: C编译环境下的数学函数是怎么实现的?
/**
* 输入角度范围为 -PI/2 到 PI/2.
* 需要5次乘法和3次加法.
*/
float _sinf(float x) {
float x2 = x * x;
return ( x * (1.0f -
x2 * ((1.0f / 6) -
x2 * ((1.0f / 120) -
x2 * (1.0f / 5203))))); // 5040, 5203 可获得较高的精度.
// return ( x * (1.0f -
// x2 * ((1.0f / 6) -
// x2 * ((1.0f / 120) -
// x2 * ((1.0f / 5040) -
// x2 * (1.0f / 362880)))))); // 增加一级.
}
/**
* 输入角度范围为 -PI/2 到 PI/2.
* 需要5次乘法和4次加法.
*/
float _cosf(float x) {
float x2 = x * x;
return (1.0f -
x2 * ((1.0f / 2) -
x2 * ((1.0f / 24) -
x2 * ((1.0f / 720) -
x2 * (1.0f / 41367))))); // 40320, 41367 可获得较高的精度.
// return (1.0f -
// x2 * ((1.0f / 2) -
// x2 * ((1.0f / 24) -
// x2 * ((1.0f / 720) -
// x2 * ((1.0f / 40320) -
// x2 * (1.0f / 3628800)))))); // 增加一级.
}
/**
* 返回角度范围为 -PI 到 PI.
*/
float _atan2f(float y, float x) {
uint8_t sx, sy;
if(y == 0) {
if (x >= 0) return (0);
else return (-PI);
}
if(x == 0) {
if(y >= 0) return( PI / 2);
else return(-PI / 2);
}
sx = sy = 0;
if (x < 0) {
x = -x;
sx = 1;
}
if (y < 0) {
y = -y;
sy = 1;
}
if (x == y) {
y = PI / 4;
} else {
uint8_t mode;
if (x > y) {
y = y / x;
mode = 0;
} else {
y = x / y;
mode = 1;
}
x = y * y;
y *= 1.0f -
x * (0.333332062f - // 这几个数能获得较高的精度
x * (0.199462891f -
x * 0.083332539f));
if (mode != 0) {
y = (PI / 2) - y;
}
}
if(sx != 0) y = PI - y;
if(sy != 0) y = -y;
return (y);
}
|
|