如何在程式設計中避免10進製實數計算誤差 例如 bing上簡單加法的計算錯誤。

時間 2021-05-30 00:24:48

1樓:楊智寧

首先回答題主的問題。產生這樣的誤差的原因在於,浮點數並不能表示所有的實數,對於那些不能表示的數,會選取乙個誤差最小的,浮點數系統能表示的數來代替它。這裡的問題出在二進位制和十進位制的轉換上,有些用十進位制能輕易寫出的數,在二進位制下就變成了無限小數,自然沒有相應的浮點數對應。

解決辦法:

1. 自己實現乙個浮點數系統,直接使用十進位制表示,避免了上述在有限精度下不能完成的進製轉換。

2. 記在浮點數系統下的表示為,那麼有

其中為字長,一般取24或53。這說明,在一般的使用中,這個誤差是相當小的。對於結果是有限小數的運算來說,這一誤差往往並不足以影響到有效的數字。

因此,可以估計一下結果的小數字數,並做四捨五入,就可以得到精確的結果了。

3. 對於那些精度超出現有浮點數系統的計算,哪怕沒有二進位制-十進位制的轉換,也是會有誤差的。這就要求你實現或使用一套足以精確表示運算中所有數字的系統。

然後扯點題外話,為什麼在實際應用中我們不會考慮這樣的問題呢?原因有:

1.誤差並不是只有計算才會帶來的。從實際問題提煉出數學模型時往往忽略了許多次要因素,因而即使數學模型能夠求出精確解,也與實際問題的真解不同,它們的差距就是模型誤差

另外,除了程式設定的數,很多計算用到的數都是經由測量得到,由於儀器的精密性、實驗手段的侷限性,就會有觀測誤差。因此,一味的追求計算過程的零誤差往往是沒有意義的(我們依然致力於將計算誤差減小到可接受範圍內)。

2. 在計算機中,我們能夠精確的表示整數。但遺憾的是,實數集對於整數來說,是乙個無限維的線性空間。

因此,哪怕計算機的容量足夠大,也不存在一種能表示一切實數的萬能計數系統。在這個意義下,浮點數系統是乙個相當好的折衷方案。

Unity遊戲程式設計中如何避免runtime動態alloc記憶體?

補充兩點,選擇預分配還有兩個重要原因 一 降低cachemisses,較多高頻分配和釋放的零碎記憶體,往往會導致大量cachemisses 二 transparent hugepage,連續記憶體可以有較利用這個特性,降低頁表級數。不過正如前面有人說的,現代記憶體管理不像以前那麼笨拙,例如glibc...

如何在策略回測中避免過度擬合 overfitting 以及保證測試引數的穩健性 robust ?

量化對沖策略 乙個比較實用的方法是改變在你樣本內進行優化過程中得到的引數,看你的策略表現如何。這也就引數敏感性,策略指針對引數的一階導數。如果非常敏感,那說明你過度擬合了。比如你目標是一定的sharpe比率,一般說來如果你的引數10 sharpe變化20 都有可能是過度擬合。 子楠 我的做法一般是把...

如何在溝通中避免 雞同鴨講 造成「雞同鴨講」的原因都有什麼

造成 雞同鴨講 的原因都有2點 第一 自己的原因,沒法準確的表達自己。第二 他人的原因,他人不理解我們說的話。在現實生活中,我們很多人卻不太會溝通,要不就是不知道如何正確的表達自己,因此引起別人的曲解,要不就是在溝通中不明白對方的意思,導致自己對他人的誤解。溝通是乙個雙向的過程,在溝通中怎樣準確無誤...