Problem rzutowania long longa i double
Ostatnio zmodyfikowano 2018-11-12 17:22
| milmega Temat założony przez niniejszego użytkownika | Problem rzutowania long longa i double » 2018-11-12 14:53:10 Witam, nie rozumiem dlaczego warunek ifa nie jest spełniany skoro wyrażenie bez rzutowania daje -5. Gdy rzutuje je na long long zachodzi jakiś błąd rzutowania bo zwraca -4. long long x = - 5;long long y = 15;
 double a = 1.0 * 5 /- 3;
 double m = 1.0 *( 5 - a );
 
 cout << 1.0 *( y - m ) / a;
 cout <<( long long )( 1.0 *( y - m ) / a );
 
 if( x == 1.0 *( y - m ) / a ) cout << "dziala";
 
 
Jak rzutować by if został spełniony? | 
|  | 
| pekfos | » 2018-11-12 16:16:51 cout wypisuje ci wartość zaokrągloną do najbliższej liczby całkowitej. Konwersja na liczbę całkowitą zaokrągla w stronę zera. Dostajesz -4 i -5, bo liczba nie jest równa ani -4, ani -5. | 
|  | 
| milmega Temat założony przez niniejszego użytkownika | » 2018-11-12 16:40:16 Czyli, żeby dostać -5 wystarczy zaokrąglić w górę? | 
|  | 
| pekfos | » 2018-11-12 17:22:18 Jak chcesz tylko 'dostać -5' to wystarczy jak po prostu napiszesz sobie -5 i wywalisz tamte obliczenia. Gdy wynik bierze się z jakichś obliczeń, przy testowaniu równości musisz uwzględniać błąd zaokrągleń. W większości przypadków zwykłe == nie ma sensu dla liczb zmiennoprzecinkowych. #include <iostream>
 int main()
 {
 double x = 0;
 
 for( int i = 0; i < 10; ++i )
 x += 0.1;
 
 std::cout << "x    = " << x << '\n';
 std::cout << "x==1 = " <<( x == 1.0 ) << '\n';
 std::cout << "x-1  = " << x - 1 << '\n';
 }
x    = 1x==1 = 0
 x-1  = -1.11022e-016
 | 
|  | 
| « 1 » |