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 ...