易截截图软件、单文件、免安装、纯绿色、仅160KB

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 语言中的类型转换问题
一、问题的引出
看下面一段 C 程序:
#include <stdio.h>
int main()
{
short a, b;
float f;
double d;
int i1, i2;

i1 = i2 = 2000000000; //测试环境中 int 的表示范围为 -2147483648 ~ 2147483647
printf("%d\n", i1+i2); //溢出!

a = ......

C break跳出多层循环

 在C/C++中,跳出多层循环有3中方法:
  1.用break;加上一个辅助的标志变量。  
  2.用goto;  
  3.用try   ...   catch;
其中break对if-else语句无效,每次使用只能跳出一层循环。
用break的具体方法为:
bool BREAK=false;
while(...){
for(...){ ......

C中常量参与运算的问题

最近在开发中,对常量参与运算时候,出了几个问题,特记录如下:
1.例子一(KEIL-51)
   unsigned char recsum,xorsum;
   recsum == 0xFF; 
   xorsum == 0x00;
   if(recsum != (xorsum-1))  //这时候不相等
   if(recsum != (unsigned ch ......

安装ubuntu下的c和java开发环境基础库

1、安装基础类库和man帮助文档等
sudo apt-get install  build-essential sun-java6-jdk debian-keyring g++-multilib g++-4.2-multilib gcc-4.2-doc libstdc++6-4.3-dbg equivs glibc-doc manpages-dev libstdc++6-4.3-doc diff-doc binfmt-support sun-java6-source  manpages manpages-posix manpages-posix- ......

字符串的两种不同风格: C++风格和C风格

这个提法有点怪异,但还是常常出现:
char *p = "abcd";

string str = "abcdefg";
第一个叫做C风格的字符串,原因是有null作为结尾; 第二个为C++风格的, 不是以null结尾.
实质上: C风格的字符串是:
char[] pArr = {'a', 'b', 'c', 'd', '\0'};
这样决定了处理方式的不同 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号