第二章 迴圈結構程式設計(二)

2021-08-15 16:37:34 字數 837 閱讀 9416

浮點數的陷阱

陷阱1

[cpp]view plain

copy

double i;  

for(i = 0; i != 10; i += 0.1)  

printf("%.1lf\n", i);  

程式會列印至10.0時結束迴圈嗎?不會。因為i永遠也不可能等於10,這是個無限迴圈

陷阱2

[cpp]view plain

copy

if(0.1+0.1+0.1 == 0.3)  

printf("equal\n");  

else

printf("not equal\n");  

會輸出"equal"嗎?不會。(√)實際浮點數運算時,0.1+0.1+0.1 != 0.3

產生上述陷阱的原因

實際上,計算機中的所有資料都用二進位制表示,包括浮點數。這就導致某些浮點數不能用二進位制精確表示,例如0.1(這很容易理解,就像10/3不能被十進位制精確表示一樣)

進一步地說,浮點數是採用分數+指數來表示的,例如

0.5 = 1/2

0.75 = 1/2 + 1/(2^2)

0.875 = 1/2 + 1/(2^2) + 1/(2^3)

0.1 = 1/(2^4) + 1/(2^5) + 1/(2^8) + ...

其中0.1只能無限迴圈下去,這就意味著0.1在計算機中不能被精確表示,因此產生上述兩個陷阱也就很容易理解

第二章 迴圈結構程式設計(二)

關於取末或前幾位數 取末6位 6個0,取最末 1個0.例如 121 1212 1000,23 123 100,3 23 10。的想法 你取幾位數,它從後到前數幾個數。模擬可得 的用法。三角 要計算只包含加法,減法和乘法的整數表示式除以正整數n的餘數,可以在每步計算之後對n取餘,結果不變。includ...

第二章 迴圈結構程式設計

1 for語句 for 初始化 條件 調整 執行時先完成賦值操作,判斷滿足條件後執行迴圈體,之後的每次執行都是先完成調整操作,判斷滿足條件後繼續執行迴圈體,不滿足條件就退出迴圈。1 include 3 include 4 using namespace std 56 intmain 712 程式無輸...

《程式設計珠璣》第二章 迴圈移位

問題 將乙個n維向量向左迴圈移位m位。如向量0,1,2,3,4,5,6,7,8,9向左迴圈移位3位,結果是3,4,5,6,7,8,9,0,1,2。方法1 每次迴圈移位1位,執行m次。輔助空間1,時間複雜度o n m 方法2 用m維的輔助空間暫存前m個元素,對剩下的n m個元素進行移位,最後將m個元素...