2015-08-20 2 views
0

Я вычисляю число значащих цифр, два числа имеют одинаковые значения. Однако функция, которую я написал, вернет большое значение, когда числа будут равны. В результате средний результат не является достаточно представительным, как я покажу ниже.Вычислить среднюю точность

Вот код:

#include <iostream> 
#include <cmath> 

double calc_error(double a,double x) { 
    return std::abs(x-a)/std::abs(a); 
} 

int significant(double err) { 
    int s = -1; 
    do { 
     ++s; 
    } while(err < pow(5, -s)); 
    return s; 
} 

int main(void) { 
    double sans[]={-250207683.634793,-1353198687.861288,2816966067.598196,-144344843844.616425, 323890119928.788757}; 
    double pans[]={-250207683.634692, -1353198687.861386, 2816966067.598891, -144344843844.617096, 323890119928.788757}; 
    double err[5]; 
    double avg_err = 0; 
    int avg_significant = 0; 
    std::cout<<"Serial Answer,Distributed Answer, Error, Significant digits"<<std::endl; 
    for (int it=0; it<5; it++) { 
    err[it]=calc_error(sans[it], pans[it]); 
    avg_err += err[it]; 
    avg_significant += significant(err[it]); 
    std::cout<<sans[it]<<","<<pans[it]<<","<<err[it]<<","<<significant(err[it])<<"\n"; 
    } 
    std::cout << "avg_error: " << avg_err/5 << ", avg_sign:" << avg_significant/5 << "\n"; 
} 

и проверьте вывод:

Serial Answer,Distributed Answer, Error, Significant digits 
-2.50208e+08,-2.50208e+08,4.03665e-13,18 
-1.3532e+09,-1.3532e+09,7.24136e-14,19 
2.81697e+09,2.81697e+09,2.46631e-13,19 
-1.44345e+11,-1.44345e+11,4.65127e-15,21 
3.2389e+11,3.2389e+11,0,463 
avg_error: 1.45472e-13, avg_sign:108 

В моем реальном приложении, у меня есть много номеров, таким образом, я должен предоставить что-то представитель. Как бы вы это сделали? Идея, которая возникла при написании этого сообщения, состоит в том, чтобы подсчитать, сколько случаев (например, пара чисел) имеет 18 (например) значимых цифр, сколько 17 и т. Д., Но я боюсь, что распространение может быть очень большим.

+0

Не может претендовать на полное понимание того, что вы делаете, но «<< значимый <<' ближе к концу вашего фрагмента кода, кажется, не имеет смысла. Должно ли это сказать «существенное (err [it])»? – Flynn1179

+0

@ Flynn1179 исправлено, спасибо! – gsamaras

+0

NP .. это изменяет ваш выход? Как бы то ни было, я уверен, что он не всегда должен говорить «1». – Flynn1179

ответ

1

два варианта, в зависимости от того, как вы хотите обрабатывать одинаковые значения, либо в значительной степени включает обработку значимы (0) как частный случай, и возвращение 0.

Тогда это до вас или нет включать вас эти 0 в среднем или нет; если вы этого не сделаете, просто разделите на номер, где значительная функция не равна 0, а не 5.

Смежные вопросы