這是給學生的一個簡單的作業題目,但很多學生卡在公式的寫法,會產生誤差。
double c; // 攝氏溫度 double f; // 華氏溫度 cin >> c; f=9/5*c+32; cout << "攝氏 " << c << " 度 = 華氏 " << f << " 度";
上面的程式,若由鍵盤輸入 37 指派給變數 c ,則運算後,變數 f 的值為 69 ,而不是正確答案 98.6 。可是,若把計算 f 的計算式寫成如下:
f=c*9/5+32;
則可以得到正確的計算結果。為什麼呢?
上課時有教,若算術運算子的優先順序相同,則一律要由左而右運算。還有一個重點,兩個整數相除,求的是整數除法的商,不會有小數以下的部份。
所以,第一個算式 f=9/5*c+32=1*c+32=c+32 ;第二個算式 f=c*9/5+32 ,因為變數 c 為 double 型別,所以先做 c*9 時,就已經是 double 型別的運算結果了,再來 double 與整數 5 相除則會得到 double 的運算結果,所以答案是正確的。
其實第一種寫法有個變通的地方,將運算式改寫如下:
f=9.0/5*c+32;
強迫數值常數使用浮點數,計算結果自然就正確了。
何不強迫其做 casting 呢?例如
回覆刪除f = (double)c * 9 / 5 + 32;
如此一來 c 會被 cast 到 double,接下來的運算只要其中一項是 double 就會被 cast 到 double,也就不會有錯了 (?)
casting 好像對於 C 初學者是比較困難的? XD
hi chitsaou:
回覆刪除變數 c 原本就宣告為 double 了, f=c*9/5+32 本來就會有正確的運算結果。會出問題的是 f=9/5*c+32 哦!
啊 不好意思眼睛塗到蛤仔肉了 :p
回覆刪除大大你好
回覆刪除我很困擾
想請問我key的哪裡錯了
/* my_program.c */
#include
#include
int main(void)
{
float x,y;
/*攝氏c=x 華氏f=y*/
printf("輸入你想要的攝氏(c)溫度: x= ");
scanf("%d" ,&x);
y=(x+32)*9/5; /*華氏溫度 y=(9/5)*(x 攝氏溫度 +32)*/
printf("轉換的華氏(F)溫度y為: y= %4.2f\n",y);
system("pause");
return 0;
}