![](/img/trans.png)
[英]MIPS Assembly (MARS 4.5): floating point arithmetric answer is weird
[英]floating point accuracy in MIPS assembly
我在MIPS程序集中為以下表達式編寫了兩個代碼文件:
R(n)=(i至n)SUM {(i + 2)/(i + 1- 1 / i)-i /(i + 1 / i)}
一部代碼將整個表達式R(n)計算為總和並給出結果。
第二代碼首先在循環中計算第一項,即(i + 2)/(i + 1-1 / i) ,然后在另一個循環中計算第二項,即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給出的結果更准確(與Wolfram Alpha的R(n)結果相比)。 為什么程序2對於大的n值在這里給出奇數結果? 我的問題與此處的浮點精度有關。
注意:我使用的是單精度數字。
假設您有un = an-bn,並且想要求和(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越大,float(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-> 1 / n(當n->無窮大時),因此程序1的性能更好...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.