二进制(2):浮点数
来源:互联网 发布:qq群做淘宝客赚钱吗 编辑:程序博客网 时间:2024/05/21 07:56
一些数学符号的解释:
a的值无限接近于1。
浮点数,例如C语言的float与double,每天都会用,但是有很多人不知道为什么它被称为浮点,以及它表示的值是如何从1与0的机器代码中计算出来的。以下内容回答了几个基本问题,1,什么是浮点数?点是如何浮动的?浮点数的优势是什么?2,目前通用的IEEE754浮点数是如何计算的?3,如果浮点数被赋的值,例如运算结果或其他格式转换后的值不在浮点数可表示的范围之内会发生什么?4,同样数值的二进制代码在整数编码和浮点数编码中有什么区别?
1,什么是浮点数?点是如何浮动的?
为什么称为浮点数?什么是定点表示法?
“浮点”一词相对于“定点”,表示小数点是可移动的。先理解定点,在无符号编码中 1111 1111的值为
无符号编码和补码编码也是属于定点表示法,只是他们的“小数点”是定在了最低位的右边。
浮点数的小数点是如何浮动的?
在定点表示法中,例如无符号编码,我们可以把[0000 0000]看做 [0000 0000.],最后面的小数点无论如何它的位置是不会变化的。但假设我们规定一个新的编码规则: 设变量 V的位向量在无符号编码下的值为E,而
再看一下目前各编程语言都在用的IEEE浮点标准:
公式中的
浮点数相对于定点表示法的优势
1,在同样的位数中有更大的取值范围
定点表示法的缺点是它能表示的数值范围很小,在位向量有限的位数中既要表示整数又要表示小数,例如上面定义的[1111.1111],最低四位表示小数部分。它的最大值是
2,在同样的位数中可以更精确的表示小数
一组二进制位向量所能表示的小数数量是有限的,所以它只是一种模拟实数运算的方法,当给浮点数变量赋值为小数时,它的值将会是最接近被赋值的一个匹配值,一个位向量能表示的匹配值的多少可以理解为这个位向量的精度。定点表示法的第二个缺点是它能表示的匹配值很少,同样上面定义的1111.1111的小数部分只能表示
2,目前通用的IEEE754浮点数是如何计算的?
以上假设的浮点数编码只是用来理解一些浮点数的概念,目前通用的IEEE754浮点数值的计算公式要更加复杂与精妙:
一个32位的IEEE浮点数的位向量分为三个部分:
[0(符号位) 00000000(阶码位) 00000000000000000000000(小数位)]
从右起,0-23位为小数位,24-31位为阶码位,32位最高位为符号位。
符号位:符号位比较好理解,在公式1中,如果符号位为0,V的值就会为正,如果符号位为1,V的值就会为负。设符号位的值为s。
阶码位:阶码位决定了V的取值范围,但它并不就是等于公式1中的E。设阶码位的值=exp,计算exp的值的方法采用无符号编码规则。
小数位:设小数位的值=frac,计算frac的值的方法是也是定点数表示法,
计算IEEE浮点数值根据阶码的值分为三种情况:
在不同的情况中,公式1中的E与M的计算方式会有差异:
—情况1,阶码位非全0,并且非全1。这种情况下,浮点数的值被称为规格化的值。
—情况2,阶码位全0。非规格化的值。
—情况3,阶码位全1。特殊值。
先分析与比较32位的浮点数的情况1与情况2:
情况1中E与M的计算方法:
情况2中E与M的计算方法:
情况1之中,E的最小值是
情况2之中,E的值是唯一的,1-127=-126。M的最小值是
随着小数位的值的递增以及符号位的变化,匹配值均匀分布在数轴上0的两端,
比较情况1和情况2,有几个值得注意的点:
1,E:E决定了数值的取值范围,最小值,最大值,最接近0的正值,以及最接近0的负值。
2,
3,小数位位数23:在数轴上,
再看一下情况3,特殊值:
当阶码位全为1时,如果小数位全为0,此数表示无穷大,
当阶码位全为1时,如果小数位不全为0,此数为NaN,not a number,不是一个数。两个值为无穷的float相减结果为NaN,如果一个float变量被赋值sqrt(-1),根号-1,它的值也会变为NaN。
3,如果浮点数被赋的值,例如运算结果或其他格式转换后的值不在浮点数可表示的范围之内会发生什么?
与一个整数变量不可能表示所有整数一样,一个浮点数也无法表示所有小数。因为浮点数根据长度与格式不同,它只能表示有限的匹配数,如果变量被赋的值不在这些匹配数之中,系统将会去寻找最接近的匹配值,也既是将变量被赋的值进行舍入。IEEE浮点数采用的舍入模式是“向偶数舍入”,这种舍入模式是寻找最接近的匹配值,如果被舍入的值正好在两个匹配数的正中间,将会寻找最接近的最低有效位为偶数的匹配值。例如假设某个浮点数可表示的匹配值只有1和2,如果将变量赋值为1.4,浮点数的值将为1,1.6为2,1.5为2。像偶数舍入也可以转化为位向量进行理解,例如在1=[0000 0001]与2=[0000 0010]的正中间是[0000 0001.1],它将向2舍入,因为2的最低有效位是偶数0。
当两个浮点数进行运算时,在运算之前他们会分别进行舍入,在运算之后,他们的运算结果将会被进行舍人,由于这种对运算结果的自动舍入,浮点数的运算不具有结合性与分配性,例如a+b+c不一定等于a+(b+c),在第一次运算后a+b与b+c都有可能得出舍入后的值。1e20*(1e20-1e20)
当一个int变量强制转换为float变量后,它不会溢出,因为float变量可赋值的范围要大于int,但是它有可能被舍入成最近的匹配值,因为int可以精确表示它可被赋值范围内的所有整数,但是float的可表示数值是以
4,同样数值的二进制代码在整数编码和浮点数编码中有什么区别?
例:
我们先手动将12345的二进制代码转换为IEEE32位浮点数格式。
1,移小数点至最高有效位的右边,左移位数转化为2的幂,
2,因为此数为规格化数,根据公式1,M=1+frac,可以舍去最高位的1,变为了[.1000000111001]。
3,添加0使小数位达到23位,[10000001110010000000000]。(32位浮点)
4,构造阶码部分e。E=13,bias=127,E=e-bias,e=E+bias=130。
5,添加符号位,结果为:
转换之后可以看到一个现象,无符号编码删除最高位后的位向量与浮点数小数数位的高位段完全相同。
学习资料:深入理解计算机系统(原书第二版 )—Randal E.Bryant
- 二进制(2):浮点数
- 浮点数的二进制表示2
- 浮点数的二进制表示2
- CI5.2-输出浮点数的二进制
- 浮点数的二进制
- 浮点数二进制表示
- 浮点数二进制表示
- 浮点数转二进制
- 二进制浮点数基础知识
- 浮点数二进制表示
- 浮点数二进制表达
- 浮点数二进制表示
- IEEE 浮点数二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- 浮点数的二进制表示
- [从头学数学] 第229节 导数与微分
- 个人对OI中搜索题的看法
- zabbix的必须记住的配置
- css hack
- 今年的目标
- 二进制(2):浮点数
- SVM基础
- python入门神图
- ReactNative(五)——组件封装、样式定义、父子组件通过props传值
- Unix & Linux笔记(11)
- Finereport与Java Web
- CentOS7 根目录扩容
- Eclipse如果关闭了JavaScript、xml等文件的校验,我怎么人工去验证某个诸如xml文件格式是否有错误??
- 线性表的顺序存储结构