3.2执行精确的浮点数运算.pdfVIP

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档