- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3.2执行精确的浮点数运算
3.2 执⾏精确的浮点数运算
问题
你需要对浮点数执⾏精确的计算操作,并且不希望有任何⼩误差的出现。
解决⽅案
浮点数的 个普遍问题是它们并不能精确的表⽰⼗进制数。并且,即使是最简单的数
学运算也会产⽣⼩的误差,⽐如:
a = 4 .2
b = 2.1
a + b
6.300000000000001
(a + b) == 6.3
False
这些错误是由底层CPU和IEEE 754标准通过⾃⼰的浮点单位去执⾏算术时的特征。由
于Python的浮点数据类型使⽤底层表⽰存储数据,因此你没办法去避免这样的误差。
如果你想更加精确(并能容忍 定的性能损耗) ,你可以使⽤decimal模块:
from decimal import Decimal
a = Decimal(4 .2)
b = Decimal(2.1)
a + b
Decimal(6.3)
print(a + b)
6.3
(a + b) == Decimal(6.3)
rue
初看起来,上⾯的代码好像有点奇怪,⽐如我们⽤字符串来表⽰数字。然⽽,
Decimal对象会像普通浮点数 样的⼯作(⽀持所有的常⽤数学运算) 。如果你打印它们
或者在字符串格式化函数中使⽤它们,看起来跟普通数字没什么两样。
decimal模块的 个主要特征是允许你控制计算的每 ⽅⾯,包括数字位数和四舍五⼊
运算。为了这样做,你先得创建 个本地上下⽂并更改它的设置,⽐如:
from decimal import localcontext
a = Decimal(1.3)
b = Decimal(1.7)
print(a / b)
0.7647058823529411764705882353
with localcontext() as ctx :
... ctx .prec = 3
... print(a / b)
...
0.765
with localcontext() as ctx :
... ctx .prec = 50
... print(a / b)
...
0.76470588235294117647058823529411764705882352941176
讨论
decimal模块实现了IBM 的”通⽤⼩数运算规范” 。不⽤说,有很多的配置选项这本书没
有提到。
Python新⼿会倾向于使⽤decimal模块来处理浮点数的精确运算。然⽽,先理解你的应
⽤程序⽬的是⾮常重要的。如果你是在做科学计算或⼯程领域的计算、电脑绘图,或
者是科学领域的⼤多数运算,那么使⽤普通的浮点类型是⽐较普遍的做法。其中 个
原因是,在真实世界中很少会要求精确到普通浮点数能提供的17位精度。因此,计算
过程中的那么 点点的误差是被允许的。第⼆点就是,原⽣的浮点数计算要快的多-有
时候你在执⾏⼤量运算的时候速度也是⾮常重要的。
即便如此,你却不能完全忽略误差。数学家花了⼤量时间去研究各类算法,有些处理
误差会⽐其他⽅法更好。你也得注意下减法删除已经⼤数和⼩数的加分运算所带来的
影响。⽐如:
nums = [1.23e+18, 1, -1.23e+18]
sum(nums) # Notice how 1 disappears
0.0
上⾯的错误可以利⽤ math.fsum() 所提供的更精确计算能⼒来解决:
import math
math.fsum(nums)
1.0
然⽽,对于其他的算法,你应该仔细研究它并理解它的误差产⽣来源。
总的来说,decimal模块主要⽤在涉及到⾦融的领域。在这类程序中,哪怕是 点⼩⼩
的误差在计算过程中蔓延都是不允许的。因此,decimal模块为解决这类问题提供了⽅
法。当Python和数据库打交道的时候也通常会遇到Decimal对象,并且,通常也是在处
理⾦融数据的时候。
W3Cschool ( )最⼤的技术知识分享与学习 台
此篇内容来⾃于 ⽹站⽤户上传并发布。
文档评论(0)