首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在STM32单片机上用C计算三级函数

在STM32单片机上用C计算三级函数
EN

Stack Overflow用户
提问于 2022-04-12 10:44:53
回答 3查看 93关注 0票数 -1

我正在尝试实现以下函数,该函数由我的STM32计算

代码语言:javascript
复制
y=0.0006*x^3 - 0.054*x^2 + 2.9094*x - 2.3578

x在0到215范围内

为了避免使用pow或任何其他函数,我编写了以下代码

代码语言:javascript
复制
static double tmp = 0;
static unsigned short c_m;
static unsigned short c_m_3;
static unsigned short c_m_2;

c_m_3 = c_m*c_m*c_m;
c_m_2 = c_m*c_m;
tmp = (0.0006*c_m_3) - (0.054*c_m_2) + (2.9094*c_m) - 2.3578;
dati->sch_g = tmp;

由于某些原因,计算是完全错误的,因为,对于斯特恩,如果c_m = 1我应该有tmp = 0.4982而不是13

我是不是遗漏了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-04-12 13:28:48

正如Lundin在注释中所表示的,您的微控制器类型(ARM、Cortex、M0)没有提供浮点单元。因此,这意味着您不能依赖自然浮点数学,而是需要依赖像这一个这样的浮点软件库(注意:我没有进行评估,这是我偶然发现的第一个快速搜索!)

或者--而且可能更好地--您可能希望用普通整数进行计算;如果您另外将计算从模式a*x*x*x + b*x*x + c*x + d转换为((a*x + b)*x + c)*x + d,您甚至可以省去一些复杂的运算:

代码语言:javascript
复制
int32_t c_m = ...;
c_m = ((6 * c_m - 540) * c_m + 29094) * c_m - 23578;

注意:unsigned short太小,无法在STM32上保存结果,所以您至少需要切换到32位!此外,您需要一个有符号的值才能保存c_m == 0产生的负面结果。

当然,你现在的结果太大了,只有一万倍。由于用例不清楚,问题仍然悬而未决,您希望如何处理,可能是舍入它(c_m = (c_m + 5000) / 10000),或者通过其他方法来评估小数部分。

票数 1
EN

Stack Overflow用户

发布于 2022-04-12 11:01:33

short在所有STM32上是16位。因此,215 * 215 * 215值将不适合其中的值。c_m_3 = c_m*c_m*c_m;将结果截断为按模USHRT_MAX+1 (65536):

否则,如果新类型没有符号,则通过重复添加或减去比新类型中可以表示的最大值多一个值来转换值,直到该值位于新类型的范围内为止。

使用uint32_t代替。

票数 1
EN

Stack Overflow用户

发布于 2022-04-12 11:19:08

短的只有16位,它能容纳的最大值是65535。因此,如果你想要计算第三次幂超过40,它就会溢出。这意味着您必须使用更大的变量类型,如uint32_t。您还可以使用ifs检测溢出,以获得更好的编程实践。

另外,在嵌入式编程中,最好使用"uint8_t“和"uint16_t”,而不是“无符号字符”和“无符号短”,因为它们更能描述数据大小。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71841267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档