首先回答題主的問題。產生這樣的誤差的原因在於,浮點數並不能表示所有的實數,對於那些不能表示的數,會選取一個誤差最小的,浮點數系統能表示的數來代替它。這裡的問題出在二進位制和十進位制的轉換上,有些用十進位制能輕易寫出的數,在二進位制下就變成了無限小數,自然沒有相應的浮點數對應。解決辦法:1. 自己實現一個浮點數系統,直接使用十進位制表示,避免了上述在有限精度下不能完成的進位制轉換。2. 記在浮點數系統下的表示為,那麼有其中為字長,一般取24或53。這說明,在一般的使用中,這個誤差是相當小的。對於結果是有限小數的運算來說,這一誤差往往並不足以影響到有效的數位。因此,可以估計一下結果的小數位數,並做四捨五入,就可以得到精確的結果了。3. 對於那些精度超出現有浮點數系統的計算,哪怕沒有二進位制-十進位制的轉換,也是會有誤差的。這就要求你實現或使用一套足以精確表示運算中所有數字的系統。然後扯點題外話,為什麼在實際應用中我們不會考慮這樣的問題呢?原因有:1. 誤差並不是只有計算才會帶來的。從實際問題提煉出數學模型時往往忽略了許多次要因素,因而即使數學模型能夠求出精確解,也與實際問題的真解不同,它們的差距就是模型誤差。另外,除了程式設定的數,很多計算用到的數都是經由測量得到,由於儀器的精密性、實驗手段的侷限性,就會有觀測誤差。因此,一味的追求計算過程的零誤差往往是沒有意義的(我們依然致力於將計算誤差減小到可接受範圍內)。2. 在計算機中,我們能夠精確的表示整數。但遺憾的是,實數集對於整數來說,是一個無限維的線性空間。因此,哪怕計算機的容量足夠大,也不存在一種能表示一切實數的萬能計數系統。在這個意義下,浮點數系統是一個相當好的折衷方案。
首先回答題主的問題。產生這樣的誤差的原因在於,浮點數並不能表示所有的實數,對於那些不能表示的數,會選取一個誤差最小的,浮點數系統能表示的數來代替它。這裡的問題出在二進位制和十進位制的轉換上,有些用十進位制能輕易寫出的數,在二進位制下就變成了無限小數,自然沒有相應的浮點數對應。解決辦法:1. 自己實現一個浮點數系統,直接使用十進位制表示,避免了上述在有限精度下不能完成的進位制轉換。2. 記在浮點數系統下的表示為,那麼有其中為字長,一般取24或53。這說明,在一般的使用中,這個誤差是相當小的。對於結果是有限小數的運算來說,這一誤差往往並不足以影響到有效的數位。因此,可以估計一下結果的小數位數,並做四捨五入,就可以得到精確的結果了。3. 對於那些精度超出現有浮點數系統的計算,哪怕沒有二進位制-十進位制的轉換,也是會有誤差的。這就要求你實現或使用一套足以精確表示運算中所有數字的系統。然後扯點題外話,為什麼在實際應用中我們不會考慮這樣的問題呢?原因有:1. 誤差並不是只有計算才會帶來的。從實際問題提煉出數學模型時往往忽略了許多次要因素,因而即使數學模型能夠求出精確解,也與實際問題的真解不同,它們的差距就是模型誤差。另外,除了程式設定的數,很多計算用到的數都是經由測量得到,由於儀器的精密性、實驗手段的侷限性,就會有觀測誤差。因此,一味的追求計算過程的零誤差往往是沒有意義的(我們依然致力於將計算誤差減小到可接受範圍內)。2. 在計算機中,我們能夠精確的表示整數。但遺憾的是,實數集對於整數來說,是一個無限維的線性空間。因此,哪怕計算機的容量足夠大,也不存在一種能表示一切實數的萬能計數系統。在這個意義下,浮點數系統是一個相當好的折衷方案。