Python学习精粹018:浮点数及其精确运算

浮点数是指带有小数点的数字,如3.1415。一个带有小数点的数字,即使小数部分为0,亦为浮点数,如0.0, 5.0。

一、取值范围

如下所示:

>>> import sys

>>> print(sys.float_info.min)

2.2250738585072014e-308

>>> print(sys.float_info.max)

1.7976931348623157e+308

可知,浮点类型的取值范围为2.2250738585072014e-308~1.7976931348623157e+308。

执行以下语句:

>>> import sys

>>> print(sys.float_info)

sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

可获得关于浮点类型(float)的信息,其中,max_exp属性表示以e为底数的幂运算的最大次幂,这里为e的1024次方;max_10_exp属性表示以10为底数的幂运算的最大次幂,这里为10的308次方;min_exp属性表示以e为底数的幂运算的最大次幂,此处为e的-1021次方;min_10_exp属性表示以10为底数的幂运算的最小次幂,此处为10的-307次方;mant_dig属性表示浮点数的精度;epsilon属性表示两个浮点数之间的最小差异;radix属性表示指数的底数,此处为2。

接着试试:

>>> print(pow(10.0, 309))

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

OverflowError: (34, 'Result too large')

将导致溢出错误(OverflowError: (34, 'Result too large')),运算结果超出了浮点类型的取值范围。

二、精确运算

如下所示:

>>> print(10.0/3)

3.3333333333333335

为何会出现这样的结果?

这是因为Python将一个实数(包括有限小数和无限小数)存储为IEEE 754标准的双精度数格式。双精度数在内存中占用8字节64位来存储,其中:1位用于存储符号(0或1,即正或负);11位用于存储指数,即2的幂,为小数点移动的位数;52位用于存储位数,是小数点右边的二进制位数,定义了浮点数的精度。如下图所示:

图3-1 IEEE 754标准的双精度数格式

请看下面的步骤:

1. 将十进制无限循环小数3.3333...转换为二进制数,为更清晰地说明问题,这里保留了小数点后53位:

2. 将该二进制数规范化为浮点表示法,即在小数点左边使用唯一的非零数码1,如下所示:

3. 对尾数M用“0舍1入”方法进行舍入处理:要保留小数点后的N位小数,如果N+ 1位为0,则直接舍去N位之后的小数;如果N + 1位为1,则在N位上加1,并舍去N位之后的小数。此处,尾数要保留52位,第53位为1,则在52位的0上加1变为1,并舍去52位之后的小数,如下:

4. 双精度数格式的指数在内存中占用11位,使用偏移量1023(,其中,指数在内存中的存储单元大小为11位)。因此,指数为1 + 1023 = 1024,十进制数1024转换为二进制数为10000000000。

这时,符号为0(正数),指数为10000000000,尾数为1010101010101010101010101010101010101010101010101011,合并起来,以IEEE 754标准双精度数格式存储在计算机中的数字为:

0100000000001010101010101010101010101010101010101010101010101011

5. 要将以IEEE 754双精度数格式存储的数字还原为十进制,可按照以下步骤:

(1)分别找到符号位(S)、指数位(E)、尾数位(M),如下:

(2)符号位(S)为0,意味着符号为正;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值