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); } |
多谢分享! |
这样不一定比用系统函数节省资源吧,有没有一个对比。 |
|
|
能达到什么精度? |
有注释就更好了, |
能达到什么精度? |
好东西啊 |