搜索
bottom↓
回复: 10

两个float数据相乘结果不对,需要加什么关键词转换?

[复制链接]

出0入27汤圆

发表于 2024-6-28 17:13:22 | 显示全部楼层 |阅读模式
数据类型:
  1. typedef enum
  2. {
  3.         QMA6100P_SENSITITY_2G = 244,
  4.         QMA6100P_SENSITITY_4G = 488,
  5.         QMA6100P_SENSITITY_8G = 977,
  6.         QMA6100P_SENSITITY_16G = 1950,
  7.         QMA6100P_SENSITITY_32G = 3910
  8. }qma6100p_sensitity;

  9. typedef struct {
  10.         int16_t temp;
  11.        
  12.         int16_t acc_x;
  13.         int16_t acc_y;
  14.         int16_t acc_z;
  15. }QMA6100PRawData_t;
复制代码


采集数据:
  1. void QMA6100PReadRawData(QMA6100PRawData_t *rawdata)
  2. {
  3.         int16_t  temp=0;

  4.         temp=(int16_t)(QMA6100P_Read(QMA6100P_REG_XOUTL)+(QMA6100P_Read(QMA6100P_REG_XOUTH)<<8));
  5.         rawdata->acc_x=temp>>2;
  6.    
  7.         temp=(int16_t)(QMA6100P_Read(QMA6100P_REG_YOUTL)+(QMA6100P_Read(QMA6100P_REG_YOUTH)<<8));
  8.         rawdata->acc_y=temp>>2;
  9.    
  10.         temp=(int16_t)(QMA6100P_Read(QMA6100P_REG_ZOUTL)+(QMA6100P_Read(QMA6100P_REG_ZOUTH)<<8));
  11.         rawdata->acc_z=temp>>2;
  12. }
复制代码


多个float 运算:
  1.     volatile QMA6100PRawData_t rawdata;
  2.     float x,y,z;
  3.    
  4.     QMA6100PReadRawData(&rawdata);

  5.     //x=(float)(rawdata.acc_x*QMA6100P_SENSITITY_8G)/1000.0;
  6.     //y=(float)(rawdata.acc_y*QMA6100P_SENSITITY_8G)/1000.0;
  7.     //z=(float)(rawdata.acc_z*QMA6100P_SENSITITY_8G)/1000.0;
  8.    
  9.     x=(float)(rawdata.acc_x)*0.977f;
  10.     y=(float)(rawdata.acc_y)*0.977f;
  11.     z=(float)(rawdata.acc_z)*0.977f;
  12.    
复制代码


把数据打印出来看 rawdata.acc_x、rawdata.acc_y、rawdata.acc_z采集回来数据都是对的。
注释掉的代码求出来的x、y、z结果都不对。

没注释的x、y、z运算结果是对的。

请教下注释掉的代码如何修改才能得到正确的x、y、z?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出140入158汤圆

发表于 2024-6-28 17:21:35 | 显示全部楼层
不先强制转换成float,两个int16相乘会溢出,所以结果错误。写成以下任意一种均可:
x=((float)rawdata.acc_x*QMA6100P_SENSITITY_8G)/1000.0f;
y=((float)rawdata.acc_y*QMA6100P_SENSITITY_8G)/1000.0f;
z=((float)rawdata.acc_z*QMA6100P_SENSITITY_8G)/1000.0f;

或:

x=(rawdata.acc_x*(float)QMA6100P_SENSITITY_8G)/1000.0f;
y=(rawdata.acc_y*(float)QMA6100P_SENSITITY_8G)/1000.0f;
z=(rawdata.acc_z*(float)QMA6100P_SENSITITY_8G)/1000.0f;

出0入0汤圆

发表于 2024-6-28 17:22:43 来自手机 | 显示全部楼层
x=((float)rawdata.acc_x*QMA6100P_SENSITITY_8G)/1000.0;

出30入42汤圆

发表于 2024-6-28 17:25:21 来自手机 | 显示全部楼层
看看是不是溢出了,先转换成double再计算试试

出15入70汤圆

发表于 2024-6-28 17:30:13 来自手机 | 显示全部楼层
16位运算出来的结果,不能放进32位的数据类型吧,不报warning吗

出0入27汤圆

 楼主| 发表于 2024-6-28 17:43:48 | 显示全部楼层
amigenius 发表于 2024-6-28 17:21
不先强制转换成float,两个int16相乘会溢出,所以结果错误。写成以下任意一种均可:
x=((float)rawdata.acc ...
(引用自2楼)

是不是arm系列芯片不用这样处理?

出20入186汤圆

发表于 2024-6-28 19:20:46 | 显示全部楼层
neutronlmk 发表于 2024-6-28 17:43
是不是arm系列芯片不用这样处理?
(引用自6楼)

与ARM无关,C语言都用的一个标准。

出0入27汤圆

 楼主| 发表于 2024-6-28 20:31:30 | 显示全部楼层
再来一段求加速度的运算:
  1. g=sqrt(x*x+y*y+z*z);
复制代码

也是没得到正确的g

出0入362汤圆

发表于 2024-6-29 20:29:51 | 显示全部楼层
溢出了? 8位或者16位平台? 前面的enum改成这样试试?

  1. #define QMA6100P_SENSITITY_2G  244UL
  2. #define QMA6100P_SENSITITY_4G  488UL
  3. #define QMA6100P_SENSITITY_8G  977UL
  4. #define QMA6100P_SENSITITY_16G  1950UL
  5. #define QMA6100P_SENSITITY_32G  3910UL
复制代码

出0入27汤圆

 楼主| 发表于 2024-6-30 21:30:07 来自手机 | 显示全部楼层
tomzbj 发表于 2024-6-29 20:29
溢出了? 8位或者16位平台? 前面的enum改成这样试试?
(引用自9楼)

是用了8位平台,感谢。
想起了ul这关键词

出0入362汤圆

发表于 2024-7-1 08:55:21 | 显示全部楼层
neutronlmk 发表于 2024-6-30 21:30
是用了8位平台,感谢。
想起了ul这关键词
(引用自10楼)


又查了一下, 没准编译器支持这样操作, enum里增加一个手工指定为超过int范围的数, 就都是long了.
你试试把enum改成这样:
typedef enum
{
        QMA6100P_SENSITITY_2G = 244,
        QMA6100P_SENSITITY_4G = 488,
        QMA6100P_SENSITITY_8G = 977,
        QMA6100P_SENSITITY_16G = 1950,
        QMA6100P_SENSITITY_32G = 3910,
        QMA6100P_SENSITITY_MAX = 0x40000ul
}qma6100p_sensitity;

然后sizeof一下看看, 是2还是4?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-22 20:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表