4 回答

TA貢獻2037條經驗 獲得超6個贊
這不是一個完整的答案(mhlester已經涵蓋了很多我不會復制的好地方),但我想強調一個數字的表示取決于你工作的基礎。
考慮分數2/3
在良好的基礎10中,我們通常會將其寫成類似的東西
0.666 ...
0.666
0.667
當我們查看這些表示時,我們傾向于將它們中的每一個與分數2/3相關聯,即使只有第一個表示在數學上等于分數。第二和第三表示/近似的誤差大約為0.001,實際上比9.2和9.1999999999999993之間的誤差差。事實上,第二個表示甚至沒有正確舍入!然而,我們沒有將0.666作為數字2/3的近似值的問題,所以我們不應該在大多數程序中如何逼近9.2。(是的,在某些程序中它很重要。)
數字基數
所以這里的數字基礎是重要的。如果我們試圖在基數3中代表2/3,那么
(2/3)10 = 0.2 3
換句話說,通過切換基數,我們可以得到相同數字的精確有限表示!外賣是即使你可以將任何數字轉換為任何基數,所有有理數在某些基礎上都有精確的有限表示,但在其他基數中沒有。
為了把這一點推到家里,讓我們看看1/2。盡管這個完全簡單的數字在基數10和2中具有精確表示,但它可能會讓您感到驚訝,它需要在基數3中重復表示。
(1/2)10 = 0.5 10 = 0.1 2 = 0.1111 ... 3
為什么浮點數不準確?
因為它們經常是近似于在基數2中無法有限地表示的有理數(數字重復),并且通常它們近似于在任何基數中可能無法在有限多個數字中表示的實數(可能是無理數)數。

TA貢獻1911條經驗 獲得超7個贊
雖然所有其他答案都很好,但仍有一件事缺失:
這是不可能的代表無理數(如π, ,sqrt(2)
,log(3)
等)精確!
這就是他們被稱為非理性的原因。世界上沒有多少比特存儲就足以容納其中一個。只有符號算術才能保持其精度。
雖然如果你將數學需求限制在有理數,但只有精度問題變得易于管理。您需要存儲一對(可能非常大)整數a
并b
保存分數所代表的數字a/b
。所有算術都必須在分數上完成,就像在高中數學中一樣(例如a/b * c/d = ac/bd
)。
當然,你仍然會遇到同樣的麻煩時pi
,sqrt
,log
,sin
,等都有涉及。
TL; DR
對于硬件加速算術,只能表示有限數量的有理數。每個不可表示的數字都是近似的。無論系統如何,都不能表示某些數字(即無理數)。

TA貢獻1785條經驗 獲得超8個贊
有無數的實數(很多你不能枚舉它們),并且有無限多的有理數(有可能枚舉它們)。
浮點表示是有限的(就像計算機中的任何東西一樣),因此不可避免地會有很多很多數字無法表示。特別是,64位只允許您區分18,446,744,073,709,551,616個不同的值(與無窮大相比無差別)。按照標準慣例,9.2不是其中之一。對于某些整數m和e,可能具有m.2 ^ e形式的那些。
您可能會想出一個不同的計算系統,例如10,其中9.2將具有精確的表示。但其他數字,比如1/3,仍然無法代表。
另請注意,雙精度浮點數非常準確。它們可以表示任意數字,范圍很廣,最多可包含15個精確數字。對于日常生活計算,4或5位數就足夠了。你永遠不會真正需要那些15,除非你想要計算你一生中的每一毫秒。
添加回答
舉報