python数据精度_浮点数的精度损失 python

浮点数进行计算时,产生精度损失:

发现问题:

在算法编程中,经过计算本应该得到对称矩阵,但是却得到和对称矩阵有微小差异的非对称矩阵。经多次检查,确定并非算法错误,困扰了很久,没有解决。

解决问题:

最后在看一个python的基础教程时,看到有关浮点数精度损失的问题,才想到可能是精度损失影响了计算。(这可能是所谓的温故知新吧)

所以在对数值的精度有一定要求的算法实现时,可以考虑用python的第三方库decimal来避免精度损失的问题。

python中的浮点数运算,相当于二进制的浮点数运算,而decimal中的浮点运算,相当于十进制的浮点运算,所以可以避免精度损失的问题。

补充:并没有去研究decimal的具体实现十进制浮点数运算的方法,但是考虑到定点运算时采用了BCD码,猜想decimal或许也是用了BCD编码吧,或许是很吃内存的方法。

为什么要出现定点数和浮点数?

定点格式在知道这些数不会超过预先确定的内存单元,且没有太多小数位的场合比较合适用,在数可能很大或可能很小的场合定点格式完全不适用。假设保留一个内存区域用来存储以英尺为单位的距离,则存在的问题是距离可能超出范围。从地球到太阳的距离是490 000 000 000英尺,氢原子的半径为0.00000000026英尺,则需要12字节的定点存储空间来容纳这些可能很大也可能很小的数值。

浮点格式采用了“科学计数法”。

二进制浮点数算术运算标准(IEEE浮点数标准)定义了两个基本格式:单精度格式,需要4个字节,双精度格式,需要8个字节。

单精度浮点数格式:

equation?tex=%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7C%7D+%5Chline+s%3D1%E4%BD%8D%E7%AC%A6%E5%8F%B7+%26+e+%3D+8%E4%BD%8D%E6%8C%87%E6%95%B0%26f%3D23%E4%BD%8D%E6%9C%89%E6%95%88%E6%95%B0%5C%5C+%5Chline+%5Cend%7Barray%7D%5C%5C

其数值为:

equation?tex=%28-1%29%5E%7Bs%7D%5Ctimes1.f%5Ctimes+2%5E%7Be-127%7D

双精度浮点数格式

equation?tex=%5Cbegin%7Barray%7D%7B%7Cc%7Cc%7C%7D+%5Chline+s%3D1%E4%BD%8D%E7%AC%A6%E5%8F%B7+%26+e+%3D+11%E4%BD%8D%E6%8C%87%E6%95%B0%26f%3D52%E4%BD%8D%E6%9C%89%E6%95%88%E6%95%B0%5C%5C+%5Chline+%5Cend%7Barray%7D%5C%5C

其数值为:

equation?tex=%28-1%29%5E%7Bs%7D%5Ctimes1.f%5Ctimes+2%5E%7Be-1023%7D

用浮点数表示一些极大和极小的数值比较方便,但是在处理浮点数的时候经常会发生精度损失的问题。

参考书:编码的奥秘(code)/(美)彼得楚尔得(Petzold,C.)著;伍卫国,王宣政等译 -北京:机械工业出版社,2000,9 247-250

参考网页:http://0.30000000000000004.com/​0.30000000000000004.com如何手算十进制浮点数转二进制(IEEE754-32位)浮点数​www.jianshu.comhttps://blog.csdn.net/fyfcauc/article/details/38024079​blog.csdn.netPython的浮点数损失精度问题(为什么说双精度浮点数有15位十进制精度) - fyfcauc的专栏 - CSDN博客​blog.csdn.nethttps://blog.csdn.net/fyfcauc/article/details/38024079​blog.csdn.net【小思考】Python的float转换精度损失所想到的 - 黄烤鸭 - 博客园​www.cnblogs.comv2-9a67d821ddcfb6604452fb3546edc317_180x120.jpg9.4. decimal - Decimal fixed point and floating point arithmetic - Python 2.7.16 documentation​docs.python.org

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值