你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

cubeide中浮点函数返回值错误

[复制链接]
风雨逍遥 提问时间:2024-10-15 10:55 / 已解决

我在某个.c文件中定义了一个float函数,在函数内设置断点查看return运算结果是正确的,但我在另一个.c文件中引用这个函数给某个变量赋值时,变量的值就错误了。感觉像是cubeide的浮点运算设置问题,已经开启了cubeide的支持浮点运算和sprintf的选项。

这个是浮点函数的运行结果,我在函数内设置断点查看,计算运行是正确的 Name : value Details:4.37491322 Default:4.37491322 Decimal:1082916682 Hex:0x408bff4a Binary:1000000100010111111111101001010 Octal:010042777512 这个是引用函数赋值后得到的错误结果,通过引用函数赋值之后得到的变量直接飞了,引用函数后得到的结果是错误的 Name : mid_angle Details:1.08291674e+009 Default:1.08291674e+009 Decimal:1317083135 Hex:0x4e8117ff Binary:1001110100000010001011111111111 Octal:011640213777 我确保函数类型和赋值的类型一致,都是float,且代码在keil中编译运行没问题,在cubeide中未改动代码,但函数传递值时就错了,不知道咋解决 floatgetAngle11(void)

{

float angle_data,d_angle,value;



angle_data = I2C_getRawCount();



// tracking the number of rotations 

// in order to expand angle range form [0,2PI] to basically infinity

d_angle = angle_data - angle_data_prev;

// if overflow happened track it as full rotation

if(fabs(d_angle) > (0.8*cpr) ) full_rotation_offset += d_angle > 0 ? -_2PI : _2PI; 

// save the current angle value for the next steps

// in order to know if overflow happened

angle_data_prev = angle_data;

// return the full angle 

// (number of full rotations)*2PI + current sensor angle 

value=(full_rotation_offset + ( angle_data / (float)cpr) * _2PI);

return  value ;

} 引用时是这样的 volatilefloat mid_angle,end_angle; mid_angle=getAngle11(); 感觉是cubeide的浮点设置问题,我之前开启了支持浮点数编译和打印的设置,不知道还有啥浮点数问题

收藏 评论8 发布时间:2024-10-15 10:55

举报

8个回答
xmshao 最优答案 回答时间:昨天 12:10

基本可以肯定函数返回做为结果赋值同类型变量是没啥问题的。

之前用过类似操作,刚才也特意测试了下。

while (1)

{

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 /

if(Flag_ADC)

{

  Flag_ADC=0x00;



  Vrefint = CalculateVREF(AdcResult_vref);        

  Vbat = CalculateVBAT(AdcResult_vbat) ;

} }


float CalculateVREF(uint32_t vref)

{

return (float )( (vref/4095.)*3.3); }

float CalculateVBAT(uint32_t vbat)

{

return (float )( ((vbat)/4095.)*9.9); }


image.png

风雨逍遥 回答时间:昨天 10:58

使用的是stm32F103rct6

xmshao 回答时间:昨天 11:15

你是说将一个 float类型的函数返回值 赋值给另一个 flaot变量时,结果就不对了?

比方 float getAngel { float xyz, .... ,return xyz}, 本来在函数里运算完后xyz为23.456,

结果作为返回值 被赋给另一浮点变量时 却是另外一个数字,是这样吗?

风雨逍遥 回答时间:昨天 11:19

xmshao 发表于 2024-10-15 11:15
你是说将一个 float类型的函数返回值 赋值给另一个 flaot变量时,结果就不对了?</p>
<p>比方 float getAngel ...

[md]对对对,就是这个意思,同样的代码我在keil里运行没问题,但在cubeide里是这个结果,不知道是哪个设置的问题,我去问chat和claude,给的分析结果是我在float函数中得到的正确结果和传递给变量的错误结果,二者的十进制结果相似,可能是在float函数结算完后将结果变为了十进制表示然后赋值给变量是报错了?不知道咋解决,下面是我问claude的分析结果

  1. 正确结果分析:
    • 值: 4.37491322
    • 十六进制: 0x408bff4a
    • 二进制: 01000000100010111111111101001010
  2. 错误结果分析:
    • 值: 1.08291674e+009 (约等于 1082916740)
    • 十六进制: 0x4e8117ff
    • 二进制: 01001110100000010001011111111111

观察到的关键点:

  1. 正确结果的十六进制(0x408bff4a)与错误结果(0x4e8117ff)有一定相似性。
  2. 错误结果的值(1082916740)非常接近正确结果的十进制表示(1082916682)。

分析: 这个问题很可能是由于在函数返回值或赋值过程中发生了数据类型的误解或不正确的转换。具体来说:

  1. 浮点数误解为整数: 系统可能将浮点数的二进制表示误解为整数。IEEE 754浮点数标准中,4.37491322的二进制表示被错误地解读为整数1082916682(十六进制0x408bff4a)。
  2. 整数到浮点数的不正确转换: 然后,这个被误解的整数值(1082916682)又被转换回浮点数,结果得到了1.08291674e+009。
  3. 字节序问题: 另一种可能性是发生了字节序(endianness)问题。如果在不同的字节序系统间传递数据,没有正确处理,可能导致字节顺序颠倒,从而产生错误的数值。
xmshao 回答时间:昨天 12:07
不应该啊~!只是一个结果的返回传递就出错了。




我刚才使用STM32CubeIDE测试过,浮点数作为函数返回值没有任何问题。


会不会代码因为优化 或者堆栈设置方面的原因导致的差异?
风雨逍遥 回答时间:昨天 13:39

xmshao 发表于 2024-10-15 12:10
基本可以肯定函数返回做为结果赋值同类型变量是没啥问题的。</p>
<p>之前用过类似操作,刚才也特意测试了下。 ...

[md]我也很迷,就只是函数返回值出问题了。。。我拿cubemx重写下试试,设置都用的默认设置,不知道哪出问题了

风雨逍遥 回答时间:昨天 13:45

xmshao 发表于 2024-10-15 12:10
基本可以肯定函数返回做为结果赋值同类型变量是没啥问题的。</p>
<p>之前用过类似操作,刚才也特意测试了下。 ...

[md]image.png

image.png

image.png
风雨逍遥 回答时间:昨天 14:27

xmshao 发表于 2024-10-15 12:10
基本可以肯定函数返回做为结果赋值同类型变量是没啥问题的。</p>
<p>之前用过类似操作,刚才也特意测试了下。 ...

[md]没事了,新建了个工程重新配置了遍没问题了,感谢帮助

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版