让我意识到这个问题是做了一道求标准差的题目,本来题目要求精度不高,答案却总是相差一些。和室友进行比较,发现大致思路一样,并不是很麻烦要用高精度算法求解的。
先上代码:
#include <stdio.h>
#include <math.h>
int main (void)
{
int num,sum,i;
int a[100];
double pro,sum1;
sum = sum1 = 0; //定义并初始化变量
scanf ("%d",&num);
for (i=0; i<num; i++)
{
scanf ("%d",&a[i]);
sum = (double)sum + a[i]; //求和 14行
}
ave = (double)sum / num; //求平均数 16行
for (i=0; i<num; i++)
{
sum1 = sum1 + pow (pro - a[i],2); //求方差
}
printf ("%f\n",sqrt (sum1 / num)); //求标准差并输出
return 0;
}
上面的代码是可以输出正确答案的,一开始我不是用double来把sum给强制类型转换的,我是用1.0*sum来转换的。其实这两种方法的结果是一样。
现在有个问题:
因为第14行已经对sum进行强制类型转换,那么是不是第16行的类型转换可以省略了,反正ave已经定义为double型了
答案是:错误!
第14行对sum进行的强制类型转换只对右边的sum生效,后边得出的值为浮点型,但是把这个浮点型数值赋值给左边的整型sum,则后面的小数部分会丢失。所以第16行的double不能省!
但是这也是有巧合存在,因为第14行运算的输入的数都为整型,所以小数部分丢不丢失无所谓,更严谨一些应该把sum定义为浮点型。
(同样把整型数赋值给浮点型数,也只是在整型数后面补0而已)
以上皆为个人观点,如有意见,欢迎交流。