我在MIPS程序集中为以下表达式编写了 两个 代码文件:
R(n)=(i到n)SUM {(i + 2)/(i + 1 / i) - i /(i + 1 / i)}
一个代码将整个表达式R(n)计算为求和并给出结果。
第二个代码首先在循环中计算第一个项,即 (i + 2)/(i + 1/1) ,然后计算第二个术语,即另一个循环中的 i /(i + 1 / i) 。然后它简单地减去两个总和。
以下是针对 n 的不同值的两个程序的结果:
计划1:
N Result
-----------
10 5.07170725
100 7.41927338
1000 9.72636795
10000 12.02908134
100000 14.33149338
1000000 16.63462067
计划2:
N Result
---------
10 5.07170773
100 7.41923523
1000 9.72259521
10000 12.31250000
100000 8.61718750
1000000 6.50000000
程序1给出了更准确的结果(与R(n)的Wolfram Alpha结果相比)。为什么程序2在此处为 n 的大值提供奇数结果?我的问题与浮点精度有关。
注意:我使用的是单精度数字。
答案 0 :(得分:2)
假设你有un = an-bn而你想要sum(un)
lim an - > 1当n - >无穷大因此P项的总和倾向于P + cte_a,对于bn相同,总和倾向于P + cte_b
当你区分两者时,(P + cte_a) - (P + cte_b),你应该在数学上检索sum(un)。
但是浮点数不会发生这种情况,因为(P + cte_a)舍入到最近的浮点数。 P越大,浮点数越少(P + cte_a)-float(P)接近cte_a ......
为了说服自己,尝试评估这些操作:
10.0f+0.1f-10.0f
100.0f+0.1f-100.0f
...
1.0e7f+0.1f-1.0e7
lim un - >当n - >时,1 / n;无限,所以程序1做得更好......