Ta sama funkcja, te same argumenty, różne wyniki

0

Dlaczego funkcja blad_wzgledny wypisuje co innego w przypadku, gdy argumentem funkcji jest inna funkcja, i w przypadku gdy argumentem jest zmienna do której wcześniej przypisałem wartość tą samą funkcją?
Z printów których użyłem w funkcji blad_wzgledny i wynika, że zmiana 2 argumentu zmienia wartość pobieranego 1 argumentu . Nie rozumiem tego.

1 wersja (zła)

printf("sech_szereg = %lf\n",sech_szereg(x,dokladnosc));
printf("%29lf%%\n",   100 * blad_wzgledny(sech_szereg(x, dokladnosc), sech_wzor(x)));      //to oblicza źle
printf(" %lf%%\n",    100 * blad_wzgledny(sech_szereg(x, dokladnosc), 1. / cosh(x)));      //to oblicza dobrze

2 wersja (dobra)

double sw = sech_wzor(x);
printf("sech_szereg = %lf\n",sech_szereg(x,dokladnosc));
printf("%29lf%%\n",   100 * blad_wzgledny(sech_szereg(x, dokladnosc), sw));                //to oblicza dobrze
printf(" %lf%%\n",    100 * blad_wzgledny(sech_szereg(x, dokladnosc), 1. / cosh(x)));      //to oblicza dobrze

funkcja blad_wzgledny

double blad_wzgledny(double wart_mierzona, double wart_dokladna) {
    printf("wart_mierzona %lf\nwart_dokladna%lf \n",wart_mierzona, wart_dokladna);
    double blad = (wart_mierzona - wart_dokladna) / wart_dokladna;
    printf("blad %lf\n",100*blad);
    return (blad);
}

1 wersja (zła)
sech_szereg = 0.265803
wart_mierzona 0.154310
wart_dokladna 0.265802
blad -41.945624

2 wersja (dobra)
sech_szereg = 0.265803
wart_mierzona 0.265803
wart_dokladna 0.265802
blad 0.000232

0

Pokaż sech_szereg i sech_wzor

0
double sech_szereg(double x, int n) {
    double wynik;
    for (int i = 0; i < n; i++) {
        wynik += ((double) potega(x, 2 * i)) / ((double) silnia(2 * i));
    }
    wynik = 1 / wynik;
    return wynik;
double sech_wzor(double x) {
    return (2. / (potega(e, x) + potega(e, -x)));
}
2
double wynik;

Nie ustalasz wartości początkowej wynik, a więc masz UB. "losowe" zachowanie na to również wskazuje.

0

Rzeczywiście. Poprawiłem i działa. Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0