Sprawdzenie czy liczba float/double jest równa 0

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?

0

Tak jak każdą inną wartość:

fabs(b - a) < epsilon

Z racji, że twoje a == 0.0. To wystarczy samo:

fabs(b) < epsilon
0

Odczytuj w pętli prawie wszystkie bity (wszystkie prócz najbardziej znaczącego). Jeśli są równe zero, to liczba jest zerem.

2

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.

0

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

0

Jak napial @winefresh musisz przyjac epsilon czyli dokladnosc, np 1e-5. Pokaz kod to poprawimy aby dzialalo :)

2
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;
0

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"

0

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

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

Najprościej jak można to zapisać, bez żadnych fabsów:

// if(det == 0.0)

if (det >= -0.00001 && det <= 0.00001)
0

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");
0

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

http://ideone.com/Uyg0yH

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

http://ideone.com/7PKXSX

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