type
status
date
slug
summary
tags
category
icon
password
浮点数
我重新写一下
有了这个统一的浮点数标准,我们再把 25.125 转换为标准的 float 浮点数:
整数部分:25(D) = 11001(B)
小数部分:0.125(D) = 0.001(B)
用二进制科学计数法表示:25.125(D) = 11001.001(B) = 1.1001001 * 2^4(B)
所以
S = 0,
尾数 M = 1.1001001 = 1001001(去掉1,隐藏位),
指数 E = 4 + 127(中间数) = 131(D) = 10000011(B)。
填充到 32 bit 中,如下:
WPPLE97IZWMW1GYB9O.png?table=block&id=191d7fe6-d53e-80c1-8ad3-d03d1872a1a9&t=191d7fe6-d53e-80c1-8ad3-d03d1872a1a9)
用阿瑟发的链接,做了一个正确的图
25进制转二进制:除2取余
25/2 = 12 余 1
12/2 = 6 余 0
6/2 = 3 余 0
3/2 = 1 余 1
1/2 = 0 余 1
从下往上,11001 就是 25 的二进制
0.125 转二进制:乘二取整
0.125 * 2 = 0.25 整数部分 0
0.25 * 2 = 0.5 整数部分 0
0.5 * 2 = 1 整数部分 1
从上往下,0.001 就是 0.125 的二进制
浮点数的表示法:
就是采用科学计数法。
十进制为例: 834.5 = 8.345 * 10^2
写成公式:
V = M * R^E
M = 8.345
R = 10
E = 2
二进制的话:
11001.001 = 1.1001001 * 2^4
M = 1.1001001
R = 2
E = 4(这里也应该转成二进制,只是为了好看一些)
完整公式(多了一个符号):
V = (-1)^S * M * R^E
S 表示符号,0 或 1, 0 表示正数, 1表示负数
M 表示尾数,
R 二进制表示浮点数,就默认是 2 了
E 表示指数
所以我们记录 S M E 这三个值就能表示浮点数了。
标准 IEEE 754 规范了浮点数的表示
提供了 2 种浮点格式:
单精度浮点数 float:32 位,符号位 S 占 1 bit,指数 E 占 8 bit,尾数 M 占 23 bit
双精度浮点数 float:64 位,符号位 S 占 1 bit,指数 E 占 11 bit,尾数 M 占 52 bit
什么是精度?就是可以表示多少位的小数,位数越多,精度越高。
所以双精度 M 占52位,单精度占23位
为了使其表示的数字范围、精度最大化,浮点数标准还对指数和尾数进行了规定:
- 尾数 M 的第一位总是 1(因为 1 <= M < 2),因此这个 1 可以省略不写,它是个隐藏位,这样单精度 23 位尾数可以表示了 24 位有效数字,双精度 52 位尾数可以表示 53 位有效数字
- 指数 E 是个无符号整数,表示 float 时,一共占 8 bit,所以它的取值范围为 0 ~ 255。但因为指数可以是负的,所以规定在存入 E 时在它原本的值加上一个中间数 127,这样 E 的取值范围为 -127 ~ 128。表示 double 时,一共占 11 bit,存入 E 时加上中间数 1023,这样取值范围为 -1023 ~ 1024。
其他规定:
- 指数 E 非全 0 且非全 1:规格化数字,按上面的规则正常计算
- 指数 E 全 0,尾数非 0:非规格化数,尾数隐藏位不再是 1,而是 0(M = 0.xxxxx),这样可以表示 0 和很小的数
- 指数 E 全 1,尾数全 0:正无穷大/负无穷大(正负取决于 S 符号位)
- 指数 E 全 1,尾数非 0:NaN(Not a Number)
引用