C語言問題,兩數相加,為什麼精度會有小誤差

2022-02-09 05:15:30 字數 2087 閱讀 2488

1樓:聽不清啊

因為絕大多數十進位制小數用二進位制表示時,都是無限迴圈小數,而在計算機中只能儲存有限位,所以實數的儲存和處理都是有誤差的。

float只能保證7位有效數字,所以,當整數有2位時,最多只能有5位小數,更多位上的資料就是不準確的了。

2樓:瀚海闌干書屋

因為你採用的float變數

以下引自之前別人回答過的

這個你得知道浮點型資料的儲存格式;

我簡單給你說下,具體不懂你再問我;

11.2的小數部分0.2轉換為2進位制則是無限迴圈的00110011001100110011...

單精度在儲存的時候用23bit來存放這個尾數部分(前面9位元儲存指數和符號);同樣0.6也是無限迴圈的;

而列印格式為%f的時候,資料會以8位元組出棧!這個時候後32bit都是0,(正常來講原數是一直迴圈的)所以列印出的結果就這樣了;

而你定義成雙精度,它本身就是8位元組儲存,(相比單精度儲存,他後32bit是有資料的!)所以這個時候取出的8位元組,四捨五入直接就是0.6!

就好比你定義輸出%.1f一樣,也會列印出0.6,是一個道理!

不知你明白沒。單精度雙精度轉換的時候,一般小數末位不是5的話,都會丟失資料的!原理就像上面說的一樣。

引自 小城小閱

3樓:陽光的雷咩咩

float全部改成double呢?

簡單的c語言程式設計,兩數相加,為什麼還要輸入任意第三個值才會出現結果?

4樓:

printf("%d",c);中加入換行符printf("%d\n", c);

然後再加一句fflush(stdout);

可能是輸出緩衝區沒有重新整理

5樓:匿名使用者

**錯了?scanf("%d%d",&a,&b);你這語句就是隻接受兩個數。

6樓:

我執行過沒有你說的問題 。。

c語言程式設計菜鳥問題。要做個程式分別算出兩數相加的整數部分和小數部分,如圖,我寫的程式**出錯了?

7樓:自我程式設計

圖很模糊,大致看了沒問題。可以執行。

仿你**可執行的。

#include

int main()

8樓:匿名使用者

**有點模糊,可以直接貼上來再看。

9樓:

m=(int)x+(int)y;

n=x-(int)x+y-(int)y;

注意強制轉換的位置。

一個覺得很難的c語言問題。對兩個數字字串相加。

10樓:匿名使用者

參見之前的回答

思路是用3個棧a,b,c,把s1和s2各個字元分別壓到a、b棧,第三個棧c存結果。

分別把a、b的棧頂元素pop出來做運算,然後壓入c中。

最後c元素依次出棧就是結果。

11樓:夢裡尋你我他

其實就是把字串變成int 然後相加

12樓:匿名使用者

和無助,然而為了生傭工 活,我們雪又多少奪主

關於c語言的兩陣列相加問題

13樓:匿名使用者

#include

int main()

;int b[5],c[5];

puts("請輸入b陣列:");

int i;

for(i=0;i<5;i++)

scanf("%d",&b[i]);

for(i=0;i<5;i++)

c[i]=a[i]+b[i];

puts("c陣列:");

for(i=0;i<5;i++)

printf("%-4d",c[i]);

puts("");

return 0;}

c語言列印不出負數部分,c語言問題,為什麼會輸出負數

額 我手裡的c手冊是這樣說的 rand 語法 include int rand void 功能 函式返回一個在零到rand max之間的偽隨機整數。c語言問題,為什麼會輸出負數 在你的switch語句最後都加一個default 看一下switch d switch u 如果出現error這行,說明你...

C語言問題為什麼兩個程式相同的思路結果不一樣

兩段程式,在i的迴圈裡,只有i 1取到的值是一樣的。i 1時,資料已經不相同了。主要是正負標誌變數flag,導致的。建議你兩個程式都除錯一下,你就知道了。第一次迴圈 i 1的時候是一樣的.當i 2的時候就不一樣了.這時你的程式,sum sum d c flag flag是 1,世紀是 sum sum...

c語言for迴圈兩個for語句為什麼輸出是那樣的

可以的比如 int i 1 for i 1 i 5 i printf d n i 這時候輸出2,也就是i在 2的時候跳出 中斷 for迴圈謝謝採納 原陣列 bai15,45,77,98,78,95,32,26,15,46 執行du完第一次for迴圈後 zhi的dao陣列 15,45,77,98,95...