外贸网站索引页多,it培训机构学费,网站开发前端要学什么,教师做班级网站摘要 阐述在使用 Python的 Decimal类时#xff0c;可能产生的错误计算。 在 详述 BigDecimal 的错误计算 中#xff0c;笔者较为详细地说明了 Java的 BigDecimal可能出错的原因。类似地#xff0c;Python的 decimal模块中有个 Decimal类#xff0c;也可用于高精度的十进制…摘要 阐述在使用 Python的 Decimal类时可能产生的错误计算。 在 详述 BigDecimal 的错误计算 中笔者较为详细地说明了 Java的 BigDecimal可能出错的原因。类似地Python的 decimal模块中有个 Decimal类也可用于高精度的十进制运算并且能够避免由于浮点数表示不精确带来的精度问题。但是相仿地由于有一些参数要设置所以亦会出现参数不同结果不一致现象。
例1. 不妨重新讨论 计算机的错误计算一百七十七中多项式稍作修改将小数部分去掉变成整数。
已知 计算 代码如下
from decimal import Decimal, getcontext
base Decimal(234) # 定义基数
terms [ # 计算每一项Decimal(134450) * base ** 12,Decimal(-31470000) * base ** 11,Decimal(2030000) * base ** 10,Decimal(1350000) * base ** 9,Decimal(1680000) * base ** 8,Decimal(1120000) * base ** 7,Decimal(748000) * base ** 6,Decimal(187000) * base ** 5,Decimal(46800) * base ** 4,Decimal(-140) * base ** 2,Decimal(7666044)]
print(sum(terms)) # 计算总和,输出结果
这时输出为 1381004 然而准确值是 204 . 因此代码输出的是错误结果。
例2. 用 Python的 Decimal编程计算 代码如下来源于一大模型
from decimal import Decimal, getcontextgetcontext().prec 50 # 设置精度这里设置为50位小数base Decimal(23.67) # 定义数值
exponent Decimal(65.5)part1 base ** exponent # 计算 23.67^65.5part2 (exponent * base.ln()).exp() # 计算 exp(65.5 * ln(23.67))result part1 - part2 # 计算差值print(result)
运行后输出为 -1E41显然是错误结果。正确值是0 另外getcontext().prec 不同那么输出也不同。
点评 1例1可以通过提高精度获得正确结果。 2例2不行。 3对于例1虽然可以通过提高精度获得正确值但是用户不确定究竟 getcontext().prec 设为多少。只能是通过实验进行猜测。正像有学者评价数学软件一样“The multiprecision ... in Mathematica and Maple is not very useful ..., because the working precision must be specified by the user and this naturally implies some guess work”[1]。 4getcontext().prec 的默认值是28 . 因此例1中所有运算的结果应该是保留28位十进制有效数字。 参考文献
[1] Cuyt A, Verdonk B, Becuwe S, et al. A remarkable example of catastrophic cancellation unraveled. Computing, 2001, 66: 309–320