obliczanie z szeregu

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


}


}

 
0

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

3

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)
}

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