每一刻,都值得记录
← 返回首页

逆向工程老式 Intel 8087 的正切算法:不只是 CORDIC

文章封面

逆向工程老式 Intel 8087 的正切算法:不只是 CORDIC

Reverse-engineering the vintage Intel 8087's tangent algorithm: more than CORDIC — righto.com · 6 小时前 · ⚙️ 工程

逆向工程老式 Intel 8087 的正切算法:不只是 CORDIC

Intel 8087 的正切指令 FPTAN 在硅片里究竟怎么算出一条 tan 值,是 Ken Shirriff 这篇逆向分析要回答的核心问题。1980 年问世的 8087 是 x86 家族第一颗浮点协处理器,它把 80 位扩展精度格式(64 位尾数、15 位指数)、IEEE 754 舍入语义和一批超越函数指令压缩进约 4.5 万只晶体管,而正切是其中最棘手的一个。文章的关键论点是:8087 并没有在 CORDIC 与多项式逼近之间做二选一,而是把两种方法串成一条流水线——先用 CORDIC 的移位加法迭代把输入角度收敛到一个极小的残余角,再用一段低阶多项式把这个残余角上的正切值修正出来,从而同时获得 CORDIC 的硬件经济性与多项式逼近的高精度。

单用 CORDIC 的问题在于精度天花板:每一步旋转只能处理 atan(2^-i) 这样的固定角度,残余角度随迭代按 2^-n 量级衰减,但最后若干步的角度量化误差、以及旋转增益 K=∏√(1+2^-2i)≈1.6467602581 的补偿误差都会留在结果里,很难干净地达到 64 位尾数的要求。单用多项式的问题则在于成本:tan 在 π/2 附近发散,要在整个象限内逼近到同样精度需要很高阶的多项式,而 8087 内部并没有硬件乘法器,每一次乘法都要靠移位加法的微码循环完成,代价高得难以接受。把 CORDIC 当作粗逼近、把多项式当作精修正,恰好让两者的短板互相抵消。

文章还从芯片版图与常量 ROM 出发,复原了 8087 的角度归约流程、CORDIC 的旋转角度表、修正多项式的系数以及对应的微码序列,并解释了 FPTAN 为什么按 Intel 手册规定返回 X=1.0 与 Y=tan 这样一对「部分正切」值,而不是直接给出商——因为 tan 在 π/2 附近会溢出,把除法留给调用者或后续的 FDIV 更安全。作者的核心观点是:8087 的正切算法是资源受限年代混合算法的典型样本,它说明真正的工程突破往往不在某个单一算法本身,而在如何按硬件的实际约束把几种算法拼接起来。

核心论点

  • 8087 的正切计算以 CORDIC 的旋转模式为骨架:第 i 步沿固定角度 atan(2^-i) 旋转,旋转方向由当前残余角度的符号决定,硬件只需要移位器和加减法器,完全不需要乘法器,因此每一级迭代的电路代价极低;所有旋转累积起来会产生一个固定增益 K=∏√(1+2^-2i)≈1.6467602581,必须在结果中预先补偿,否则输出会系统性偏大约 1.65 倍,文章从芯片的常量 ROM 里把这些 arctan 表项与增益常量直接读了出来,从而确认了 CORDIC 在 8087 中的存在形式和迭代位数。
  • CORDIC 单独使用时精度存在天花板:迭代到第 n 步之后残余角度只剩 2^-n 量级,但每一步的角度量化误差、以及旋转增益补偿本身的舍入误差都会一路累积到最终结果里,对于 8087 那条 64 位尾数的精度目标来说这条误差通道太粗,无法只靠增加迭代次数解决,因此必须引入第二段算法对残余角做精修正,这也是文章标题所说「more than CORDIC」的直接原因。
  • 修正环节的多项式之所以便宜,是因为它只作用在极小的残余角 ε 上:tan(ε)≈ε+ε³/3+2ε⁵/15+…,当 ε 小到 2^-n 量级时,前两三项就足以把截断误差压到 64 位尾数以下,这与在整个象限上做高阶 minimax 逼近形成鲜明对比;换句话说,8087 是把多项式的定义域从「整个角度范围」压缩到「CORDIC 剩下的那一点点残差」,用极低阶数换到了同样的精度,而这在缺少硬件乘法器的微码环境里是决定性的成本优势。
  • FPTAN 的接口约定反过来影响了算法设计:Intel 手册规定该指令返回 X=1.0 与 Y=tan(θ) 这一对部分正切值,让调用者自己去做除法,因为 tan 在 π/2 附近会溢出,直接给出商在硬件上难以处理边界情况;同样的思路也体现在其他超越函数上,8087 的 FSIN/FCOS 并非独立算法,而是借助正切与平方根组合出来(sin=tan/√(1+tan²)、cos=1/√(1+tan²)),这说明正切算法实际上是整个 8087 超越函数体系的支点,它的精度与速度上限决定了整组指令的可用性。

💡 为什么值得读: 因为它用一块 1980 年硅片的真实版图、常量 ROM 和微码,把 CORDIC 与多项式逼近之间的取舍、精度上限和硬件成本讲成了可以逐条对照的具体细节,是理解超越函数硬件实现最扎实的一手案例。

🏷️ Intel 8087, floating point, CORDIC, reverse engineering


感谢读到这里。

留下一点回声

MY LITTLE COLLECTION

本地收藏夹

仅保存在当前浏览器,不会同步到其他设备。清理网站数据会删除收藏与阅读记忆。

QUICK ACCESS · 快捷指令

↑ ↓ 选择 · Enter 执行 · Esc 关闭

MAKE YOURSELF AT HOME

阅读与场景

阅读外观

应用于文章和独立页面,偏好仅保存在当前浏览器。

季节场景

系统减少动态效果、后台标签页及沉浸阅读时自动暂停。

本地数据备份

备份收藏、阅读进度和外观偏好。文件不上传服务器,仅支持同站点备份;导入时合并数据。