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. 现在的Unix时间戳(Unix timestamp)

    如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)? Java time JavaScript Math.round(new Date().getTime()/1000)ge ...

  2. LVDT

    什么是 LVDT? LVDT 是线性可变差动变压器的缩写. 它是一种常见类型的机电传感器,可将其以机械方式耦合的物体的直线运动转换为对应的电气信号.LVDT 线性位移传感器随时可用,可以测量各种移动, ...

  3. aspx页面调用webapi接口报错:远程服务器返回错误:(500)内部服务器错误

    代码在运行到response = (HttpWebResponse)request.GetResponse();就开始报错 原因:可能因为所调用的接口不存在或者接口中存在错误,可用postman测试接 ...

  4. gin 打linux环境包问题解决

    打window包直接go build一下,完事, 但是,打linux包出现如下错误 ..\github.com\mattn\go-isatty\isatty_linux.go:7:8: cannot ...

  5. AJPFX总结hashmap和hashtable的区别

    Hashtable和HashMap类有三个重要的不同之处.第一个不同主要是历史原因.Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现. ...

  6. windows Git的安装和使用

    一.本人是根据廖雪峰大神的个人官网学习的git,并有感而发以做笔记的方式写下这篇博客,希望可以帮助到自己和其他人,廖雪峰个人官网http://www.liaoxuefeng.com/ 二.声明我的电脑 ...

  7. sysdig安装和使用介绍

    安装步骤1)安装资源库rpm --import https://s3.amazonaws.com/download.draios.com/DRAIOS-GPG-KEY.publiccurl -s -o ...

  8. 查看进程lsof

    查看8000端口 lsof -i :8000 杀死进程 pkill -ns <pid>

  9. Educational Codeforces Round 11 _D

    http://codeforces.com/contest/660/problem/D 这个题据说是很老的题了 然而我现在才知道做法 用map跑了1953ms: 题目大意 给你n个点的坐标 求这些点能 ...

  10. Thread源码分析-java8

    1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...