Program sprawdzający czy trójkąt jest prostokątny

0

Chciałem sprawdzić, czy trójkąt jest prostokątny:

 float a,b,c;
    scanf("%f", &a);
    scanf("%f", &b);
    scanf("%f", &c);

    if ((a*a+b*b==c*c) && (a*a+c*c==b*b) && (c*c+b*b==a*a))
        printf("T\n");
    else
        printf("N\n");

jednak dla 3.0, 4.0, 5.0 wypisuje N :(

0

||

0

twój warunek zwraca prawdę tylko gdy a=b=c=0;

0

To jaki w takim razie jest warunek na trójkąt prostokątny?

    float a,b,c;
    scanf("%f", &a);
    scanf("%f", &b);
    scanf("%f", &c);

    if ((a*a+b*b==c*c))
        printf("T\n");
    else
        printf("N\n");

też wypisuje N

2
  1. użyłeś && zamiast ||
  2. tak się nie sprawdza równości liczb zmiennoprzecinkowych. Błędy zaokrągleń robią swoje. Przykładowo 5.0 = 1.2 * 22 a 0.2 nie da się zapisać dokładnie w systemie dwójkowym tak samo jak nie da się zapisać dokładnie 1/3 w systemie dziesiętnym. (to akurat był zły przykład 5.0 = 1.25 * 22 a 0.25 w zapisie binarnym to już nie problem)
0

Czyli mam rzutować na int i potem dopiero sprawdzać?

0

Jeśli a,b,c są zmiennoprzecinkowe, to sprawdzaj tak:

float epsilon = 0.00000001;
fabs(a*a+b*b-c*c)<epsilon

Wartość epsilon'a mozesz wziąć inną. To musi byc jakaś mała liczba większa od zera.

0

Epsilon dobiera się zależnie od dokładności danych i oszacowania błędu obliczeń. W twoim wypadku powinno to być co najmniej FLT_EPSILON*6, a najlepiej FLT_EPSILON*16 http://www.cplusplus.com/reference/cfloat/

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