精確度 你想知道的C語言 3 8

2021-10-08 11:17:46 字數 1994 閱讀 1651

q: 只要涉及到浮點數,每本書基本都會說它不是精確的,我們該如何理解精確二字?

a: 精確永遠都是相對而言。當我們認為1、2、3...自然數是精確的,自然c語言中int/char都是精確的。如果我們認為1.33是精確的,那麼它就是精確的。那為什麼浮點數會被認為不是精確的呢?

以4位元組浮點數為例,符號位/指數字和有效位的位數都是固定的,當某個浮點數的有效位超出預設,那麼就不能精確表達了。

對於int來說,其實也不能說是精確的,當我們認為間隔1其實不是精確,那int 1和2至少乙個是不精確的!

q:浮點數1.0是精確的嗎?

a: 當然是精確的。先寫乙份可以dump 浮點數內部二進位制資料的程式:

/*

xi chen([email protected])

cxsjabcabc

*/#include #include #include void dump_bits(void *p, int bytes)

; int *bits;

char *pc;

int bits_len;

bits = bits_stack;

bits_len = 32;

if (bytes > 4)

pc = (char *)p;

for (i = bytes - 1; i >= 0; --i)

} for (i = 0; i < bits_len; ++i)

printf("\n");

if (bytes > 4)

free(bits);

}int main(int argc, char *ar**)

1.0:

0 0 1 1  1 1 1 1  1 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0  0 0 0 0

(msb --> lsb)

b'31           符號位: 正數為0.

b'[30:23]    指數字(127+真實的指數): 1.0e0 --> 最終為127,即0111 1111.

b'[22:0]      小數字:  預設省略左側的1, 1.******紅色部分為實際資料。如上,即為0.

可以看到,1.0是很精確的儲存的,因為小數字沒有近似,而是準確值。

q: 1.33是精確的嗎?

a:

0 0 1 1  1 1 1 1  1 0 1 0  1 0 1 0  0 0 1 1  1 1 0 1  0 1 1 1  0 0 0 1
按照1.0的分析,差別在小數字,如下小數點之後的數值。

1.0 1 0  1 0 1 0  0 0 1 1  1 1 0 1  0 1 1 1  0 0 0 1
我們編寫**計算上面的小數字計算得到多少。

/*

xi chen([email protected])

cxsjabcabc

*/#include #include int pow_int(int base, int n)

return ret;

}void cal_bits(char *s)

printf("%d/%d\n", sum, 2 << (len - 1));

}int main(int argc, char *ar**)

; scanf("%s", bits);

cal_bits(bits);

return 0;

}

輸入: 01010100011110101110001  (1.33的小數部分)

2768241/8388608 = 0.33000004291534424

可以看到,1.33的實際表示並不是精確的1.33.

環境: macos 10.14.5 (intel i5)

linux 3.16.83 (ubuntu)

溢位 你想知道的C語言 3 7

q 溢位的本質是什麼?a 江河漫漫,才華會溢,箱子會滿,人會吃飽。無止境增加一定會滿,事物的有限性,物質和慾望增長一定會撐不住。q n位元組無符號整形最大值再加1會變成什麼?a 思考1位元組的情形 unsigned char c uchar max printf d n unsigned char ...

整數的內部形態 你想知道的C語言 3 4

q 整數的內部形態有何意義?a 整數的二進位制形態對於理解計算機處理的位元資訊有重要意義,對於分析和擴充套件新型別以及解釋牛鬼蛇神 的資料操作有不可替代的支撐作用。q int i 100 i內部儲存的二進位制形式是什麼?a xi chen 511272827 qq.com cxsjabcabc in...

printf 返回值 你想知道的C語言 1 1

printf的返回值大部分情況下是沒有必要關注的,因為關注了也不會帶來好處,每次都關注的高成本也許會讓你放棄.然而,它的返回值卻值得研究.q printf 貓 返回值是多少?a printf ret.c include include include ifndef pd define pd str ...