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

摘要  接计算机的错误计算(六十一),继续讨论(六十)中错误计算的原因。

       在(六十一),我们讨论了 x 的精度与取余运算的第1个参数的类型:64位的浮点数。本节探讨 \pi 的精度,也即讨论取余运算的第2个参数的类型。 

       若将 math.pi 代入 float 函数,则取余后的余数与(六十)中没有 float 时的余数相同:

这样,从一个方面说明,在执行取余运算时,Python math库中的 \pi 也是64位的浮点数。或者直接输出 math.pi 的值:

而这个值确实是 64位的浮点数:

\pi\\ \approx (\underbrace{11.001001000011111101101010100010001000010110100011000}_{\textup{53 bits}})_2\\ =\underbrace{3.141592653589793}_{\textup{Only 16 correct digits\,.}}115997963468544185161590576171875\,.

       那么现在有个问题:\pi 的精度够吗?在(六十一),我们知道,x 必须取到所有整数数字,才有可能得到正确结果。现在假设 x已经满足要求,那么 \pi满足要求吗?最小要求是多少呢?

       不妨先试试:

30^{65} \,\,\% \,\,(2\times \underbrace{3.141592653589793}_{\textup{Only 16 correct digits}\,.}115997963468544185161590576171875)\\ \approx2.40773344937999\,;

然而,

30^{65} \,\,\% \,\,(2\times \pi)\\ \approx0.1828899932013144\,.

两个余数的余弦分别为(其中后者为正确结果):

\cos(2.40773344937999)\approx-0.7425952735257133\,, \\ \cos(0.1828899932013144)\approx0.9833221907000413\,.

所以,(六十)中的 math,pi 的精度不够。这样,由于不论是 x=30^{65} 还是 \pi,  均为64位的浮点数,所以,(六十)中的输出只能是错上加错的结果。

       那么,\pi究竟取多少位呢?再取 50位试试:

\cos(30^{65} \,\,\% \,\,(2\times \underbrace{3.1415926535897932384626433832795028841971693993751}_{\textup{50 digits correct}\,.}))\\ \approx\cos(1.872450591275585)\\ \approx-0.2971001808027245\,.

因此,50位时也是错误结果。

       再问一句,\pi该取多少位呢?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值