远山繁星 2018-12-06 04:55
浏览 2621

R语言关于根号二的平方的误差问题

在Rstudio中,我发现一个数的平方根再平方,得出的结果和原数有误差,如

> sqrt(2)^2-2
[1] 4.440892e-16)^2-2



如果把这个当作计算机的小数点取舍,那么我运行第二段程序发现这个

> for(i in 1:10) print(sqrt(i)^2-i)
[1] 0
[1] 4.440892e-16
[1] -4.440892e-16
[1] 0
[1] 8.881784e-16
[1] -8.881784e-16
[1] 8.881784e-16
[1] 1.776357e-15
[1] 0
[1] 1.776357e-15

其中误差等于零的是完全平方数,然后剩下的数的误差有一样的,还有跳跃较大的,还甚至有负数的??搞不懂了。

然后还有这种

> for(i in 1:10) print(1+sqrt(i)^2-(i+1))
[1] 0
[1] 4.440892e-16
[1] -4.440892e-16
[1] 0
[1] 8.881784e-16
[1] -8.881784e-16
[1] 0
[1] 1.776357e-15
[1] 0
[1] 1.776357e-15


> for(i in 1:10) print(2+sqrt(i)^2-(i+2))
[1] 0
[1] 0
[1] 0
[1] 0
[1] 8.881784e-16
[1] -8.881784e-16
[1] 0
[1] 1.776357e-15
[1] 0
[1] 1.776357e-15

在根号i前后进行运算,对于这个2和(i+2),当我取8与(i+8)时,这十组运算的误差就都消失了


> for(i in 1:10) print(7+sqrt(i)^2-(i+7))
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 1.776357e-15
[1] 0
[1] 0


> for(i in 1:10) print(8+sqrt(i)^2-(i+8))
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0
[1] 0

最后发现,对于任意一个循环的次数,比如上面的10,都有一个小于它的数可以使这sqrt(i)^2-i的误差降到零,经过试验,循环1:50时,32+sqrt(i)^2-(i+32)就都是零了,同时每次换那个前后加减的数,都会使误差变动很大,求大佬讲解这个原理。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
    • ¥15 如何在scanpy上做差异基因和通路富集?
    • ¥20 关于#硬件工程#的问题,请各位专家解答!
    • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
    • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
    • ¥30 截图中的mathematics程序转换成matlab
    • ¥15 动力学代码报错,维度不匹配
    • ¥15 Power query添加列问题
    • ¥50 Kubernetes&Fission&Eleasticsearch
    • ¥15 報錯:Person is not mapped,如何解決?