计算机的错误计算(六十一)

摘要  解释计算机的错误计算(六十)中的错误计算原因。

       计算机的错误计算(六十)中的计算可以归纳为  \cos(x \,\,\% \,\,(2\times\pi))\,.  因此,我们只需要分析该算式。

例1.  已知 x=30^{65}\,.  分析如何计算 \cos(x \,\,\% \,\,(2\times\pi))\,.

       首先,一个数乘以一个2,一般不会产生多少误差。另外,对于自变量为 [0,2\pi) 内的数,我们假设函数 \cos(x) 能得出正确值(比如起码15位正确数字,否则一切无意义)。

       那么剩下的就只有 x 与 \pi以及取余运算。

       下面首先研究 x\,.

       类似于(五十二),利用错数进行讨论。由于 x=30^{65}\approx 0.1e97\,, \cos(30^{65})\approx 0.983\,,  (\cos(x))^{\prime}|_{30^{65}}=-\sin(30^{65})\approx -0.182\,.  因此,m_1=97\,, m_2=0\,, m=0\,.  这样,m+m_1-m_2=97\,.  因此,函数要获得正确有效数字,x必须取到 97位有效数字。什么意思?比如,若只取到 96位正确有效数字,最后1位不正确:改正确数字0为1,则函数值为

\cos(\underbrace{10301051460877537453973547267843000...000\textcolor{red}{1}}_{\textup{97 digits}})\\ =\cos(30^{65}+1)\\ \approx 0.378\,.

而保留 3位有效数字的正确值是 0.983 .  所以,30^{65} 的整数数字不能错 1位。若错了 1位,那么函数值就是错误结果。当然这时,后面也就不用分析了。

       事实上,Python 是将

 30^{65}\\= \overbrace{\underbrace{10301051460877537453973547267843}_{\textup{32 digits}}\underbrace{000...000}_{\textup{65 digits}}}^{\textup{97 digits}}  

变成了64位的浮点数。根本不仅仅是错了 1位,而是错了几十位。从下图可以得到验证:

上图显示,若将自变量这个大整数变为浮点数,那么输出与(六十)中没有显式变为浮点数时的输出完全相同。所以,说明 Python在做取余运算时,隐式地做了变换。

        我们可以从另外一个角度进行验证:

若只取 17位有效数字,那么取余后的值与(六十)中的余数完全相同。

       您认可我的分析吗?待续。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值