Сообщение от
Linn
Лишь бы выпендреж тут устроить. Шли бы на профессиональные форумы и там устраивали
Блин, ну если res+=*data++ - признак профессионализма и выпендрежа, то у меня просто слов нет...
Сообщение от
Newton
т.е. может быть
Просто, не понятно, как перестановка элементов может повлиять на ошибки округления?
1.0+1e-20 будет равен 1.
1.0+1e-20+1e-20+1e-20+1e-20+... будет равен 1 независимо от количества слагаемых.
1e-20+1e-20+1e-20+1e-20+...+1 даст более точный результат.
Сообщение от
Linn
И потери точности там, на мой взгляд не произойдет. Для того и 80-разрядный внутренний тип
пример кода (извините мой французский + Керниган-Ричи)
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double mean1(const double* data,size_t sz)
{
double res=0;
if(sz)
{
size_t i=sz;
while(i--)
res+=*data++;
res/=sz;
}
return res;
}
static int dcomp(const void* d1,const void* d2)
{
double a = *(const double*)d1;
double b = *(const double*)d2;
return (a>b)-(a<b);
}
double mean2(double* data,size_t sz)
{
qsort(data,sz,sizeof(*data),dcomp);
return mean1(data,sz);
}
double x[1000];
#define XMAX (sizeof(x)/sizeof(*x))
int main(void)
{
x[0]=1;
for(size_t i=1;i<XMAX;i++)
x[i]=1e-16;
double r1=mean1(x,XMAX);
double r2=mean2(x,XMAX);
printf("nososrt:\t%a\nsort:\t%a\ndiff:\t%g\n",r1,r2,fabs(r1-r2));
return 0;
}
результат предсказуем:
nososrt: 0x1.0624dd2f1a9fcp-10
sort: 0x1.0624dd2f1abc9p-10
diff: 9.99634e-17
ошибка есть причем всего на 1000 элементов.
Социальные закладки