首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >stm32f4上的超小浮点值

stm32f4上的超小浮点值
EN

Stack Overflow用户
提问于 2015-03-05 23:35:39
回答 2查看 543关注 0票数 1

下面是stm32f4的简单代码

代码语言:javascript
复制
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“编译器:

代码语言:javascript
复制
PROCESSOR = -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16

那么,如何处理超小的浮点值呢?我需要它在stm32f4固件中实现Matlab生成的代码,以实现一些过滤功能。

EN

回答 2

Stack Overflow用户

发布于 2015-03-06 00:32:18

IEEE754 binary32浮点格式具有24位精度,相当于大约7个十进制数字(对应关系不是精确的,因为二进制不是十进制)。

这不足以区分1和1.00000002。紧接在1.0f之上的binary32值是exactly 1.00000011920928955078125。

您可以使用以下选项

  1. double类型用于变量sum,假设double映射到具有53位精度的IEEE754 binary64,或使用
  2. 通过使用更好的求和算法来提高精度。最著名的是Kahan's

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);} }

票数 2
EN

Stack Overflow用户

发布于 2015-03-06 16:25:32

另一种可能性是根据使用的系数优化滤波函数。

以下是手动优化示例的解决方案:

代码语言:javascript
复制
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
                            );
    }
}

一个缺点是,您必须手动执行此优化,而且它不是通用的,但它可以节省大量计算时间,因为浮点操作较少。

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

https://stackoverflow.com/questions/28881702

复制
相关文章

相似问题

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