C标准库源码解剖(12):浮点数环境fenv.h
为了编写高精度浮点数的运算,编程人员需要控制浮点数环境的各个方面:结果如何舍入,浮点数表达式如何简化与变换,如何处理浮点数异常(如下溢之类的浮点数异常是忽略还是产生错误),等等。C99引入了fenv.h来控制浮点数环境。
1、fenv.h:
定义了浮点数环境控制函数、异常控制函数、舍入方式控制函数、浮点数异常码和舍入方式等。注意浮点数环境的实现是依赖于体系结构的,因为不同的体系结构有不同的浮点数指令集。依赖于体系结构的定义放在bits/fenv.h中,这里是x86体系结构的版本(Linux下)。
标准头文件fenv.h内容如下:
/* ISO C99 7.6: 浮点数环境 <fenv.h> */
#ifndef _FENV_H
#define _FENV_H 1
#include <features.h>
/* 获取依赖于体系结构的定义。应该要有下面这些定义:
fenv_t 表示浮点数环境的类型
FE_DFL_ENV fenv_t *指针类型的值,表示浮点数环境的缺省值(用于需要fenv_t参数的函数中)
fexcept_t 表示浮点数异常标志(这个标志保存了浮点数的状态)的类型
下面的宏被定义,当且仅当实现支持这些宏时:
FE_INEXACT 不精确的结果
FE_DIVBYZERO 除数为0
FE_UNDERFLOW 结果向下溢出
FE_OVERFLOW 结果向上溢出
FE_INVALID 无效的运算
FE_ALL_EXCEPT 所有被支持的异常的按位或
下面这些宏被定义,当且仅当实现支持某些适当的舍入方式时:
FE_TONEAREST 最近舍入
FE_UPWARD 向正无穷大(+Inf)舍入
FE_DOWNWARD 向负无穷大(-Inf)舍入
FE_TOWARDZERO 向0舍入
*/
#include <bits/fenv.h>
__BEGIN_DECLS
/* 浮点数异常处理 */
/* 清除EXCEPTS表示的异常状态 */
extern int feclearexcept (int __excepts) __THROW;
/* 将实现定义的异常标志EXCEPTS保存到FLAGP所指的对象中 */
extern int fegetexceptflag (fexcept_t *__flagp, int __excepts) __THROW;
/* 产生由EXCEPTS表示的异常 */
extern int feraiseexcept (int __excepts) __THROW;
/* 根把EXCEPTS异常标志设置为FLAGP所指对象中的值 */
extern int fesetexceptflag (__const fexcept_t *__flagp, int __excepts) __THROW;
/* 确定EXCEPTS指示的各个异常中有哪个异常子集被设置了 */
extern int fetestexcept (int __excepts) __THROW;
/* 舍入控制 */
/* 获得当前的舍入方向,表示为一个舍入
相关文档:
哈哈!有幸在某网站发现这篇文章,读罢,觉得蛮有道理,发来大家一起共勉之
总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复。
一家之言,欢迎拍砖哈。
1、可以考虑先学习C.
大多数时候,我们学习语言的目的,不是为了成为一个语言专家,而是希望 ......
3.4理解编译器的反馈信息
在编译C代码时,编译器在产生的.asm文件里向程序员反馈了许多信息,理解这些信息,按它的提示修改C代码,对尽快优化代码很有好处。只要用-k令编译器保留.asm文件,就可读到这些信息。
对于C优化,重点就是循环,对于反馈信息,我们主要考察编译器对流水线 ......
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字.
它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误
2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局 ......
一位同学整理的常见笔试/面试题目,答案仅供参考,不代表本人观点。
这个东西有些参考价值,和同学讨论一下发现还是有些错误,
1.已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
解说:
1.strcpy的实现代码
char * st ......