Jak wiadomo, ze względu na precyzję (bądź jej brak) liczb float i double nie można porównywać liczb float/double za pomocą ==.
Jak jednak sprawdzić, czy zmienna float/double (wynik działania mat w moim programie) jest równy 0?
Jak wiadomo, ze względu na precyzję (bądź jej brak) liczb float i double nie można porównywać liczb float/double za pomocą ==.
Jak jednak sprawdzić, czy zmienna float/double (wynik działania mat w moim programie) jest równy 0?
Tak jak każdą inną wartość:
fabs(b - a) < epsilon
Z racji, że twoje a == 0.0
. To wystarczy samo:
fabs(b) < epsilon
Odczytuj w pętli prawie wszystkie bity (wszystkie prócz najbardziej znaczącego). Jeśli są równe zero, to liczba jest zerem.
nie można porównywać liczb float/double za pomocą ==.
Można, ale nie zawsze wynik jest taki, jakiego by się oczekiwało.
Jak jednak sprawdzić, czy zmienna float/double (wynik działania mat w moim programie) jest równy 0?
To zależy po co chcesz to sprawdzać.
Jeśli np. dla zabezpieczenia się przed dzieleniem przez zero, to wystarczy zwykłe if (x==0)
albo if (x!=0)
, bo tylko dokładna wartość zero nam przeszkadza.
Chodzi o to, że robię pewne obliczenia matematyczne )na floatach) i chcę sprawdzić, czy wynik == 0. Jak zrobię to operatorem == to pokazuje mi, że nie jest, chociaż podaję takie liczby, że licząc na kartce, wychodzi mi 0. (nie, nie ma błędu na ręcznych obliczeniach, sprawdzałem z 10 razy).
Jak napial @winefresh musisz przyjac epsilon czyli dokladnosc, np 1e-5. Pokaz kod to poprawimy aby dzialalo :)
if(sin(M_PI)==0) cout<<"OK - to sie nie pojawi"<<endl;
else cout<<"Wadzi dokladnosc"<<endl;
const Epsilon=1E-10;
if(fabs(sin(M_PI))<Epsilon) cout<<"OK"<<endl;
else cout<<"BLAD - to sie nie pojawi"<<endl;
Ok, to najmniejsza część kodu, którą mogę udostępnić:
#include <stdio.h>
void wyznacznik()
{
float x1=0, y1=3, x2=2, y2=4, x3=-200, y3=-97;
float det = (x1*y2*1.0) + (y1*1.0*x3) + (1.0*x2*y3);
if(det == 0.0)
printf("pkty wspoliniowe\n");
}
int main()
{
wyznacznik();
return 0;
}
która "nie działa"
musisz przyjąć dokładność(epsilon) dla której chcesz liczyć
jeżeli Twój oczekiwany wynik ma być 5.0001 to epsilon przyjmij 1e-4
i wowczas warunek powinien wygladac mniej wiecej tak:
double epsilon=1e-4;
if(abs(det)<epsilon){
printf("punkt wspolliniowe");
}
Nadal "nie działa":
#include <stdio.h>
#include <math.h>
// punkty ze strony: http://matematyka.pisz.pl/strona/2510.html --> sa WSPOLINIOWE
void wyznacznik()
{
const double epsilon=1e-4;
float x1=2, y1=1, x2=4, y2=5, x3=-3, y3=-9;
float det = (x1*y2*1.0) + (y1*1.0*x3) + (1.0*x2*y3);
if(fabs(det) < epsilon)
printf("pkty wspoliniowe\n");
}
int main()
{
wyznacznik();
return 0;
}
Najprościej jak można to zapisać, bez żadnych fabsów:
// if(det == 0.0)
if (det >= -0.00001 && det <= 0.00001)
Coś źle liczysz ten det.
http://ideone.com/PNeLCb
Przy okazji masz lepszy sposób na sprawdzenie "wspólinowości":
if(fabs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1))<1E-12) printf("pkty wspoliniowe\n");
Ale powinno wyjść, że są współliniowe ... matematycznie oczywiście.
Mój kod:
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool porownaj(double a, double b)
{
const double eps=0.0001;
return fabs(a-b) < eps;
}
// punkty ze strony: http://matematyka.pisz.pl/strona/2510.html --> sa WSPOLINIOWE
void wyznacznik()
{
const double epsilon=1e-9;
float x1=2, y1=1, x2=4, y2=5, x3=-3, y3=-9;
float det = (x1*y2*1.0) + (y1*1.0*x3) + (1.0*x2*y3);
if(porownaj(det, 0.0))
printf("pkty wspoliniowe\n");
}
int main()
{
wyznacznik();
return 0;
}
Poprawka: http://ideone.com/ABpFIJ
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool porownaj(double a, double b)
{
const double eps=1e-9;
return fabs(a-b) < eps;
}
// punkty ze strony: http://matematyka.pisz.pl/strona/2510.html --> sa WSPOLINIOWE
void wyznacznik()
{
float x1=2, y1=1, x2=4, y2=5, x3=-3, y3=-9;
float det = (x1*y2*1.0) + (y1*1.0*x3) + (1.0*x2*y3);
if(porownaj(fabs(det), 0.0))
printf("pkty wspoliniowe\n");
}
int main()
{
wyznacznik();
return 0;
}
Kolejna poprawka.
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
bool porownaj(double a, double b)
{
const double eps=1e-9;
return fabs(a-b) < eps;
}
// punkty ze strony: http://matematyka.pisz.pl/strona/2510.html --> sa WSPOLINIOWE
void wyznacznik()
{
float x1=2, y1=1, x2=4, y2=5, x3=-3, y3=-9;
float det = (x1*y2*1.0) + (y1*1.0*x3) + (1.0*x2*y3);
printf("WYSZEDL MI NIEPOPRAWNY DET=%f\nMUSZE SPRAWDZIC ROWNANIA BO SA DO BANI\n",det);
if(porownaj(fabs(det), 0.0))
printf("pkty wspoliniowe\n");
}
int main()
{
wyznacznik();
return 0;
}