差之毫厘谬以千里----精度丢失引起的问题
生活随笔
收集整理的這篇文章主要介紹了
差之毫厘谬以千里----精度丢失引起的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? 場景是這樣的,開發中需要統計某個正整數A的平均值,數A是隨時間變化的。這本來是一個很簡單的問題,可以用一個值B來統計這個A的累積和,在用B除以統計次數就可以了。但是開始時不想另外搞一個值B。所以推了一個公式出來,設n為統計次數,f(n)為前n次的統計平均值,Xn為第n次統計時的A值,那么很容易就可以得到公式:f(n) = [(n-1)*f(n-1) + Xn]/n,這個看似沒有任何問題吧,開始我也以為是,但是使用過程中發現算出的平均值隨時間慢慢變的越來越小。時間長了之后發現這個不太對,想了想才明白了忽略了一個問題----精度丟失。
????? f(n) = [(n-1)*f(n-1) + Xn]/n從純數學角度看是沒有任何問題的,問題在于此時f(n)是整數,所以每次計算f(n)時,如果(n-1)*f(n-1) + Xn除以n除不盡的話,就會把小數部分給丟掉,而只取整數部分(不是四舍五入),這樣就會造成結果比實際值要小一點,在某一次計算時差別可能不大,但是當n很大的時候,每次丟掉的部分所產生的累積效應就不容忽視了,所以就出現了上面描述的計算出的平均值隨時間慢慢變小的情況。
????? 最后,我還是采用了最簡單的那個辦法,用B值計算累計和在除以次數。當然使用浮點數來計算f(n)也可以避免這個問題(浮點數超過精度范圍部分是四舍五入的)。
總結
以上是生活随笔為你收集整理的差之毫厘谬以千里----精度丢失引起的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win/lose by a hair 差
- 下一篇: 信息学竞赛 - 如何提高思维思维能力?