在STM32微控制器上用C计算三级函数



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

y=0.0006*x^3 - 0.054*x^2 + 2.9094*x - 2.3578

x在0到215 范围内

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

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;

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

我是不是错过了什么?

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

或者——可能更可取的是——你可能想用纯整数进行计算;如果你额外地将计算从模式a*x*x*x + b*x*x + c*x + d转换为模式((a*x + b)*x + c)*x + d,你甚至可以省去一些多重应用:

int32_t c_m = ...;
c_m = ((6 * c_m - 540) * c_m + 29094) * c_m - 23578;

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

当然,你现在的结果会太大,超过10000倍。由于用例不清楚,您希望如何处理这个问题仍然悬而未决,可能是四舍五入(c_m = (c_m + 5000) / 10000(或通过其他方式评估小数部分。

short在所有STM32上为16位。因此,值CCD_ 11将不适合在1内。c_m_3 = c_m*c_m*c_m;根据模数USHRT_MAX+1(65536(截断结果:

否则,如果新类型是无符号的,则通过重复地将新类型中可以表示的最大值多加或减去一来转换该值,直到该值在新类型的范围内为止。

请改用uint32_t

short只有16位,它可以容纳的最大值是65535。因此,如果要计算三次方的数字超过40,它将溢出。这意味着您必须使用更大的变量类型,如uint32_t。您还可以使用if来检测溢出,以获得更好的编程实践。

另一方面,最好使用";uint8_t";以及";uint16_t";而不是";无符号字符";以及";无符号短";在嵌入式编程中,因为它们更能描述数据大小。

最新更新