Porównywanie liczb zmiennoprzecinkowych

0

Mam problem z programem, który ma obliczać wartość p z nieskończonego szeregu do określonej przez użytkownika liczby wyrazów i podawać, ile wyrazów szeregu należy obliczyć, aby pierwszy raz otrzymać 3.14. Pierwsza część jest chyba dobrze, ale z drugą mam problem. Co robię źle?

 
#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

int main()
{
int n;
cout<<"Podaj liczbe wyrazow szeregu n: ";
cin>>n;
double p=0.0;

while(n!=0)
{
    p+=(-4.0)/(pow(-1.0,(double)n)*((double)n*2.0-1.0));
    n--;
}
cout<<"Obliczona wartosc p wynosi: "<<p<<"."<<endl;

int n2=9999999;
double p2=0.0;
int licznik=0;

while(n2!=0)
{
    p2+=(-4.0)/(pow(-1.0,(double)n2)*((double)n2*2.0-1.0));
    n2--;
    licznik++;
    if(fabs(3.14-p2)<0.01) break;
}
cout<<"Po raz pierwszy otrzymujemy 3.14 po "<<n2-licznik<<" wyrazach szeregu."<<endl;

}

0

Byłoby łatwiej gdybyś opisał jaki masz problem...

Czy chcesz otrzymać koniecznie na pierwszych cyfrach 3.14 czy też różnica ma być mała - bo to dwie różne rzeczy.

0

zakładając, że "3,14" jest od 3,1350 włącznie do 3,14499999... wyłącznie, mamy banalny warunek

if (p2>=3.135 && p2 < 3.145)

jak chcesz to sobie przesuń do przedziału [3,140; 3,14999...) ale to moim zdaniem nieprawidłowy przedział.

0

Zmieniłem pętlę while i wyświetla się, że 3.14 (może być przybliżona wartość) otrzymujemy po -9999998 wyrazach szeregu.

 while(n2!=0)
{
    p2+=(-4.0)/(pow(-1.0,(double)n2)*((double)n2*2.0-1.0));
    licznik++;
    if (p2>=3.135 && p2 < 3.145) break;
    n2--;
}
0

Umieściłem w kodzie, to do czego podajesz link i dalej mi nie podaje tego poszukiwanego wyrazu szeregu.

     cout.setf(ios::fixed);
    cout<<setw(4)<<setprecision(2)<<p2<<setw(7)<<setprecision(3)<<p2<<setw(22)<<setprecision(18)<<p2<<endl;
0

W takim razie podaj cały kod, może nie tam lub nie to wstawiasz.

0
 #include <iostream>
#include <conio.h>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
int n;
cout<<"Podaj liczbe wyrazow szeregu n: ";
cin>>n;
double p=0.0;

while(n!=0)
{
    p+=(-4.0)/(pow(-1.0,(double)n)*((double)n*2.0-1.0));
    n--;
}
cout<<"Obliczona wartosc p wynosi: "<<p<<"."<<endl;

int n2=999999;
double p2=0.0;
int licznik=0;

while(n2!=0)
{
    p2+=(-4.0)/(pow(-1.0,(double)n2)*((double)n2*2.0-1.0));
    licznik++;
    if (p2>=3.135 && p2 < 3.145) break;
    n2--;
}
cout<<"Po raz pierwszy otrzymujemy 3.14 po "<<n2-licznik<<" wyrazach szeregu."<<endl;
    cout.setf(ios::fixed);
    cout<<setw(4)<<setprecision(2)<<p2<<setw(7)<<setprecision(3)<<p2<<setw(22)<<setprecision(18)<<p2<<endl;

}
0

robisz pętlę zaczynając od tyłu (od najmniejszych elementów ciągu), więc to zachowanie jest normalne.
Zrób tą pętle jak należy od n2=1 do poszukiwanej wartości.

0

Teraz się wyświetla, że po 0 wyrazach. :(

 #include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

int main()
{
int n;
cout<<"Podaj liczbe wyrazow szeregu n: ";
cin>>n;
double p=0.0;

while(n!=0)
{
    p+=(-4.0)/(pow(-1.0,(double)n)*((double)n*2.0-1.0));
    n--;
}
cout<<"Obliczona wartosc p wynosi: "<<p<<"."<<endl;

double p2=0.0;
int licznik=0;
double przedzial=((p2>=3.135)&&(p2<3.145));
for(int n2=1;przedzial;n2++)
{
    p2+=(-4.0)/(pow(-1.0,(double)n2)*((double)n2*2.0-1.0));
    licznik++;
}
cout<<"Po raz pierwszy otrzymujemy 3.14 po "<<licznik<<" wyrazach szeregu."<<endl;

}

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