[英]C Language: Initializing float variable with a calculation
我沒有用任何語言做過很多浮點數學編程,更不用說用 C 語言了。
我正在編寫一個溫度轉換程序作為練習,並且有一個關於浮點數的問題。 我有一個代碼片段,如下所示。 在這兩種情況下,當 P_FahrenheitTemp <> 32.0 時,Temp1 和 Temp2 都是 0.0。 但是,如果我在計算中使用 CF3 因子 LOC VERRKKKS !!! :-)
這對我來說似乎很直觀,但是......這個編譯器是依賴的還是初始化時必需的強制轉換運算符? 順便說一句,我正在使用嚴格遵守 ASNI 和 ISO 標准的 C/C++ 編譯器在 IBM iSeries 平台上編寫此代碼。
提前感謝您提供任何信息!
馬丁·庫斯特
#define CF3 5/9;
float Conv2Celsius(float P_FahrenheitTemp)
{
float Temp1, Temp2, Temp3;
float ConvAdj = 32.0;
float CF1 = 0.555556;
float CF2 = 5/9;
//[°C] = ([°F] - 32) × 5/9
Temp1 = (P_FahrenheitTemp - ConvAdj) * CF1;
Temp2 = (P_FahrenheitTemp - ConvAdj) * CF2;
Temp3 = (P_FahrenheitTemp - ConvAdj) * CF3;
return(Temperature);
}
讓我們仔細看看。
float CF1 = 0.555556;
Temp1 = (P_FahrenheitTemp - ConvAdj) * CF1;
// same as
Temp1 = (P_FahrenheitTemp - ConvAdj) * (float) 0.555556;
float CF2 = 5/9;
Temp2 = (P_FahrenheitTemp - ConvAdj) * CF2;
// same as
float CF2 = 0; // 5/9 is integer division
Temp2 = (P_FahrenheitTemp - ConvAdj) * 0;
#define CF3 5/9
Temp3 = (P_FahrenheitTemp - ConvAdj) * CF3;
// same as
Temp3 = (P_FahrenheitTemp - ConvAdj) * 5 / 9;
Temp3 = (P_FahrenheitTemp - ConvAdj) * 5.0f / 9;
// ^--- float multiplication -------^
// same as
Temp3 = (P_FahrenheitTemp - ConvAdj) * 5.0f / 9.0f;
// ^--- float divsion ----------------------^
Temp3
"VERRKKKS" 因為它沒有按5/9
縮放。 相反,它是代碼行中的文本替換,因此乘以 5,然后除以 9。
Temp3
是正確的,也是三者中最好的。
Temp1
幾乎是正確的,因為* (float) 0.555556
不如* 5.0f/9.0f
。
Temp2
是錯誤的,因為答案總是 0,即使它不應該是
我有一個代碼片段,如下所示。 在這兩種情況下,當 P_FahrenheitTemp <> 32.0 時,Temp1 和 Temp2 都是 0.0。
Temp1
不是 0.0。
要排除常量中的小附加錯誤,請使用至少 9 位帶有float
和f
后綴的數字。
//float CF1 = 0.555556;
float CF1 = 0.555555556f;
建議更換
float Conv2Celsius(float P_FahrenheitTemp) {
float ConvAdj = 32.0f;
float CF = 0.555555556f;
//[°C] = ([°F] - 32) × 5/9
return (P_FahrenheitTemp - ConvAdj) * CF;
}
在 C 語言中行float CF2 = 5/9;
將按如下方式處理:
5/9
的右側。 這里的編譯器看到兩個整數值相互分開,因此它將結果保存到一個整數臨時變量中。 這將導致實際結果0.555556
的小數部分被截斷為0
。該怎么辦?
很多選擇; float CF2 = 5.0/9;
或float CF2 = (float)5/9;
甚至float CF2 = 5./9;
與CF3
相同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.