簡體   English   中英

C 語言:使用計算初始化浮點變量

[英]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 位帶有floatf后綴的數字。

//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; 將按如下方式處理:

  1. 首先評估賦值運算符5/9的右側。 這里的編譯器看到兩個整數值相互分開,因此它將結果保存到一個整數臨時變量中。 這將導致實際結果0.555556的小數部分被截斷為0
  2. 然后將結果分配給 CF2。

該怎么辦?

很多選擇; float CF2 = 5.0/9; float CF2 = (float)5/9; 甚至float CF2 = 5./9;

CF3相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM