Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem rzutowania long longa i double

Ostatnio zmodyfikowano 2018-11-12 17:22
Autor Wiadomość
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.
C/C++
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; // zwraca -5
cout <<( long long )( 1.0 *( y - m ) / a ); //zwraca -4

if( x == 1.0 *( y - m ) / a ) cout << "dziala";

Jak rzutować by if został spełniony?
P-172842
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.
P-172843
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ę?
P-172844
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.
C/C++
#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    = 1
x==1 = 0
x-1  = -1.11022e-016
P-172845
« 1 »
  Strona 1 z 1