C 语言:使用计算初始化浮点变量

Posted

技术标签:

【中文标题】C 语言:使用计算初始化浮点变量【英文标题】:C Language: Initializing float variable with a calculation 【发布时间】:2021-10-25 19:20:00 【问题描述】:

我没有用任何语言做过很多浮点数学编程,更不用说用 C 语言了。

我正在编写一个温度转换程序作为练习,并且有一个关于浮点数的问题。我有一个代码片段,如下所示。在这两种情况下,当 P_FahrenheitTemp 32.0 时,Temp1 和 Temp2 都是 0.0。但是,如果我在计算中使用 CF3 因子,则 LOC VERRKKKS !!! :-)

这对我来说似乎很直观,但是......这个编译器是依赖于还是初始化时需要一个强制转换运算符?顺便说一句,我在 IBM iSeries 平台上使用严格遵守 ASNI 和 ISO 标准的 C/C++ 编译器编写此代码。

提前感谢您提供任何信息!

马丁·库斯特

#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);
                                

【问题讨论】:

为什么在使用C的时候标记C++? 5/9 想想这个表达式的类型和值。 什么是“LOC VERRKKKS”? 什么是return(Temperature);?看不到Temperature 变量。 @paulsm4 更好:#define CF3 (5.0/9.0). 【参考方案1】:

让我们仔细看看。

  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 suffix。

//float CF1 = 0.555556;
float CF1 = 0.555555556f;

建议更换

float Conv2Celsius(float P_FahrenheitTemp) 
  float ConvAdj = 32.0f;
  float CF = 5.0f/9.0f; // or 0.555555556f

  //[°C] = ([°F] - 32) × 5/9
  return (P_FahrenheitTemp - ConvAdj) * CF; 
              

【讨论】:

我知道我遗漏了一些东西——我只是看不到什么。谢谢。【参考方案2】:

在 C 语言中,float CF2 = 5/9; 行将被处理如下:

    赋值运算符5/9 的右侧首先被求值。此处的编译器看到两个整数值相互分割,因此它将结果保存到整数临时变量中。这将导致将实际结果0.555556 的小数部分截断为0。 然后将结果分配给 CF2。

怎么办?

很多选择; float CF2 = 5.0/9;float CF2 = (float)5/9; 甚至 float CF2 = 5./9;

CF3相同

【讨论】:

以上是关于C 语言:使用计算初始化浮点变量的主要内容,如果未能解决你的问题,请参考以下文章

C语言如何定义二进制变量?

C语言 | 每日基础

C语言数组的初始化表示方法

float精度问题

《你必须知道的495个C语言问题》笔记

在C语言中,为啥定义变量的时候总是初始化为0呢?该怎么理解。