• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Liczenie sinusa za pomocą szeregu Taylora

Object Storage Arubacloud
0 głosów
2,360 wizyt
pytanie zadane 17 maja 2016 w C i C++ przez niezalogowany

Na stronie http://www.algorytm.edu.pl/cwiczenia-iteracje.html ćwiczenie 5. Jest podane rozwiązanie do tego ćwiczenia, dosyć proste i przejrzyste, ale jednak chciałbym aby ktoś wskazał dlaczego napisany przeze mnie kod nie działa jak trzeba (wyświetla się pierwsza liczba podana przez użytkownika albo napis inf lub nan).

Byłbym bardzo wdzięczny za wytłumaczenie tego w przystępny sposób. Poniżej wrzucam kod 

#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
	/* Moj nie dzialajacy kod

	double x;
	long double suma = 0;
	int n,y;
	unsigned long long silnia[1000];
	int i,j=0; //liczniki petli
	
    silnia[0]=1;
	y=0; j=0;

    cout << "Podaj argument x funkcji sinus, a nastepnie ilosc wyrazow szeregu Taylora n\n";
	cin >> x >> n;

	for (i=1; i<=n; i=i+1)
		{
			suma = suma + (pow(x,2*y+1))/silnia[j] * pow(-1,y);
			// * pow(-1,y) zeby co drugi wyraz sumy byl ujemny
			y = y +1;
			for (j=1; j=(2*y)+1; j++)
                {
                silnia[j] = silnia[j-1]*j;
                }
            cout << suma;
		}

	cout << fixed << setprecision(4) << "sin(x) wynosi " << suma << endl;
	
	Moj nie dzialajacy kod*/
	
	//Ponizej poprawny kod
	double x, wynik;
	unsigned int n, jeden = 1;
	unsigned long long silnia = 1, spom = 1, potega;
 
	cout<<"Podaj argument funkcji sinus: ";
	cin>>x;
	
	potega = x;
	wynik = x;
 
	cout<<"Podaj liczbę wyrazów szeregu Taylora: ";
	cin>>n;
 
	for(int i=1;i<n;i++)
	{
		++jeden; //odpowiada za to, czy potęga (-1) jest parzysta czy nie
		potega = potega * x * x; //wyznaczanie potęgi
		silnia = silnia * (++spom) * (++spom); //wyznaczanie silnie
		wynik = wynik +(jeden%2==0?-1:1) *  (double)potega/(double)silnia;
	}
 
	cout<<"sin("<<x<<") = "<<fixed<<setprecision(6)<<wynik<<endl;

	system("pause");
    return 0;

 

1
komentarz 17 maja 2016 przez Ehlert Ekspert (212,670 p.)

Jeżeli chcesz zrobić coś dobrego dla własnych umiejętności programistycznych przeczytaj książkę Czyty kod.

1 odpowiedź

+1 głos
odpowiedź 17 maja 2016 przez Porcupine Nałogowiec (31,560 p.)
Uwielbiam te "wzorcówkowe" rozwiązania :) Zredukujmy wszystko najlepiej do jednej linijki + jeszcze jakiś ternariusz do tego i mamy super profesjonalny kod! A jakby się ktoś czepiał, że mało czytelny to dowalmy kilka komentarzy i będzie :D

A co do Twojego problemu - po tym co opisałeś i po tym jak to na pierwszy rzut oka wygląda problemem jest to, że silnia rośnie baaaardzooo szybko. 21! już przekracza maksymalną wartość unsigned long long int'a. Dlatego aby Twój kod działał poprawnie musisz zrobić podobny myk jak w tej "wzorcówce" czyli zamiast liczyć silnie w oddzielnej zmiennej musisz na bieżąco dzielić mianownik Twojego wyniku przez kolejne liczby tak jak.

 

Pozdrawiam,

Podobne pytania

0 głosów
1 odpowiedź 1,247 wizyt
pytanie zadane 15 listopada 2017 w C i C++ przez michalnt Użytkownik (520 p.)
0 głosów
1 odpowiedź 727 wizyt
0 głosów
0 odpowiedzi 176 wizyt

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...