MIPS组装中的浮点精度

时间:2014-03-17 10:20:30

标签: assembly floating-point mips floating-accuracy floating-point-precision

我在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 的大值提供奇数结果?我的问题与浮点精度有关。

注意:我使用的是单精度数字。

1 个答案:

答案 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做得更好......