计算机的错误计算(二十)

摘要  解释 计算机的错误计算(十九)中展示的 20^{65}-e^{65\times\ln(20)} \approx 6e70 \,  的错误计算原因。

       计算机的错误计算(十九)讨论了计算机的错误计算:20^{65}-e^{65\times\ln(20)} \approx 6e70 \,.

       下面介绍其出错原因。

       首先,若单独计算 20^{65},则 Python 采用的是高精度计算,其计算结果是准确的;在后面参与相减运算时,又会将其截断成 53 位的双精度数。因此,其值为:

20^{65}\\= 0.36893488147419103232e85 \\\approx 0.\textcolor{red}{368934881474191029401867593372}...e85.

其次,由于 \ln(20) 有 16位正确有效数字(四舍五入后),因此 65\times\ln(20) 也仅有 16位正确数字;再次,因为 65\times\ln(20)  有 3位整数,所以 e^{65\times\ln(20)} 只有 16-3=13 位正确有效数字(可参考计算机的错误计算(七))。于是,减数的计算过程如下:

e^{65\times\ln(20)} \\\approx\exp(65\times0.\underbrace{2995732273553990}_{\textup{Only}\,\,16\,\,\textup{digits}\,\,\textup{correct.}}85425347038835...e1) \\ \approx \exp(0.\underbrace{1947225977810093}_{\textup{Only}\,\,16\,\,\textup{digits}\,\,\textup{correct.}}97976959007792...e3)\\ \approx 0.\underbrace{\textcolor{blue}{3689348814741}}_{\textup{13 correct digits left.}}\textcolor{blue}{84904101984816747}...e85.

最后,被减数与减数均有 85位整数,其中前 13位相同,第 14位不同,这样就导致差大约有 85-13=72 位整数(实际是 71位)。相减过程如下:

0.\textcolor{red}{368934881474191029401867593372}...e85\\- 0.\underbrace{\textcolor{blue}{3689348814741}}_{\textup{13 correct digits left.}}\textcolor{blue}{84904101984816747}...e85\\= 0.\underbrace{00000000000000}_{\textup{14 zeros}}6125299882776625...e85\\\approx 6.125299882776625e70.

       上面过程完美地诠释了 Python 的错误计算过程。

       另外,由于上述计算包含了 5个运算,因此只要其中 3个软件在实现上存在微小的不一致性(例如,舍入误差不同),就有可能导致最终结果不完全一致。具体细节不再赘述。

       最后,总结一下:纵观整个过程,错误结果主要是由 exp(x) 函数计算错误所引起。

  • 29
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值