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. JavaScriptSerializer类序列化日期时需要注意的问题

    1.让我们来看看使用JavaScriptSerializer类序列化日期会出现什么问题? 1)创建用于序列化的测试类,如下: public class Person { public int ID { ...

  2. [转]Java 8 Optional类深度解析(null处理)

    原文链接:http://www.importnew.com/6675.html 本文由 ImportNew - 高俊阳 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 身为一 ...

  3. 【实用】Html5实现文件异步上传

    1 简介 开发文件上传功能从来不是一件愉快的事,异步上传更是如此,使用过iframe和Flash的上传方案,也都感觉十分的别扭.本文简要简绍利用Html5的FormData实现文件的异步上传,还可以实 ...

  4. 解决 Cocos2d-x 3.2 error C1041: 无法打开程序数据库vc120.pdb

    单个项目解决方案 解决方案是为项目添加 /FS (Force Synchronous PDB Writes) 编译选项,具体位置在: 一劳永逸的解决方案 直接修改cocos的项目模板templates ...

  5. spring 中bean学习笔记

    spring 中bean 一.bean的定义和应用 1. bean 形象上类似于getXX()和setXX()的一种. 2. 由于java是面向对象的,类的方法和属性在使用中需要实例化. 3. 规律: ...

  6. 反射机制与IOC容器

    原文地址:http://blog.csdn.net/u010926964/article/details/47262771

  7. (转)SpringMVC学习(五)——SpringMVC的参数绑定

    http://blog.csdn.net/yerenyuan_pku/article/details/72511611 SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解.本文所有案 ...

  8. 强化学习_Deep Q Learning(DQN)_代码解析

    Deep Q Learning 使用gym的CartPole作为环境,使用QDN解决离散动作空间的问题. 一.导入需要的包和定义超参数 import tensorflow as tf import n ...

  9. layui模块规范

    刚入公司不久,就开始做项目了,最后还是选择用layui来做前端的页面,一来是可以自适应,二来是用框架比较方便,简洁. 先看下Layui的介绍: layui 是一款采用自身模块规范编写的情怀级前端UI框 ...

  10. python之set (集合)

    1. 集合是什么 set {1,2,3} 2. 集合怎么用 去重 集合是无序的 集合就是一个没有值的字典,遵循:唯一,无序,元素要求可哈希(不可变) 集合是可变的 2.1 增 方法一: s.updat ...