69,378
社区成员
发帖
与我相关
我的任务
分享
[quote=引用 7 楼 u010936098 的回复:] X是什么类型? 如果是定点数,既然不考虑溢出,那么很明显方法二更好,因为它只要N-1次加法和一次减法。而方法一需要N次减法、N次加法和N次除法,修改成下面的方法可以各减少一次,但还是远不如方法二。 修改的方法1: AVG = X1; [I=2..N] AVG += (Xi - AVG)/i; 如果是浮点数,则方法二的精度损失更小。
#include <stdlib.h>
#include <stdio.h>
int main()
{
static double data[1000000];
double sum, avg, check_value;
int i;
int n = sizeof(data)/sizeof(data[0]);
avg = 0;
for( i = 0; i < n; ++ i)
{
avg += ( data[i] - avg) / (i + 1);
}
check_value = 0;
for( i = 0; i < n; ++ i)
{
check_value = check_value + ( data[i] - avg );
}
printf("\navg += (x[i] - avb) / i:\tavg = %g\t check_value = %g", avg, check_value );
for( i = 0; i < n; ++ i )
{
data[i] = 1.3;
}
sum = 0;
for( i = 0; i < n; ++ i)
{
sum += data[i];
}
avg = sum / n;
check_value = 0;
for( i = 0; i < n; ++ i)
{
check_value = check_value + ( data[i] - avg );
}
printf("\n avg = sum / N: \tavg = %g\t check_value = %g", avg, check_value );
getchar();
}
将每个数据与avg相减的差累加,最终结果应该为0,但方法二的结果不是0,而是 -2.44718e-005。X是什么类型? 如果是定点数,既然不考虑溢出,那么很明显方法二更好,因为它只要N-1次加法和一次减法。而方法一需要N次减法、N次加法和N次除法,修改成下面的方法可以各减少一次,但还是远不如方法二。 修改的方法1: AVG = X1; [I=2..N] AVG += (Xi - AVG)/i; 如果是浮点数,则方法二的精度损失更小。
在百万级的数据运算时间是一致的. 而且我并不认为 如果排除了溢出, 方法一比方法二能好到哪去.. 也许我错了,坐等大神解答.
#include<stdio.h>
#include<time.h>
int main()
{
int i ;
double x ,sum = 0,avg = 0;
srand(time(NULL));
for(i = 0; i < 1000000 ; i++)
{
x = rand()%10+1;
sum += x;
}
avg = sum/i;
printf("%lf\n",avg);
printf("time use:%lf\n",(double)clock()/CLOCKS_PER_SEC);
}
还有这个
#include<stdio.h>
#include<time.h>
int main()
{
double sum = 0,avg = 0;
double x;
int i;
srand(time(NULL));
for(i = 0 ; i < 1000000; i++)
{
x = rand()%10+1;
avg += (x-avg)/(i+1);
}
printf("%lf\n",avg);
printf("time use:%lf\n",(double)clock()/CLOCKS_PER_SEC);
}
在百万级,不考虑是否溢出, 没看出第一个算法有好在哪里. 除了人在计算的时候,少计算点之外,计算机的特点就是计算.排除溢出,这两个算法差别真心不大.X是什么类型? 如果是定点数,既然不考虑溢出,那么很明显方法二更好,因为它只要N-1次加法和一次减法。而方法一需要N次减法、N次加法和N次除法,修改成下面的方法可以各减少一次,但还是远不如方法二。 修改的方法1: AVG = X1; [I=2..N] AVG += (Xi - AVG)/i; 如果是浮点数,则方法二的精度损失更小。