Python 为什么1.1 +2.2 等于3.3000000000000003

Python 为什么1.1 +2.2 等于3.3000000000000003

print(2.2 + 1.1)
>>> 3.3000000000000003

众所周知,计算机只认识0和1两种状态,因此在机器字节有限的情况下,浮点数的小数部分难免有误差。eg:

用8个字节表示0到1的小数。8个字节存储0和1共有256种状态,因此它的最小分度为1 / 256 = 0.00390625。因此若遇到比0.00390625更小的刻度时就会产生误差

如此,不防谈一谈双精度浮点数在计算机内是如何存储的。

一般Python和c中 计算机存储遵从IEEE 754标准

Python 为什么1.1 +2.2 等于3.3000000000000003_第1张图片
sign 表示正负号 sign=0为正数,sign=1为负数。
exponent 指数 也叫阶码
fraction 尾数
总体就是科学计数法
Python 为什么1.1 +2.2 等于3.3000000000000003_第2张图片
移码是指一个n+1位的数值,在真值基础上加上一个2n的偏置值。
例如:一个八位数:x=(12)10=(0000 1100)2
[x]移=27+(0000 1100)2=1000 1100
但在浮点数的阶码中为了表示无穷大的数值,将移码为全1的状态空出来表示无穷大,故在阶码中的偏置值为2n-1,同时将移码为全0的状态空出来表示非规格化数。
即在长浮点数的存储中,阶码E的取值为1~2046。
float类型的偏置值为127,double为1023

你可能感兴趣的:(Python,python,数据分析,补码)