浮点数简述
1个回答
展开全部
我们都知道计算机内部存储和表示数据都是用二进制来表示的,所以当你想表示一个浮点数的时候,很自然的就是跟整数的二进制一样,只不过多了个小数点,如下所示:
= =
也就是每一位的权重都是对应的2的i次幂,也就是可以用如下公式表示:
但是这种表示方法有几种缺陷:
1. 小数部分只能表示符合 的数字,像 1/5 这种数字,只能无限接近
2. 在有限的长度内,比如32位或者64位,用这个表示方法很难表达很小以及很大的数
在1985年前,各个计算机厂商都有自己的浮点数表示和计算方法,并且大部分都不会把精确度放在第一位,更多的是考虑计算速度和实现上的方便。直到1985年, IEEE 才起草出版了 IEEE 754标准 ,统一了浮点数表示和计算方法。
1. 计算公式
+ 符号位 s 决定了该数是正数还是负数
+ 有效位 M 决定了小数部分的数值,数值范围为 [1.0, 2.0)
+ 指数位 E 表示2的幂次
2. 内存表示及解码规则
其中:
+ s 是符号位
+ exp 部分用来编码指数 E (但不等于 E )
+ frac 部分用来编码有效位 M (但不等于 M )
3. 32位和64位浮点数比较
+ 单精度 32位
数值大小
+ 双精度 64位
数值大小
1. "Normalized"
当 exp 部分不全为0 并且不全为1时,表示该浮点数为 Normalized。
+ E 可通过公式计算:E = Exp - Bias
+ M 编码为: , 其中
- xxx...xxx 为 frac部分
- 最小值为M=1.0, 最大值是当frac=111.....1111 (M=2.0- )
- 此时 M 部分自动带上前面的1
比如 :
其中:E = Exp - Bias = 140 - 127 = 13
2. "Denormalized"
当 exp = 000...0 时,此时
+ E 可通过公式:E = 1 - Bias
+ M 可编码为: ,其中
- xxx.xxxx 为frac部分
+ 表示两种类型的数
- exp = 00...000, frac = 000...0000, 表示0,-0和+0是不同的表示
- exp = 00...000, frac 000...0000, 表示接近于0的数字
3. 特殊数字
当 exp = 111...111时
+ exp = 111...111, frac = 000...000
- 表示无限数,用于处理计算溢出的情况,有正反符号
+ exp = 111.111, frac 000...000, 表示 NaN
1. 浮点数相加和相乘并不符合数学四则运算的 结合律 ,比如
, (大小数相加取整导致丢失精度)
(1e20*1e20) * 1e-20= inf, 1e20 * (1e20*1e-20)= 1e20 (大数相乘导致溢出)
2. 浮点数相乘不符合数学四则运算的 分配律 , 比如
1e20 * (1e20-1e20)= 0.0, 1e20*1e20 – 1e20*1e20 = NaN
= =
也就是每一位的权重都是对应的2的i次幂,也就是可以用如下公式表示:
但是这种表示方法有几种缺陷:
1. 小数部分只能表示符合 的数字,像 1/5 这种数字,只能无限接近
2. 在有限的长度内,比如32位或者64位,用这个表示方法很难表达很小以及很大的数
在1985年前,各个计算机厂商都有自己的浮点数表示和计算方法,并且大部分都不会把精确度放在第一位,更多的是考虑计算速度和实现上的方便。直到1985年, IEEE 才起草出版了 IEEE 754标准 ,统一了浮点数表示和计算方法。
1. 计算公式
+ 符号位 s 决定了该数是正数还是负数
+ 有效位 M 决定了小数部分的数值,数值范围为 [1.0, 2.0)
+ 指数位 E 表示2的幂次
2. 内存表示及解码规则
其中:
+ s 是符号位
+ exp 部分用来编码指数 E (但不等于 E )
+ frac 部分用来编码有效位 M (但不等于 M )
3. 32位和64位浮点数比较
+ 单精度 32位
数值大小
+ 双精度 64位
数值大小
1. "Normalized"
当 exp 部分不全为0 并且不全为1时,表示该浮点数为 Normalized。
+ E 可通过公式计算:E = Exp - Bias
+ M 编码为: , 其中
- xxx...xxx 为 frac部分
- 最小值为M=1.0, 最大值是当frac=111.....1111 (M=2.0- )
- 此时 M 部分自动带上前面的1
比如 :
其中:E = Exp - Bias = 140 - 127 = 13
2. "Denormalized"
当 exp = 000...0 时,此时
+ E 可通过公式:E = 1 - Bias
+ M 可编码为: ,其中
- xxx.xxxx 为frac部分
+ 表示两种类型的数
- exp = 00...000, frac = 000...0000, 表示0,-0和+0是不同的表示
- exp = 00...000, frac 000...0000, 表示接近于0的数字
3. 特殊数字
当 exp = 111...111时
+ exp = 111...111, frac = 000...000
- 表示无限数,用于处理计算溢出的情况,有正反符号
+ exp = 111.111, frac 000...000, 表示 NaN
1. 浮点数相加和相乘并不符合数学四则运算的 结合律 ,比如
, (大小数相加取整导致丢失精度)
(1e20*1e20) * 1e-20= inf, 1e20 * (1e20*1e-20)= 1e20 (大数相乘导致溢出)
2. 浮点数相乘不符合数学四则运算的 分配律 , 比如
1e20 * (1e20-1e20)= 0.0, 1e20*1e20 – 1e20*1e20 = NaN
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询