“儘量避免使用浮點數”不是普遍規律。事實上浮點數的應用非常廣泛,不然 CPU 裡做那麼多浮點運算單元豈不是成了智障了。關鍵是你得知道自己用浮點數的時候究竟是在幹什麼。
浮點數實際上就是以更少的有效數字為代價換取更大的表示範圍,而且有效數字的位數與數值大小無關(先不考慮非規範數這種奇葩),因此數值越大,精度越差。與之相對的,定點數的精度固定,有效數字的位數與數值大小相關。
你要是需要讓不同數量級的數都有相同的表示精度,那就用定點數;你要是希望不同數量級的數都有相同位數的有效數字,那就用浮點數。
當然實際應用中也有其他情況,比如定點數和浮點數都能滿足精度要求,但是浮點數由於有硬體和程式語言支援,寫起來比較方便,那就用浮點數。
至於網上見得很多的 0.2 不能用浮點數表示之類的問題,根本原因反而不在浮點數,而在二進位制小數。二進位制小數不能用有限的數字表示 1/5,就如同十進位制小數不能用有限的數字表示 1/3 一樣。二進位制定點數也有同樣的問題,而十進位制浮點數就沒有這個問題。只不過因為常用的浮點數格式都是二進位制,導致大家覺得這是浮點數的鍋。
至於用分子和分母的形式表示的有理數,除非你有非常明確的應用場景,或者能夠控制分母和分子的大小,否則輕易不要用。不然你會發現一不小心分子和分母就溢位了,然後就要用高精度整數。或者寫到一半發現這裡要開個平方根或者求個三角函式,然後發現結果根本不是有理數了,進而開始懷疑人生。
“儘量避免使用浮點數”不是普遍規律。事實上浮點數的應用非常廣泛,不然 CPU 裡做那麼多浮點運算單元豈不是成了智障了。關鍵是你得知道自己用浮點數的時候究竟是在幹什麼。
浮點數實際上就是以更少的有效數字為代價換取更大的表示範圍,而且有效數字的位數與數值大小無關(先不考慮非規範數這種奇葩),因此數值越大,精度越差。與之相對的,定點數的精度固定,有效數字的位數與數值大小相關。
你要是需要讓不同數量級的數都有相同的表示精度,那就用定點數;你要是希望不同數量級的數都有相同位數的有效數字,那就用浮點數。
當然實際應用中也有其他情況,比如定點數和浮點數都能滿足精度要求,但是浮點數由於有硬體和程式語言支援,寫起來比較方便,那就用浮點數。
至於網上見得很多的 0.2 不能用浮點數表示之類的問題,根本原因反而不在浮點數,而在二進位制小數。二進位制小數不能用有限的數字表示 1/5,就如同十進位制小數不能用有限的數字表示 1/3 一樣。二進位制定點數也有同樣的問題,而十進位制浮點數就沒有這個問題。只不過因為常用的浮點數格式都是二進位制,導致大家覺得這是浮點數的鍋。
至於用分子和分母的形式表示的有理數,除非你有非常明確的應用場景,或者能夠控制分母和分子的大小,否則輕易不要用。不然你會發現一不小心分子和分母就溢位了,然後就要用高精度整數。或者寫到一半發現這裡要開個平方根或者求個三角函式,然後發現結果根本不是有理數了,進而開始懷疑人生。