C标准库源码解剖(12):浮点数环境fenv.h

     为了编写高精度浮点数的运算,编程人员需要控制浮点数环境的各个方面:结果如何舍入,浮点数表达式如何简化与变换,如何处理浮点数异常(如下溢之类的浮点数异常是忽略还是产生错误),等等。C99引入了fenv.h来控制浮点数环境。
    1、fenv.h: 定义了浮点数环境控制函数、异常控制函数、舍入方式控制函数、浮点数异常码和舍入方式等。注意浮点数环境的实现是依赖于体系结构的,因为不同的体系结构有不同的浮点数指令集。依赖于体系结构的定义放在bits/fenv.h中,这里是x86体系结构的版本(Linux下)。
    标准头文件fenv.h内容如下:

    bits/fenv.h内容如下:

    标准C中指定的接口有:
    (1)浮点数环境类型:fenv_t,是一个结构体,里面的成员依赖于体系结构。
    (2)浮点数环境的缺省值:FE_DFL_ENV,是一个fenv_t *指针类型的值(为-1),用于需要fenv_t参数的函数中。
    (3)浮点数异常标志类型:fexcept_t,为unsigned short类型。异常标志中保存了浮点数的状态。
    (4)浮点数异常:FE_INEXACT, FE_DIVBYZERO, FE_UNDERFLOW, FE_OVERFLOW, FE_INVALID, FE_ALL_EXCEPT。
    (5)浮点数舍入方式:FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO。
    (6)浮点数环境控制函数:fegetenv, fesetenv, feholdexcpet, feupdateenv。
    (7)浮点数异常处理函数:fegetexceptflag, fesetexceptflag, fetestexcept, feraiseexcept, feclearexcept。
    (8)浮点数舍入控制函数:fegetround, fesetround。
    2、浮点数环境、异常、舍入控制函数的实现: 这些函数的实现都是依赖于体系结构的,x86体系结构的部分在glibc源码的sysdeps/i386/fpu目录下。每个函数对应一个C语言源文件,由于要用到浮点数操作指令,因此都嵌入了汇编代码。这些函数的功能都非常简单,主要是通过fenv_t的实例或fexcept_t的实例来获取或设置相应的值,因此代码都不长,要理解这些代码,主要是要对x86体系结构有全面的了解。由于代码依赖于体系结构,也没有特别值得研究的独立于体系结构的算法,因此这里并不打算解剖它们的源代码。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值