1980年,英特尔推出8087芯片,使IBM PC等系统浮点运算速度大幅提升。文章聚焦基本算术运算:加法和减法。8087相较于8086,加法速度提升近100倍,复杂运算更是显著提升。
为了探索8087的电路,我取下芯片盖用凿子打开,并使用显微镜拍摄下方高分辨率图片。微码ROM是芯片中心的大型矩形区域,包含控制芯片的1648条微指令。芯片底半部分(红框)是数据通路,执行80位值的浮点计算。
8087数据通路特写显示了用于加法和减法的功能模块。关键部件是位于中心的整数加法器。它从B寄存器接收一个参数,从暂存器或堆栈寄存器等组件接收另一个参数。加法器的输出存储在和寄存器中。位移器可以将值的位向左或向右移位。位移器占芯片上大量空间,因为其电路允许值快速按任意位数移位。浮点运算大量使用位移器来对齐数值;前导零电路计算数值左侧零位或零字节的数量,以便移除它们。指数转换器处理指数,检测溢出和下溢。这些专用电路帮助8087实现了高性能。
大多数计算机将整数作为数字的基本表示形式。但许多应用需要带小数部分的数字,如1.23。此外,整数范围有限:32位整数可表示约-20亿到20亿之间的数字。为了解决这些问题,计算机通常实现浮点数,其提供巨大范围的分数。大多数情况下,浮点数由符号×尾数×2的指数表示。尾数是一个二进制数,形式为1.bbb…:一个前导1,后跟二进制点(十进制点的二进制等价物)和其余位。
在二进制数中,每一位代表2的幂。对于小数部分,小数点后的幂为负:2^-1、2^-2等。所以二进制数1.1是1+1/2,即十进制的1.5。同样,二进制1.0011是1+1/8+1/16,即1.1875。指数允许数字摆脱尾数有限的范围。例如,1.1(二进制)×2^8是384。随着更大的指数,浮点数可以覆盖巨大范围;即使是32位短浮点数的范围也超过10^-36到10^38。
浮点加法和减法比整数运算复杂。在数字相加(或相减)之前,它们的二进制点必须对齐,这与对十进制数的小数点对齐相同。运算后,结果的指数必须调整,归一化尾数以使其以1位开头。上图说明了简单浮点加法:13.5+3.5。前两行显示两个参数,以指数和尾数表示。两个参数都归一化,所以最左边的一位是1。在相加之前,第二个参数必须对齐——ma...
来源: Hacker News · 由HeadlinesBriefing整理摘要