obliczanie z szeregu

Odpowiedz Nowy wątek
2014-12-14 12:58
0

Proszę o wytłumaczenie dlaczego przy wprowadzeniu przykładowych danych -2, 2, 20 program wykrzacza się na -1. Nie wiem dlaczego niejako pomijany jest mój warunek if(x==-1)..., tylko dla wartości x=-1 program próbuje policzyć wartość, z szeregu co skazane jest na niepowodzenie.

#include <stdio.h>
//LICZONY Z SZEREGÓW
void main()
{
 
double x;
double y;
int n;
double suma,suma1;
double a,b,c;
 
printf("Podaj konce przedzialow, z ktorego bedzie liczona funkcja: ");
scanf("%lf %lf", &a,&b);
 
printf("\nPodaj liczbe podprzedzialow: ");
scanf("%lf", &c);
c=(b-a)/c;
 
printf("\n     x     szer    f(x)");
for(x=a;b>x;x=x+c)
{
    if(x==-1) printf("\nc%8.3lf   nie ma   nie ma",x);
    if(x==1) printf("\nc%8.3lf   0.500   0.500",x);
    if(x==0) printf("\nc    0.000   1.000   1.000");
 
if(x!=0 &&(x<-1||x>1) ){
y=1/x;
suma=1/x;
 
    for(n=1;n<100;n++)
    {
    y=-y*(1/x);
    suma = suma + y;
    }
 
suma1=1/(1+x);
 
    printf("\na%8.3lf%8.3lf%8.3lf", x, suma,suma1);}
 
if(x>-1&&x<1){
    y=1;
    suma=1;
 
    for(n=1;n<100;n++){
    y=-y*x;
    suma=suma+y;}
 
suma1=1/(1+x);
    printf("\nb%8.3lf%8.3lf%8.3lf", x, suma,suma1);}
 
}
 
}
 

Pozostało 580 znaków

2014-12-14 13:37
0

Nie należy porównywać liczb zmiennoprzecinkowych będących wynikiem operacji operatorami == czy !=.


edytowany 3x, ostatnio: Patryk27, 2014-12-14 13:37

Pozostało 580 znaków

2014-12-14 13:53
msm

Rozwijając powyższe:

#include <iostream>
using namespace std;
 
int main() {
    float a = 0.3;
    float b = 0.5;
    if (a + b == 0.8) {
        cout << "równe";
    } else {
        cout << "nierówne";
    }
    return 0;
}

W wyniku niedokładności taki kod daje nieoczekiwane wyniki. A jest tak dlatego, że 0.3 tak naprawdę nie jest reprezentowany dokładnie (nie da się zapisać równego 0.3 jako floata), tak samo 0.8.

Poprawne rozwiązanie to porównywanie z jakąś dokładnością, np.

double eps = 0.000001;
if (x - eps < 0 && x + eps > 0) {
    // x jest bardzo blisko zera;
}

Edit
Z takim porównywaniem jest związany jeszcze jeden, i to chyba dziwniejszy wtf:

#include <iostream>
int main() {
    float a = 0.3;
    std::cout << ((a == 0.3) ? "równe" : "nierówne");
    return 0; // tak, odpowiedź brzmi "nierówne" (chociaż to zależy od kompilatora ofc)
}
edytowany 2x, ostatnio: msm, 2014-12-14 13:56

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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