跳到主要内容

余弦查找表 (costab)

基于预计算查找表的三角函数模块,提供整数和浮点两种精度,使用 16 位定点角度表示,零浮点运算开销。

原理

将 0 到 2π 均匀采样为 65536 个角度单位(0x0000 到 0xFFFF),在 [0, π/2] 区间内预计算 1024 个余弦值作为查找表。其他象限通过对称性映射:

  • cos(x) — 直接查表
  • sin(x) — 利用 sin(x) = cos(x - π/2),将角度加上 0xC000(即 3π/2,等价于 -π/2 mod 2π)后查表

角度值自动按 65536 取模循环,无需手动处理周期。

查找表

extern const int16_t icostab[1024]; /* 整数余弦表,范围 [-32767, 32767] */
extern const float fcostab[1024]; /* 浮点余弦表,范围 [-1.0, 1.0] */

API

整数三角函数

int isin(int x); /* 返回 [-32767, 32767] */
int icos(int x); /* 返回 [-32767, 32767] */

输入为 16 位定点角度(0 到 65535 表示 0 到 2π)。输出为 15 位有符号定点数,32767 对应 1.0。

浮点三角函数

float fsin(int x); /* 返回 [-1.0, 1.0] */
float fcos(int x); /* 返回 [-1.0, 1.0] */

输入同为 16 位定点角度,输出为标准浮点值。

角度对照

角度值弧度角度
0x00000
0x4000π/290°
0x8000π180°
0xC0003π/2270°
0xFFFF≈2π≈360°

角度转换公式:x = (int)(radians / (2 * PI) * 65536)

使用示例

整数精度旋转坐标

int angle = 0x2000; /* 45度 */
int x = 100, y = 0;
int nx = (x * icos(angle) - y * isin(angle)) >> 15;
int ny = (x * isin(angle) + y * icos(angle)) >> 15;

浮点精度计算

float s = fsin(0x4000); /* ≈ 1.0 (sin(90°)) */
float c = fcos(0x0000); /* ≈ 1.0 (cos(0°)) */

角度递增动画

int angle = 0;
while(1)
{
int dx = isin(angle);
int dy = icos(angle);
angle += 0x0100; /* 每步约 5.6度 */
angle &= 0xFFFF; /* 自动循环 */
}