為什麼在C語言中計算結果會產生誤差?

高敏崇


計算結果產生誤差?我理解這句話就是計算結果和你想象的值不一樣。

這分成幾種情況:1. 整形計算 2. 浮點型計算

1.整形計算的時候,如果結果值和預期不一樣,那麼可以考慮是不是數值越界了。 如果計算出來的數值超過了其類型表達範圍,那麼值會被截斷後存儲在變量中。 比如char類型有效範圍是-128~127,如果計算算出來的值是128,將它賦予給char型變量,那麼它就變成了-128(因為128的十六進值為0x80,剛好和-128的補碼一致)

2.浮點數計算的時候,分為單精度(float)、雙精度(double),它們的小數位後有效位數不一樣,前者少,後者多。 另外浮點數據額比較不能像整形那樣用"=="判斷是否相等,而是採用">"和" -0.000000001 && v < 0.0000000001)到底要在小數點後用多少個0,是根據你對數據的精度要求而定。

所以那些你所認為的誤差,其實都是有原因的,再深入瞭解之後,你就不會覺得是C語言的誤差了。


碼中尋樂


這是算法設計上的問題。

一般而言,浮點運算會帶來誤差,不同的編譯器會有不同。

如果浮點運算的結果是5.00000000……就發現不了誤差;而算成了4.9999999999.……後,經(int)就變成了4。

如果寫成a/1000就不會有誤差存在。

也可以自己寫一個intpow()函數。

int intpow(int x,int n)


小毅帶你看科技


首先要說的是不光C語言,幾乎所有的編程語言的數值計算結果都可能產生誤差,特別是對於浮點數的運算。只不過側重於數值計算的,或提供了專門用於數值計算模塊的編程語言能提供更好的精度而已。為什麼會這樣呢?這是由於計算機用於執行運算的單元(一般為CPU)使用二進制數來表示數值,有相關知識的朋友都應該知道不是所有的十進制數都可由二進制數精確表示出來,例如0.1就沒有的二進制的精確表示形式。因此,當涉及到浮點數運算時,既使運算結果未溢出,其結果也可能已經是近似值了。


科技灣區


計算機 是用二進制表示的,一般數是用十進制表示的,這樣計算小數時,不可避免產生誤差,因為兩種不同進制的 小數 無法精確一一對應


枝枝葉葉


浮點數所有語言都有誤差,因為底層存儲的就有誤差,各語言有專門的數據類型精確處理浮點型


胖頭魚yyf


所有計算機語言,都用有限長度的存儲空間存儲數據,不同的計算機語言、或相同語言不同版本所定義的變量、存儲空間也不一定相同。這樣多次循環後,產生誤差是必然的。


素食的貓


算法不同的原因和他的數值 -------河南新華


慎談奧秘


告送我 哪個語言計算中沒有誤差


分享到:


相關文章: