標題: 單片機keil-c51語言乘除法和取膜超范圍問題(部分不適用于C) [打印本頁]

作者: bibi    時間: 2015-4-19 01:50
標題: 單片機keil-c51語言乘除法和取膜超范圍問題(部分不適用于C)
注意:計算式,能不寫成一大行的就分開寫,只要保證了精度就可以了。懸淮笮杏袝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;  這是錯誤的。只有整形才能做“!眎nt a=12345;  a=a%10;
2.如果你想做普通的四則運算。那肯定是浮點數(shù)的運算。整形的除法叫取模,不是我們平時的除法,它是舍去了余數(shù),即小數(shù)部分。例如:int a=1;   a=a/10;   結(jié)果會得到0;因為只有商被保留下來。正確的是: float  a=1;   a=a/10;   得到結(jié)果是:0.1
3。四則運算中常量之間做除法是特別注意:要加小數(shù)部分,不管它有沒有小數(shù)部分;例如:float  a;   a=12/36; 這是錯誤的,這是取商運算,不叫“除法”,只能得到0。正確的應該是:float  a;   a=12.0/36.0;   加上小數(shù)點就對了,得到結(jié)果 0.3   。a=90*1000.0/20.0;第一步運算必須要有一個變量或常量是浮點型,后面的可以不用浮點數(shù)。C語言能自動想高一級轉(zhuǎn)換類型。平時我們應該養(yǎng)成浮點數(shù)加小數(shù)點的習慣。常量也分數(shù)據(jù)類型的。 “12”代表是非浮點型(整型int或字符型char)“12.0”則是浮點型(float)

4. 整形先乘法再除法,第一步乘法部分也不能超過左側(cè)最大范圍。 unsigned int a,char  b=90;   a=b*1000/3000.0; 計算結(jié)果a=8;因為b*1000這里超過了a的最大范圍65536,取模后得到8。正確寫法:a=b*100/3000*10;這里可以得到a=30。
但是浮點數(shù)乘法再除法。就不會超范圍; a=b*1000.0/3000;a結(jié)果是30.

6. 對于不同類型的變量做計算時,要考慮結(jié)果是否超過了左面被賦值變量類型的范圍。 例如 unsigned int  a,b=7;   a=b+65536;得到的結(jié)果不會是65543,因為它已經(jīng)超出了a的最大值 65536;  又如 a=b-65536;也不會得到負數(shù).  a=b*65536;也超出計算式最大數(shù)據(jù)類型的范圍。因為是計算完之后才賦值為左邊的數(shù)據(jù)類型
可見:四則運算要注意三點。1。數(shù)據(jù)類型。2.。精度問題 。 3。計算式超過最大數(shù)據(jù)類型范圍的問題,計算完之后才會賦值為左邊的數(shù)據(jù)類型。 特別是變量與常量的四則運算加倍注意是否超范圍。








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1