| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 695 人关注过本帖
标题:不同精度相加的问题?我觉得我没错啊,可结果却错了
只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
已结贴  问题点数:5 回复次数:11 
不同精度相加的问题?我觉得我没错啊,可结果却错了
#include "stdio.h"
#include "math.h"
float average(int a[100],int n)
{
    float sum=0,pjs;
    int i;
    for(i=0;i<n;i++)
    {
        sum=sum+a[i];
    }
    pjs=sum/n;
    return pjs;   
}

float qfc(int a[100],int n,float pjs)
{
    int i;
    float  sum=0;
    float fc;        //这里定义sum也是单精度的,否则结果不对??
    for(i=0;i<n;i++)

        sum=sum+(a[i]-pjs)*(a[i]-pjs);
    fc=sum/n;
    return fc;
}

void main()
{
    int a[100];
    float pjs;    //平均数
    float bzc;    //标准差
    float fc;    //方差   
    int i=0,n;    //n个数

    printf("请输入数据个数:n\n");
    scanf("%d",&n);
    printf("请输入数据\n");
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);

    pjs=average(a,n);   
    printf("平均数为:%.2f\n",pjs);

    fc=qfc(a,n,pjs);                        //求方差
    printf("方差为:%.2f\n",fc);

    bzc=sqrt(fc);
    printf("标准差为:%.2f\n",bzc);        //求标准差   
}
看我注释的那段,就是这里"float fc;        //这里定义sum也是单精度的,否则结果不对??"
为什么这里必须定义sum为单精度的结果才正确,我输入1 2 3结果方差是零??整型和单精度相加不是先将整型转换为双精度的再相加的吗??
搜索更多相关主题的帖子: average include return 
2015-03-17 21:10
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:1 
回复 楼主 令狐少侠56
请输入数据个数:n
3
请输入数据
1 2 3
平均数为:2.00
方差为:0.67
标准差为:0.82

我给你运行了下,可以有float的结果。。。。
2015-03-17 23:41
code力力
Rank: 5Rank: 5
来 自:宜昌
等 级:职业侠客
威 望:2
帖 子:215
专家分:338
注 册:2015-1-12
收藏
得分:1 
你的函数类型是float型啊,当然要把返回值定义为相应类型

你醒了?快起来敲代码!!
2015-03-17 23:52
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 3楼 code力力
起初我也这么想的,int的变量,赋值表达式的右面是float的运算结果,float值赋给int的变量。。。。
但我打开编辑器做了个测试,却推翻了我的推断。
代码如下:
#include "stdio.h"
int main(void)
{
    int a = 0;
    float b = 10;
    a = a+b;
    printf("%d",a);
    return 0;
}
输出
10
编译,运行都妥妥的。。。。。。
我瞬间凌乱了。。。
2015-03-18 02:08
lu3664198
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:55
专家分:185
注 册:2014-11-16
收藏
得分:1 
sum如果是int....
sum+=int+float,右边是float,赋值给左边的int,小数点就去掉了

wwwwwww...~~;
本人为大一新生,说的不好不要拍我 ~ ( ̄~ ̄) ;
2015-03-18 07:36
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:1 
尽量避免不同精度同时计算

实在要一起计算时  也要强制转换成相同精度  比如 (double)int+double+(double)float

DO IT YOURSELF !
2015-03-18 08:55
lcy1990
Rank: 1
等 级:新手上路
帖 子:4
专家分:8
注 册:2015-3-17
收藏
得分:1 
回复 4楼 kin3z
应该是以左边的数据类型为准呗。。


[ 本帖最后由 lcy1990 于 2015-3-18 09:04 编辑 ]
2015-03-18 08:56
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 7楼 lcy1990
不清楚哦,书里的关于相关的说明是类型转换和赋值的类型转换.
有的说高类型赋值到低类型,需要强制类型转换...但我的代码说明不用就直接过了,而且sizeof(a)的结果是4。。。。
2015-03-18 09:46
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 6楼 wp231957
低精度与高精度类型运算,是自动提升的。。。所以不需人手去强制类型转换。
2015-03-18 09:51
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 5楼 lu3664198
对,你说的意思是结果为int的则把小数点后的数据去掉了,所以楼主的结果为0。
我赞成你说的,不过我手多去做了个验证代码,竟然不警告,更没抱错,直接编译过了,这让我纠结。。。
我用的是gcc
2015-03-18 09:59
快速回复:不同精度相加的问题?我觉得我没错啊,可结果却错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019859 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved