三角函数近似计算

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

三角函数近似计算(正余弦泰勒展开) [复制链接]

/**
* 输入角度范围为 -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);
}

相关文档
最新文档