下面是stm32f4的简单代码
void main(void)
{
float sum = 1.0;
uint32_t cnt = 0;
while(1)
{
for( cnt = 0; cnt < 1000; cnt++ )
sum += 2.0e-08;
printfUsart("%f\r\n",
sum
);
}
}变量sum的值没有变化。如果我在循环中总结这个值:sum += 2.0e-07;,它会递增。我使用带有这个编译和链接器标志的"gcc-arm-none-eabi-4_9-2014q4“编译器:
PROCESSOR = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16那么,如何处理超小的浮点值呢?我需要它在stm32f4固件中实现Matlab生成的代码,以实现一些过滤功能。
发布于 2015-03-06 00:32:18
IEEE754 binary32浮点格式具有24位精度,相当于大约7个十进制数字(对应关系不是精确的,因为二进制不是十进制)。
这不足以区分1和1.00000002。紧接在1.0f之上的binary32值是exactly 1.00000011920928955078125。
您可以使用以下选项
double类型用于变量sum,假设double映射到具有53位精度的IEEE754 binary64,或使用void main(void) { float sum = 1.0;uint32_t cnt = 0;float c= 0;while(1) { for( cnt = 0;cnt < 1000;cnt++ ){ float y= 2.0e-08f - c;float t=uint32_t+ y;c= (t - sum) - y;sum = t;} printfUsart("%f\r\n",sum);} }
发布于 2015-03-06 16:25:32
另一种可能性是根据使用的系数优化滤波函数。
以下是手动优化示例的解决方案:
void main(void)
{
float sum = 1.0;
uint32_t cnt = 0, temp = 0;
while(1)
{
for( cnt = 0; cnt < 1000; cnt++ )
temp += 2;
sum = sum + temp*e-08;
printfUsart("%f\r\n",
sum
);
}
}一个缺点是,您必须手动执行此优化,而且它不是通用的,但它可以节省大量计算时间,因为浮点操作较少。
https://stackoverflow.com/questions/28881702
复制相似问题