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
相关产品推荐
相关产品推荐

