porownanie double

0
 
#include <iostream>

int main() {

   double a = 123.0;                                                            
   double b = 123;
   if (a != b) {
      std::cout << " roznice\n";
   }
   else {
      std::cout << "brak roznic\n";
   }
   return 0;
}

czy ten kod gwarantuje poprawne porownanie ?

2

Ten wyjątkowo zadziała wg oczekiwań. Natomiast operacje mogą zmienić wynik, co opisałem jakis czas temu w artykule: http://kaczus.ppa.pl/art/liczbyzmiennoprzecinkowe,19.html

0

Nie chce mi sie czytac calego artykulu, ktory napsiał @kaczus ale lepiej jest porownywac typy zmiennoprzecinkowe w nastepujacy sposob:

   if (fabs(a - b) <= 1e-5) {
      std::cout << "brak roznic\n";
   }
   else {
      std::cout << " roznice\n";
   }

Liczba 5 to przyjeta przeze mnie dokladnosc (0.00001) z jaka maja byc porownywane obie zmienne i moze byc zmieniona w zaleznosci od tego jakiej precyzji porownania potrzebujesz.

0

Tutaj jest cała dyskusja na ten temat:

http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison

wniosek: wiele zależy od kontekstu aplikacji, ale to Twoje zadziała.

0

dzieki za popmoc ;)

3

Chociaż podziękowałeś za pomoc, dodam jeszcze że:
Informację na temat wartości EPISOLON możesz wyciągnąć w C++ włączając <limits> z klasy numeric_limits i metody epsilon().
Informację na temat wartości EPISOLON dla C możesz wyciągnąć używając <float.h> i zdefiniowanych stałych DBL_EPSILON, FLT_EPSILON,...
Dobre opracowanie i klasyczną pozycję (oprócz kolegi @kaczus) masz tu: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
Tu masz standard IEE-754: ftp://ftp.openwatcom.org/pub/devel/docs/ieee-754.pdf
A tu masz historię jak się rodził "zmienny przecinek" (moim zdaniem ciekawe): https://www.cs.berkeley.edu/~wkahan/ieee754status/754story.html

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