C语言中标准差计算结果小数位为0的问题排查求助
问题分析与解决
核心问题
你的标准差小数部分被截断为0,本质是两个计算函数的返回类型错误:get_average和get_standard_deviation都声明返回int(整数类型),但实际计算的是带小数的浮点数。当函数返回时,C语言会自动将浮点数强制转换为整数,直接丢弃小数部分,最终导致平均值和标准差的小数部分全部丢失。
具体错误点
get_average函数:内部计算出的result是double类型,但函数返回int,返回时会截断小数。比如平均值是3.333,返回后会变成3,这直接导致后续标准差的计算基准出错。get_standard_deviation函数:就算内部算出了带小数的标准差(比如1.1547),但返回int会把结果截断为整数;如果计算结果小于1,就会直接变成0。
修正后的代码
#include <stdio.h> #include <math.h> #define SIZE 3 // 把返回类型改成double double get_average(int a[], int size); double get_standard_deviation(int a[], int size, double average); int main(void) { int list[SIZE]; int i; double average, standard_deviation; for (i = 0; i < SIZE; i++) { printf("input data:"); scanf("%d", &list[i]); } average = get_average(list, SIZE); standard_deviation = get_standard_deviation(list, SIZE, average); printf("average is %lf.\n", average); printf("standard deviation is %lf.\n", standard_deviation); return 0; }
// 返回类型改为double double get_average(int a[], int size) { int i; int sum = 0; double result; for (i = 0; i < size; i++) { sum += a[i]; } result = (double)sum / size; return result; }
// 返回类型改为double double get_standard_deviation(int a[], int size, double average) { double result; int i; double sum = 0; for (i = 0; i < size; i++) { sum += (a[i] - average) * (a[i] - average); } result = sqrt(sum / size); // sum已是double类型,无需额外强制转换 return result; }
额外优化说明
get_standard_deviation里的(double)sqrt(((double)sum / size))可以简化为sqrt(sum / size)——因为sum本身是double类型,除以size后结果仍为double,sqrt函数会直接处理double参数,多余的强制转换完全没必要。
内容的提问来源于stack exchange,提问作者Arin
相关产品推荐
相关产品推荐

