浮点数进行计算时,产生精度损失:
发现问题:
在算法编程中,经过计算本应该得到对称矩阵,但是却得到和对称矩阵有微小差异的非对称矩阵。经多次检查,确定并非算法错误,困扰了很久,没有解决。
解决问题:
最后在看一个python的基础教程时,看到有关浮点数精度损失的问题,才想到可能是精度损失影响了计算。(这可能是所谓的温故知新吧)
所以在对数值的精度有一定要求的算法实现时,可以考虑用python的第三方库decimal来避免精度损失的问题。
python中的浮点数运算,相当于二进制的浮点数运算,而decimal中的浮点运算,相当于十进制的浮点运算,所以可以避免精度损失的问题。
补充:并没有去研究decimal的具体实现十进制浮点数运算的方法,但是考虑到定点运算时采用了BCD码,猜想decimal或许也是用了BCD编码吧,或许是很吃内存的方法。
为什么要出现定点数和浮点数?
定点格式在知道这些数不会超过预先确定的内存单元,且没有太多小数位的场合比较合适用,在数可能很大或可能很小的场合定点格式完全不适用。假设保留一个内存区域用来存储以英尺为单位的距离,则存在的问题是距离可能超出范围。从地球到太阳的距离是490 000 000 000英尺,氢原子的半径为0.00000000026英尺,则需要12字节的定点存储空间来容纳这些可能很大也可能很小的数值。
浮点格式采用了“科学计数法”。
二进制浮点数算术运算标准(IEEE浮点数标准)定义了两个基本格式:单精度格式,需要4个字节,双精度格式,需要8个字节。
单精度浮点数格式:
其数值为:
双精度浮点数格式
其数值为:
用浮点数表示一些极大和极小的数值比较方便,但是在处理浮点数的时候经常会发生精度损失的问题。
参考书:编码的奥秘(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/38024079blog.csdn.netPython的浮点数损失精度问题(为什么说双精度浮点数有15位十进制精度) - fyfcauc的专栏 - CSDN博客blog.csdn.nethttps://blog.csdn.net/fyfcauc/article/details/38024079blog.csdn.net【小思考】Python的float转换精度损失所想到的 - 黄烤鸭 - 博客园www.cnblogs.com9.4. decimal - Decimal fixed point and floating point arithmetic - Python 2.7.16 documentationdocs.python.org