强制类型转换与非强制类型转换后出现的问题

让我意识到这个问题是做了一道求标准差的题目,本来题目要求精度不高,答案却总是相差一些。和室友进行比较,发现大致思路一样,并不是很麻烦要用高精度算法求解的。
先上代码:

#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而已)


以上皆为个人观点,如有意见,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值