float.h

一背景知识
浮点算术非常复杂   很多小的处理器在硬件指令方面甚至不支持浮点算术   其他的则需要一个独立的协处理器来处理这种运算   只有最复杂的计算机才在硬件指令集中支持浮点运算
一般应用程序不需要浮点算术   其他可以通过软件来实现浮点运算  需要性能的降低和几千字节的额外代码
上溢和下溢
一个结果可能太大 不能在一台机器上表示   结果上溢可能导致终端 可能会产生一个特殊的编码值   或者会产生一个很 容易被误导的有效值的垃圾值    
一个结果可能太小而不能在一台机器上表示   但是在另一台机器上却可以表示  结果可能会导致终端  可能会被精确的0 代替
有效值丢失
把两个精确的数相乘后可能得到一般的有效值  把两个大小相近的数相减  可能会丢失大部分或者全部的有效值
上溢和下溢和有效值丢失对浮点算术来说是固有的
变化
浮点值的运算加法 所得的结果在一定程度上依赖于那两台机器的舍入方式 在某些场合下 得到一个快速的答案比得到一个尽可能
精确的答案要好得多
浮点型的描述
c标准通常描述定义足够多的术语来讨论浮点型的参变量 但是并没有说明如何得到一个正确的结果
float.h头文件补充已经存在的头文件limits.h 我们把那些可能对严格的数值运算程序员有用的每个参数都加入到float.h中
 
二 c标准的内容
float.h
float.h和limits.h  两个头文件定义了几个可以展开为各种范围和参数的宏
浮点类型的特征float.h
在一个模型的基础上定义   描述了浮点数字和一些值的表示方法   提供了一个实现浮点算术的信息   
s 符号+-1
b 指数表示的基数  一个大于1的整数
e 指数 一个值在e(min)和e(max)之间的整数
p 精度(b进制数的有效位数)
f(k) 比b小的非负整数 有效数字
一个规格化的浮点数x   如果x!=0  则f(1)>0  
 
 
FLT_ROUNTDS     浮点加法的舍入模式
FLT_RADIX 指数表示的基数
FLT_MANT_DIG 进制的浮点数的有效位数 p
...
三 float.h的使用
复杂的数值程序会用到    浮点算数的3个缺陷是上溢 下溢和有效值的丢失  以下有几种使用这些宏的方式  可以更加安全地执行double型算术运算  当然也适用于float和long double类型
 
上溢
为了避免上溢  一定要保证所有的值都不会超过DBL_MAX的数值
执行测试的时候 错误已经发生了  如果存储在y中的值太大了而不能表示   y可能会包含一个特殊的代码   dbl_max或者一个无用的值   由提供浮点算术的种类所决定
可以通过一个测试
if(x<log(DBL_MAX))
y=exp(x);
else
... /*HANDLE OVERFLOW*/
也可以通过使用一个相关的宏来避免计算log(DBL_MAX)
if(x<=FLT_MAX_10_EXP)
y=pow(10,x);
else
... /*HANDLE OVERLFOW*/
如果FLT_RADIX不等于10   此测试有必要  通常值为2   或者更少的情况为16   
函数ldexp使得通过2的幂来换算一个浮点数变得很容易   在FLT_RADIX等于2的普遍情况下   会是一个效率很高的操作
对于一个整型指数n来说
if(n<FLT_MAX_EXP)
y=ldexp(1.0,n);
else
... /*HANDLE OVERFLOW*/
当为数学库编写附加的函数时   很可能使用最后一个测试
 
下溢
为了避免下溢   一定要保证所有的值都大于等于DBL_MIN的数值  几乎所有的浮点实现都用0来代替一个过小而不能表示的值   只有当除以一个会产生下溢的值时  才会遇到麻烦。
测试
if(log(DBL_MIN)<=x)
y=exp(x)
else
.../*HANDLE UNDERFLOW*/
if(FLT_MIN10_EXP<=x)
y=pow(10,x);
else
.../*HANDLE UNDERFLOW*/
if(FLT_MIN_EXP<n)
y=ldexp(1.0,n);
else 
..../*HANDLE UNDERFLOW*/
 
有效值的丢失
当两个几乎相等的值相减的时候  就会发生有效值丢失   但是可以组织有效值的丢失  --把一个很小的数和一个很大的 数相加    一个浮点数表示只能保持一个确定的精度   

float.h的更多相关文章

  1. C 标准库系列之float.h

    float.h 内部主要包含了一系列的浮点数宏.指明可移植程序必要的常量:浮点数格式一般为Spxbe;其中S表示+-:p表示底数.b表示基数如2.8.10.16等进制,e为指数标识E或e: 在一般情况 ...

  2. <limits.h>和<float.h>

    头文件<limits.h>中定义了用于表示整类型大小的常量.以下所列的值是可接受的最小值,实际系统中可能有更大的值. CHAR_BIT char类型的位数 CHAR_MAX UCHAR_M ...

  3. <math.h>与<float.h>

    (一) <math.h> <math.h>文件中已经定义了M_PI,如下所示,用户可以直接使用: //math.h........................ #if de ...

  4. Standard C 之 math.h和float.h

    对于C Standard Library 可以参考:http://www.acm.uiuc.edu/webmonkeys/book/c_guide/ 或者 http://www.cplusplus.c ...

  5. <cfloat> (float.h)

    头文件: <cfloat> (float.h) 浮点类型的特性 这个头文件为特殊系统和编译器的实现描述了浮点类型的特征. 一个浮点数包含四个元素: 一个标志(a sign):正或负; 一个 ...

  6. C 标准库 - <float.h>

    C 标准库 - <float.h> 简介 C 标准库的 float.h 头文件包含了一组与浮点值相关的依赖于平台的常量.这些常量是由 ANSI C 提出的,这让程序更具有可移植性.在讲解这 ...

  7. <float.h>中DBL_TRUE_MIN的定义和作用

    搬运自己2016年11月22日于SegmentFault发表的文章.链接:https://segmentfault.com/a/1190000007565915 在学习C Prime Plus的过程中 ...

  8. C 标准库系列之limits.h

    limits.h 类似于float.h,其定义了一些列类型的值的范围.限制值,也就是说该类型的值不可以大于该上界或者小于该类型值的下界: glibc中宏定义了一下的值: # define MB_LEN ...

  9. float 浮点数与零值0比较大小

    float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if ...

随机推荐

  1. [转]SqlServer索引的原理与应用

    索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录 ...

  2. Windows下Apache+PHP+MySQL开发环境的搭建(WAMP)

    准备工作: 1.下载apache服务器安装包,官网http://www.apache.org/,下载地址:http://httpd.apache.org/download.cgi 2.下载MySQL, ...

  3. vue之导入Bootstrap和Jquery

    Vue引入bootstrap主要有两种方法 方法一:在main.js中引入,此方法导入的bootstrap中对于html,body的一些预设置的css样式可能无效. 一.引入jQuery 在当前项目的 ...

  4. 设置umask

    umask 002 例子:umask为003,建立的文件与目录权限是什么? umask为003,所有去掉的属性为-------wx,因此 文件  -rw-rw-r-- 目录 drwxrwxr--

  5. github入门一

    一.首先安装gitbash(自行百度)我使用的版本是Git-2.12.2.2-64-bit.exe 二.配置gitbash本地客户端 1.初始设置 1.1.设置姓名和邮箱地址 git config - ...

  6. Java文件操作系列[2]——使用JXL操作Excel文件

    由于java流无法实现对Excel文件的读写操作,因此在项目中经常利用第三方开源的组件来实现.支持Excel文件操作的第三方开源组件主要有Apache的POI和开源社区的JXL. 总体来说,二者的区别 ...

  7. Nengo 神经网络

    Nengo被加拿大滑铁卢大学的神经学家和软件工程师表示,这是迄今为止产生的世界上最复杂.最大规模的人类大脑模型模拟.这个名叫Spaun的大脑由250万 个模拟神经元组成,它能执行8种不同类型的任务.这 ...

  8. STL:string类中size()与length()的区别

    结论是:两者没有任何区别 解释: C++Reference中对于两者的解释: 两者的具体解释都一模一样: 理解: length是因为C语言的习惯而保留下来的,string类最初只有length,引进S ...

  9. BCB:内存泄漏检查工具CodeGuard

    一.为什么写这篇东西 自己在使用BCB5写一些程序时需要检查很多东西,例如内存泄漏.资源是否有释放等等,在使用了很多工具后,发觉BCB5本身自带的工具―CodeGuard,非常不错,使用也挺方便的,但 ...

  10. Codeforces Round #275 (Div. 2)-A. Counterexample

    http://codeforces.com/contest/483/problem/A A. Counterexample time limit per test 1 second memory li ...