You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MSP430G2553平台C语言标准差函数计算错误求助

问题分析与解决:MSP430数组标准差计算异常

问题场景

使用Code Composer Studio v12开发基于MSP430G2553的C程序,实现数组平均值与标准差计算。发现std_dev函数中通过float gem = avg(input, sizeof input / sizeof input[0]);调用平均值函数时结果异常,但直接替换为实际平均值6.625后,函数运行正常。

问题根源

在C语言中,数组作为函数参数传递时会退化为指针。此时sizeof input获取的是指针的大小(MSP430为16位架构,指针占2字节),而非数组总字节数。对于float类型数组,sizeof input[0]为4字节,因此sizeof input / sizeof input[0]的计算结果为2/4=0,导致avg函数遍历0个元素,返回错误的平均值(0/0得到NaN),最终引发标准差计算错误。

解决方案

std_dev函数已经接收了数组长度参数n,直接将n传递给avg函数即可,无需重新计算数组长度:

#include <msp430.h> 
#include <math.h> // 用于sqrt和powf函数

float avg(float input[], int n) // 计算长度为n的数组的平均值
{
    int i = 0;
    float sum = 0;
    for (i = 0; i < n; i++)
    {
        sum = input[i] + sum;
    }
    return sum / n;
}

float std_dev(float input[], int n) // 计算标准差
{
    int i = 0;
    float sum = 0;
    // 直接使用传入的n作为数组长度,而非重新计算
    float gem = avg(input, n);
    for (i = 0; i < n; i++)
    {
        sum = sum + powf((input[i] - gem ), 2);
    }
    // 注意:此处原代码固定除以4,建议改为除以n(总体标准差)或n-1(样本标准差)
    return sqrt(sum / n);
}

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;   // 停止看门狗定时器
    float cijfers[] = { 3.2, 5.7, 8.5, 9.1 };

    float som;
    som = avg(cijfers, sizeof cijfers / sizeof cijfers[0]);

    float deviatie;
    deviatie = std_dev(cijfers, sizeof cijfers / sizeof cijfers[0]);

    return 0;
}

额外说明:原代码中标准差计算时固定除以4,建议根据需求改为除以n(总体标准差)或n-1(样本标准差),以保证计算结果的准确性。

内容的提问来源于stack exchange,提问作者Magare

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:12:56