注意:計算式,能不寫成一大行的就分開寫,只要保證了精度就可以了。懸淮笮杏袝r候反而影響精度!
例如:unsigned long int X; double AD; AD=AD/50.0; X=AD*5000.0000/1023.00; 最好先局部計算一下,X=AD*100/1023.00;
1。浮點類型的不能做“!边\算。 例如:float a=1234.56; a=a%10; 這是錯誤的。只有整形才能做“模”int a=12345; a=a%10; 2.如果你想做普通的四則運算。那肯定是浮點數的運算。整形的除法是取商,不是我們平時的除法,它是舍去了余數,即小數部分。例如:int a=1; a=a/10; 結果會得到0;因為只有商被保留下來。正確的是: float a=1; a=a/10; 得到結果是:0.1 3。四則運算中常量之間做除法是特別注意:要加小數部分,不管它有沒有小數部分;例如:float a; a=12/36; 這是錯誤的,這是取商運算,不叫“除法”,只能得到0。正確的應該是:float a; a=12.0/36.0; 加上小數點就對了,得到結果 0.3 。a=90*1000.0/20.0;第一步運算有一個變量或常量是浮點型,這樣擴大了最大范圍,防止運算值溢出。C語言能自動想高一級轉換類型。平時我們應該養成浮點數加小數點的習慣。常量也分數據類型的。 “12”代表是非浮點型(整型int或字符型char)“12.0”則是浮點型(float) 4. 整形先乘法再除法,每步運算不能超過兩個因子中,最大的那個變量類型的最大范圍。 unsigned int a, b=90; a=b*1000/3000.0; 第一步乘法后溢出90000-65536=24464計算結果a=8;因為b*1000這里超過了a的最大范圍65536,取模后得到8。正確寫法:a=b*100/3000*10;這里可以得到a=30。因為受寄存器限制,最大2個字節65535。 但是浮點數乘法再除法。就不會超范圍; a=b*1000.0/3000;浮點數范圍大a結果是30. 6. 對于不同類型的變量做計算時,要考慮結果是否超過了最大范圍。這個最大范圍由兩個因子中最大的決定。 例如 unsigned int a,b=7; a=b+65535;得到的結果不會是65542,而是溢出部分6.因為它已經超出了a的最大值 65536; 又如 a=b-65535;也不會得到負數,而是8等效一下a=b+(-65535);即:a=b+1=8這里運算. a=b*65536;也超出計算式最大數據類型的范圍。因為是計算完之后才賦值為左邊的數據類型 可見:四則運算要注意三點。1。數據類型。2.。精度問題 。 3。計算式超過最大數據類型范圍的問題,計算完之后才會賦值為左邊的數據類型。 特別是變量與常量的四則運算加倍注意是否超范圍。
整數除法是整數運算中最慢的,所以應該盡可能避免。例如連除,這里除法可以由乘法代替。這個替換的副作用是有可能在算乘積時會溢出,所以只能在一定范圍的除法中使用。 不好的代碼: int i, j, k, m; m = i / j / k; 推薦的代碼: int i, j, k, m; m = i / (j * k);
|