存储方式(以单精度为例)
存储原理
先解释存储原理,更容易理解后面的内容。
例 4.25 这个浮点数
先将其转换为二进制,即 100.01
然后再用二进制科学计算法表示,转换过程为:100.01 -> 1.0001 ^ 2 -> >1.0001 ^ 10
最终,十进制4.25的二进制为 1.0001^10。
那么,其中的 1.0001 是尾数,存放在尾数位
10 为 指数,存放在指数位
符号为0(代表正数)。存放在符号位
大概原理就是这样,具体下面有一些细节补充
float 为单精度,共有32位。按照作用,分为三部分:1、符号位;2、指数位;3、尾数位。
1、符号位
表示整个浮点数的正负
2、指数位
存放浮点数的指数部分(二进制科学记数法的指数,不是十进制科学记数法的指数)。指数也有正负,使用移位存储来表示正负。
3、尾数位
存放浮点数的尾数部分。因为二进制科学记数法的尾数都是以1开头,因此尾数开头的1省去不记。即 23 位的尾数位可存储 24 位尾数。
附1,十进制浮点数转二进制
将整数部分和小数部分 分开转为二进制。最后合到一起。
例如 4.6 -> 100.1001 1001……
整数: 4 -> 100,
小数:0.6 -> 1001 1001 ……
具体转换过程,每次将小数部分* 2 ,取结果的整数部分为第一位,然后小数部分再*2,取结果的整数部分为第二位,依次类推,直到最终结果为1.
0.6 * 2 = 1.2 ,取 1
0.2 * 2 = 0.4 ,取 0
0.4 * 2 = 0.8 ,取 0
0.8 * 2 = 1.6 ,取 1
0.6 * 2 = 1.2 ,取 1
会发现这里无限循环了。即0.6的二进制为1001 1001 …(无限循环),但是计算机存储浮点数的位数是有限的。所以浮点数 会出现精度丢失的问题。
练习: 8.5 转化为二进制。
附2,二进制浮点数转十进制
反过来就是了。比如将0.6的近视值二进制1001 1001转换为十进制,将浮点数的第一位 乘以 2^ -1 (即1/2,0.5), 第二位 乘以 2 ^ -2(即1/4,0.25) , 第三位 乘以 2 ^ -3 (即1/8,0.125)……。然后全部相加,计算总值。即
和 = 0.597656 (少了的部分为精度丢失)