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

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();
}
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).

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

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