逆向 Intel 8087 的正切算法:不止 CORDIC
来源: righto.com — 2026-09
概述
Ken Shirriff 又写了一篇关于 Intel 8087 浮点芯片的文章,这次拆解的是正切指令 FPTAN 背后的算法。8087 把两条路线结合起来:先做 16 位的 CORDIC,得到大约 16 位精度与剩余的小角度,再用有理多项式(帕德近似 3x/(3-x²))把剩余角度补到 64 位精度。作者用凿子开盖、显微镜成像,从微码 ROM 与数据通路中还原出这套三段式流程;相比 8086,它把一次正切从 13000 微秒压到 90 微秒。
核心要点
- CORDIC 诞生于 1956 年,是工程师 Jack Volder 为 B-58 轰炸机 数字导航计算机发明的,全称是「坐标旋转数字计算机」。
- 它的巧思在于把角度拆解成一系列特殊角 arctan(2^-n),使旋转矩阵退化成只需移位与加减的形式,不需要乘法或除法。
- 每迭代一次大约多得到一位精度,因此 16 次迭代只能给到约 16 位精度,要做到 64 位就得算 64 项,代价过高。
- 8087 的做法是「CORDIC 16 位 + 有理近似」:剩余角度约 2^-16,用一个简单但极为精确的帕德近似 3x/(3-x²) 处理。
- 之所以用两个多项式的比而不是泰勒级数,是因为正切在 π/2 处趋于无穷,多项式不会爆掉,而多项式之比可以。
- 该近似的误差与 x^4 成正比,配合 x < 2^-16,误差小于 2^-64,正好满足 8087 的 64 位精度要求。
- 还有一个巧妙之处:FPTAN 分别返回分子与分母,所以有理近似里的那一步除法在硬件上几乎「免费」。
- 整条算法分三段:确定 CORDIC 决策位(伪除法)、计算有理近似、再依据决策位施加旋转(伪乘法);芯片中央的微码 ROM 里存着 1648 条微指令。
金句
8087 把两种方法结合起来,从而同时获得了高精度与高性能。
👍 0
👎 0
← 返回 Lobsters 首页