Wątek przeniesiony 2018-10-28 13:27 z C/C++ przez furious programming.

Liczba Eulera i potęgi – problem z dokładnością wyników

2018-10-28 12:47
programista ktory zaczyna
0

Polecenie
Wyliczyć wartość e^z, gdzie z podaje użytkownik ale nie wolno mu korzystać z wartości stałej e. W tym celu ma skorzystać ze wzoru e^z= z^k / k!. Napisz program, który sprawdzi jaki błąd bezwzględny popełniany jest przez wzór w stosunku do bezpośredniego obliczenia dla danego z, gdy uwzględni się jedynie pierwsze 2, pierwsze 5 oraz pierwsze 10 elementów szeregu.

kod na razie jest surowy a zadanie jeszcze nie jest skończone. Mam problem z dokładnością wyników. Dla małych potęg wynik końcowy się zgadza ale gdy chce spr wyższe potęgi wynik różni się nawet dwukrotnie od tego prawidłowego. Na początku myślałem, że może za mała jest precyzja double ale to nie to. Nie mam pomysłu czemu tak jest. No chyba, że ten wzór działa tylko dla małych potęg a im dalej tym staje się mniej użyteczny.

#include<iostream>
#include<cstdlib> // biblotekawktora zawiera funkcje głowne
#include <stdio.h>
#include<math.h>

using namespace std;

int main()
{
    int potega;
    cout << "podaj potege"<<endl;
    cin >> potega;

    unsigned int silnia = 1;
     double  wartosc_e_potega = 1;

    for (int k = 1; k < 10; k++)
    {
        silnia *= k;
        wartosc_e_potega  +=  pow(potega, k) / silnia;
        cout << "dla szeregu: " << k +1 << " " << wartosc_e_potega << endl<<endl;
    }

    cout << "dla pwa: " << pow(2.718281828, potega);

    getchar();
    cin.sync();
    cin.get();
}
edytowany 1x, ostatnio: furious programming, 2018-10-28 14:26

Pozostało 580 znaków

2018-10-28 16:45
1

Co rozumiesz pod pojęciem potęga?
Bo kod wskazuje, że mylisz pojęcie.
Twój kod liczy szereg Taylora zawsze tylko przez sumę 10 elementów ciągu.
Naturą szeregu Taylora liczonego ze skończonej liczby elementów jest to, że jego dokładność spada im dalej od miejsca wyznaczenia (tutaj od zera).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2018-10-28 16:55
kq
0

Po prostu musisz zsumować więcej elementów ciągu aby się zbliżyć do wyniku, ot co. Kod wygląda poprawnie dla wpisanych danych.

Np. dla exp(50), jeśli spojrzysz na wykres zasponsorowany przez WolframAlpha, sumy cząstkowe zbliżają się do faktycznego wyniku dopiero w okolicach 80-tej.

I faktycznie, lekko zmodyfikowany Twój kod wylicza exp(50) bez najmniejszego problemu:

    double silnia = 1;
    double  wartosc_e_potega = 1;

    for (int k = 1; k < 100; k++)
    {
        silnia *= k;
        wartosc_e_potega  +=  pow(potega, k) / silnia;
        cout << "dla szeregu: " << k +1 << " " << wartosc_e_potega << endl<<endl;
    }

    cout << "dla pwa: " << exp(potega);

https://wandbox.org/permlink/UedCnjvuXp9s8gAy


edytowany 1x, ostatnio: kq, 2018-10-28 18:45
Zły link - enedil 2018-10-28 18:44
Oops. Dzięki. - kq 2018-10-28 18:45

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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