C语言关于浮点转换运算的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言关于浮点转换运算的问题相关的知识,希望对你有一定的参考价值。

float f1=20.0;
int u=3 ;
float TestNum;
TestNum=(int)u;
arm_mult_f32(&f1, &TestNum, &f1, 1);
LCD_Num(site1,(int)f1,BLUE,0X07E0);
这样显示的是正常的,60.但是如果
arm_mult_f32(&f1,(int*)u, &f1, 1);时显示的是0.
请问下这是什么原因如何解决。
LCD_Num函数是显示函数,arm_mult_f32(&f1, &TestNum, &f1, 1);是两数相乘函数。结果:f1=f1*TestNum
问题问的有点问题哈。我修改一下
float f1=20.0;
int u=3 ;
float TestNum;
TestNum=(float)u;
arm_mult_f32(&f1, (float*)u, &f1, 1); 这样的结果是错的,是0,然而
arm_mult_f32(&f1, &TestNum, &f1, 1);这样的结构是对的,60.这样很坑爹,为了显示这玩意中间必须弄很多转换变量。所以像问下这个原因。

arm_mult_f32(&f1, &TestNum, &f1, 1);从这里知道函数arm_mult_f32的第二个参数应该是浮点数指针,可是arm_mult_f32(&f1,(int*)u, &f1, 1);却把第二个参数变为整型指针了,类型不配就要出错。另:TestNum=(int)u;这是什么意思?u本来就是int型,用不着用(int)强制;再说了,TestNum是float型,即便你把u强制成int型,赋给TestNum仍不匹配。要写成TestNum=(float)u;才符合逻辑——把int型u强制为float型赋给float型变量TestNum。追问

您在看下我修改后问题,刚才问的有点问题

参考技术A (int*)u 不对吧,u是个int,并不是指向TestNum的指针追问

您在看下我修改后问题,刚才问的有点问题

追答

(float*)u也没用,非指针,强制转也没有用的

除非你这样 int u = &TestNum;

然后传入 (float*)u 。 看来你对地址和指针还没有大彻大悟啊

追问

我之前试了arm_mult_f32(&f1, (float*)u, &f1, 1);这样也是不行的。我加您QQ了。您看下

追答

float f1=20.0;
float TestNum=3.0;
int u= &TestNum;
arm_mult_f32(&f1, u, &f1, 1);
这样结果就对了

本回答被提问者采纳
参考技术B (int*)u之后是0了。追问

您在看下我修改后问题,刚才问的有点问题

追答

整形转换为浮点指针类型当然不可以了。

你起码要这样:(float *) (&u). 你试试吧!

虽然c,c++是一种强语言,允许你进行强制类型转换,但是要符合隐式转换的规则。
你搜一下看看,那些类型之间转换是可以进行的吧!

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

【中文标题】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语言,自动类型转换怎么做?

单片机C语言中如何将浮点型变量转换成字符串输出

C语言基本数据类型的转换

c语言中将一个浮点型赋值给整型时,会不会四舍五入?