首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

对 Intel 8087 的正切算法进行逆向工程:不仅仅是 CORDIC

摘要

I hope you're not tired of the 8087, because I have another article about Intel's floating-point chip. 1 In 1980, Intel introduced the 8087, making floating-point operations much faster in the IBM PC ...

the The 8087 and chip algorithm that holds floating point
2026-09-27 1 阅读 约5分钟阅读 pwg
分享:
字号:
我希望你不会厌倦 8087,因为我还有另一篇关于 Intel 浮点芯片的文章。 1 1980 年,Intel 推出了 8087,使 IBM PC 和其他系统中的浮点运算速度大大加快。在本文中,我将了解芯片切线指令背后的算法。三角函数的一种流行方法是称为 CORDIC 的算法。另一种方法是多项式近似。 8087 将两者结合起来,获得了高精度和高性能。 8087 比 8086 微处理器提供了巨大的加速,在 90 微秒内计算出正切线,而不是 13,000 微秒。 2 通过检查 8087 的电路和微代码,我可以解释切线指令背后的算法,称为 FPTAN 。为了探索 8087 的电路,我用凿子打开了芯片的盖子,并用显微镜创建了高分辨率图像。微代码 ROM 是芯片中心的大矩形区域,保存着控制芯片的 1648 条微指令。芯片的下半部分(红框)是数据路径,即对 80 位值执行浮点计算的电路。 3 8087 数据路径的特写,显示 FPTAN 使用的功能块。单击此图像(或任何其他图像)以获得更大的版本。放大数据路径可显示相关功能单元。指数 ROM 保存算法所需的固定指数值。常量 ROM 保存常量,包括 CORDIC 算法使用的常量。变速杆是一个很大的部件;它将 64 位值左移或右移任意量。加法器是 8087 计算的核心;除了提供加法和减法之外,它还用于循环中的乘法、除法和平方根。 B 寄存器保存加法器的一个输入,而多个源可以提供另一输入。和寄存器保存加法器的输出。八个堆栈寄存器和临时寄存器保存浮点数。最后,移位寄存器保存 16 个状态位用于 CORDIC 计算。 CORDIC 算法 CORDIC 是一种巧妙的算法,可以用简单的硬件快速计算超越函数:它使用移位和加法指令以及表查找,但不需要乘法或除法。该算法可以追溯到 1956 年,当时是为 B-58 Hustler 开发的,B-58 Hustler 是第一架能够以 2 马赫飞行的轰炸机。该飞机配有模拟导航计算机,但模拟组件的精度有限。工程师杰克·沃尔德(Jack Volder)接受了设计数字计算机以取代模拟计算机的任务。 7 一个关键问题是,模拟计算机可以使用称为旋转变压器的机电设备轻松生成正弦和余弦。但三角函数很难以数字方式产生,尤其是在那个时代缓慢的晶体管的情况下。一架康维尔 B-58A Hustler,在德克萨斯州圣安东尼奥展出(详情)。 Jack Volder 提出了一种用简单硬件快速计算三角函数的方法。他将该算法以及实现该算法的计算机称为 CORDIC:“坐标旋转数字计算机”。 CORDIC 将角度转换为向量,其中向量的坐标提供必要的三角函数。诀窍是将角度分解为一系列特殊角度,这些角度使矢量旋转变得容易。这些特殊角度经过预先计算并存储在表中,因此即使在 20 世纪 50 年代的硬件上,也可以快速执行 CORDIC 计算。每次 CORDIC 迭代都会提供额外的精度,因此算法可以快速收敛。 CORDIC 开始流行,包括在科学计算器中,它使用十进制 CORDIC 而不是二进制。对于一些三角学,我将尝试将数学运算保持在最低限度,但在本节中,我将快速解释 CORDIC 的工作原理。下图回顾了三角函数与点坐标的关系。假设有一个角度 θ;它指定单位圆上的一个点 (X, Y)。基本公式为 X=cos θ 、Y=sin θ 和 Y/X = tan θ 。因此,如果您可以确定坐标 (X, Y) ,那么您就可以确定三角函数的值。如果该点不在单位圆上,例如(X', Y') ,那么你仍然可以轻松确定 tan θ 。 (剧透:这就是 8087 所做的。)然而,sin θ 和 cos θ 变得混乱。 4 角度、X 和 Y 坐标以及三角函数之间的关系。如果您做过计算机图形学,您可能已经了解旋转矩阵如何将点旋转一定角度。 (如果您不熟悉旋转矩阵,您可以在此处阅读它们,或者只是相信它有效。)将点 (X, Y) 乘以旋转矩阵会产生新点 (X', Y'),如下所示。可以使用旋转矩阵来旋转点。不幸的是,由于旋转矩阵(1,如下)需要 sin 和 cos ,它似乎并不能帮助解决我们的问题。然而,我们可以将矩阵除以 cos θ ;这似乎
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱