CSAPP学习笔记——Fraction Binary Numbers
来源:互联网 发布:js中中jsonarray怎么用 编辑:程序博客网 时间:2024/05/17 06:50
浮点数的二进制底层表示
同整数的二进制底层表示,浮点数也是2的幂的加权。
对于二进制比特串
表示
因为只能表示为2的幂的加权,所以这种表示形式就有很大的漏洞,那就是任何一个浮点数只能近似的表示。
早期各个计算机制造公司对于浮点数的底层解释不同,这就意味着移植性很差没有统一标准。为了方便,制定了
IEEE浮点数标准
IEEE浮点数标准使用32位bit表示单精度浮点数
它们在机器中表示如下 :
看图片我们可以知道,无论是单精度还是双精度,都分成了三个部分:
sign : 符号位,sign为1表示负数,为0表示正数exponent : 单精度8位(23-30),双精度11位(52-62)。表示一个权重,是2的幂的加权形式。frac :n位frac 编码尾数位M。尾数M是一个二进制的小数,它的范围是1 to 2−ϵ 或者是0 to 1−ϵ
这里解释一下
一个给定的比特串,根据
Normalized Values(规范化数值)
这是最为常见的值。
当
阶码
这种情况下,
以单精度浮点数为例。
再除去
尾数
处于Normalized Values(规范化数值)情况下,
Denormalized Values(非规范化数值)
阶码
非规范化数值,
这种情况下
尾数
Special Values(特殊值)
阶码
这种情况下
尾数
如果在这种情况下,尾数全为0。
s=1 时表示负无穷,s=0 表示正无穷。- 如果尾数不为0,那么这表示不是一个数。用NaN(Not a Number)来表示
例子
十进制整数的科学计数法的二进制表示
简单说一个例子,比如说十进制整数
所以
最后位数不够,末尾补零,得到
浮点数的舍入
前面我们说过,浮点数只能近似的表示一个数。因此对于一个自然小数
这种方式成为舍入(rounding),顾名思义就是根据一定的规则将数字的一部分舍去或者入位(进位)。
舍入的一个关键问题是 : 当数字恰好处于上下限中间位置的时候,我们该如何处理。
计算机对于浮点数的舍入有四种模式,我们依次介绍。
假如说对于一些浮点数,我们想保留整数位,那么四种不同的舍入方式如下。
Round-to-even : 向偶数舍入(也称为向最近的数舍入 round-to-nearest)这是大部分计算机的默认舍入方式。当数据不在两个数中间时,
1.40,1.60 会向最近的数舍入,依次对应为1,2 ,如果说数据位于两个数中间1.50,2.50 会舍入到最近的偶数,因此两个的结果都是2 。Round-toward-zero : 向0的方向舍入。每次舍入都会使得数字向0的方向靠拢。
Round-down : 顾名思义即向下舍入,每个数变为第一个小于它的整数。如第一个小于
−1.50 的整数是−2 ,实际上,就是向数轴的负方向舍入。Round-up : 对应Round-down,向数轴的正方向舍入。
我们可能会有些疑问,为什么默认的方式是向偶数舍入?
想象一个场景,舍入一组数之后,然后计算这组数的平均值是有偏差的。
采用round-up,平均值略高。
采用round-down,平均值会略低。
采用round-toward-zero,只有在正数和负数的数量差不多的时候,平均值的误差才比较低,然而实际情况中,对正数和负数的数量我们是不能做任何假定的。
采用round-to-even可以尽量减少这种偏差,因为它%
50 的情况向上舍入,%50 的情况向下舍入。
Round-to-even不仅适用于保留整数的舍入。
十进制小数的舍入
无论哪种舍入方式,保留两位小数,对1.2349999 得到1.23 ,1.235001 得到1.24 ,因为这两个数都不在1.23 和1.24 的中间。另一方面,1.2350000 和1.2450000 按照向偶数舍入都将得到1.24 ,因为4 是偶数,且两个数都是一个中间值。二进制小数的舍入
我们把0 看做偶数,1 看做奇数。
并且只有形如XXXXX.YYYYY110 这种比特串才可以表示处于两个可能结果值的中间位置。
其中X,Y 表示任意的值,最右边的Y 表示要保留的最后一位。
加入说要保留两位小数(对二进制小数来说即舍入到最近的14 的位置)。10.000112(2332) 向下舍入得到10.002(2) 10.001102(2316) 向上舍入得到10.012(214) 10.111002(278) 会向偶数舍入得到11.002(3) ,注意这里的偶数不是说最后的结果是偶数,而是小数后第二位之前是1 ,0 代表偶数,所以10.11+1 得到了11.00 。10.101002(258) 向偶数舍入得到10.102(212)
浮点数的运算
由于浮点数只能近似的表示自然小数,因此它的计算由于舍入(rounding)会损失精度,标准制定了特殊的规则。
浮点数加法
对于浮点数
浮点数加法是可交换的,也就是说
但是浮点数加法是不可结合的,例子
因此浮点数加法是不可结合的,编译器通常不会对浮点数加法做任何优化。
**特殊的:
浮点数乘法
对于浮点数
同样,乘法满足交换律,不满足结合律。
C中的浮点数
C语言并不支持
- int->folat : 数据不会溢出,可能会有舍入的情况
- int,float->double : 数据不会溢出,精度也不会损失。(
double 有最大的范围和精度) - double->float : 数据可能溢出为
+∞ 或者−∞ ,否则的话可能会舍入,因为float 精度较小。 float,double->int : 正常来讲,会向0舍入。例如
−1.999−>−1 。如果发生了溢出,很遗憾,C标准没有给出这个溢出的值应该是多少,兼容Intel 的微处理器会用Min Signed[10000...000] 来代替这个数值。例如在我的机器上给出下列代码:
#include <stdio.h>#include <math.h>#include <limits.h>int main(){ double x = 1e10; int y = INT_MIN; printf("%d\n",(int)x); printf("%d\n",y); return 0;}
得到的结果是
也就是说,当一个浮点数不能正确的转换为一个合理的整数的时候,就会得到
- CSAPP学习笔记——Fraction Binary Numbers
- CSAPP学习笔记——Integer Representation
- 工作学习笔记——CSAPP第三章
- CSAPP学习笔记
- [CSAPP学习笔记] 栈帧
- CSAPP 学习笔记(1)
- CSAPP笔记——虚拟存储器(1)
- python学习笔记6--fraction
- CSAPP 学习笔记 Chapter one
- CSAPP 学习笔记 Chapter two
- csapp第二章学习笔记
- CSAPP学习笔记(第一,二章)
- CSAPP学习笔记(异常控制流1)
- CSAPP 学习笔记 Chapter two & three
- CSAPP第三章学习笔记(二)
- CSAPP笔记
- CSAPP笔记
- 杭电ACM1390——Binary Numbers
- 关于火狐浏览器的一下功能
- Network Saboteur(POJ--2531
- HDU 1495 非常可乐
- UTF-8 BOM
- poj 1159 二维线段树 插点求线
- CSAPP学习笔记——Fraction Binary Numbers
- 编写高效的C程序与C代码优化
- 怎样让函数返回数组
- asp.net(C#)利用QRCode生成二维码
- angularjs中常见错误
- 面向对象编程思想--多态实例分析
- Memcached常用命令及使用说明
- android 联系人数据库一些知识点
- linux系统安装IBM WebSphere Application Server(简称WAS)报错:JVM terminated. Exit code=1 ....