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.这样很坑爹,为了显示这玩意中间必须弄很多转换变量。所以像问下这个原因。
您在看下我修改后问题,刚才问的有点问题
参考技术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);
这样结果就对了
您在看下我修改后问题,刚才问的有点问题
追答整形转换为浮点指针类型当然不可以了。
你起码要这样:(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 位数字与 float
和 f
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语言关于浮点转换运算的问题的主要内容,如果未能解决你的问题,请参考以下文章