数学函数库(三)

    上一篇文章中我们以truncf()为例讲解了数学函数的处理过程,可以看出处理过程还是很麻烦的。而且需要注意的是我们挑选的是一个很简单的函数,其他数学函数的处理过程更麻烦。因此一些处理器集成了浮点运算单元,通过硬件计算数学函数,从而加快了数学函数的处理速率。这篇文章中,我想以X86架构为例讨论通过硬件处理数学函数的过程。

    早期,由于半导体技术水平的限制以及浮点数运算需求不高,浮点运算单元不能集成到CPU中,因此Intel推出过单独的数学协处理器,配合CPU芯片一起使用。比如与8086、8088、80186、80188配合使用的数学协处理器是8087,与80286配合使用的数学协处理器是80287,与80386配合使用的数学协处理器是80387。当Intel发布80486的时候,这种状况才得到了改善,可以直接将浮点运算单元直接集成到CPU芯片中了,因此80486不再需要数学协处理器了。为了配合80486sx,Intel发布了最后一款数学协处理器80487,从此以后就不再发布单独的数学协处理器了。这篇文章中,我们分析的是80387协处理器。与CPU芯片一样,理解80387协处理器也需要从两方面进行分析:寄存器和指令集。80387协处理器包含了11个寄存器:浮点数据寄存器(8个)、控制寄存器(1个)、状态寄存器(1个)、标记寄存器(1个)。

    80387中包含8个浮点数据寄存器,表示为ST0-ST7,每个寄存器长度是80比特。这80比特分成三个字段:bit 79表示符号位,bit64 - bit78表示指数域,bit0 - bit63表示尾数域,因此80387中浮点数比float类型和double类型的浮点数的精度更高。但是这8个浮点数据寄存器的使用方法与CPU芯片中通用寄存器的使用方法不同。CPU芯片中寄存器的名称与寄存器是对应关系,比如无论发生什么事,寄存器EAX总是对应芯片中一个特定的寄存器,这个对应关系不会发生改变。而ST0-ST7与浮点运算单元中的寄存器没有对应关系,浮点运算单元将这8个寄存器当作堆栈使用,这个堆栈的长度是8,ST0表示堆栈中栈顶的寄存器,ST1表示紧挨着栈顶的下一个寄存器,以此类推。

    80387中控制寄存器的长度是16比特,控制寄存器主要用来控制浮点运算单元的工作方式,用户可以通过向控制寄存器中写入数据来改变浮点运算单元的工作方式。控制寄存器如下图所示:


控制寄存器中bit11和bit10表示浮点数的取整方式,包含四种取整方式:

00:正常取整方式。这种方式中,浮点数采用四舍六入的方法取整,如果小数部分是0.5,那么浮点数向偶数取整。比如:3.3

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值