Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

[C++] Czemu wyrzuca 0

Moderatorzy: Jacek Bogusz, Moderatorzy

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

[C++] Czemu wyrzuca 0

Postautor: Darlington » 25 mar 2009, o 17:45

Czemu wyrzuca 0 dla x rożnych od 1 i -1 ?

Kod: Zaznacz cały

#include <iostream> using namespace std; int main() { int x; bool wynik; cout << "Podaj x: "; cin >> x; wynik = (x*(1/x)==1.0); cout << wynik << endl; }

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 25 mar 2009, o 18:25

Jaki będzie wynik tego (y):

Kod: Zaznacz cały

int x, y; y = 1/x;
dla x większego od 1?? (dla ujemnych odpowiednio się znak znosi).
Ostatnio zmieniony 25 mar 2009, o 18:28 przez pajaczek, łącznie zmieniany 1 raz.

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 25 mar 2009, o 18:27

Zero.

Kod: Zaznacz cały

#include <iostream> using namespace std; int main() { int x; bool wynik; cout << "Podaj x: "; cin >> x; wynik = (x*(1.0/x)==1.0); cout << wynik << endl; }
Teraz działa dobrze. Dlaczego?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 25 mar 2009, o 18:30

Ponieważ wystąpiło niejawne rzutowanie.

Wpierw dzieliłeś int/int, teraz float/int. Wynikiem będzie teraz?? (typ)

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 25 mar 2009, o 18:32

Wynikiem będzie wynik=true.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 25 mar 2009, o 18:38

Chodziło mi o to, jakiego typu będzie wynik dzielenia int/int, a jakiego typu wynik dzielenia float/int. Inaczej mówiąc kiedy i na jaki typ występuje rzutowanie (niejawne). Jakie to ma konsekwencje dla dalszego mnożenia (w Twoim przykładzie).

Awatar użytkownika
Darlington
-
-
Posty: 574
Rejestracja: 12 lis 2007, o 18:18
Lokalizacja: stąd!

Postautor: Darlington » 25 mar 2009, o 18:43

int/int -int
float/int - int

Konsekwencje w moim przykładzie - rzutowanie niejawne int na float daje pozytywny rezultat.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2653
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 25 mar 2009, o 18:54

No właśnie niezupełnie.... w wyniku dzielenia float/int wystąpi rzutowanie niejawne i daje wynik typu float

1/10 = 0 -> 10 * (1/10) = 10 * 0 = 0
1.0/10 = 0.1 -> 10 * (1.0 / 10) = 10 * 0.1 = 1.0


Inny sposób:
x * (float)(1/x) <- powinno również dać poprawny wynik, tyle że tutaj mamy rzutowanie jawne.


A tak żebyś jeszcze lepiej to zrozumiał (sprawdzimy), jaki będzie wynik takiego fragmentu

Kod: Zaznacz cały

float x = 20 * (1/10);
i dlaczego?

RcTomek
-
-
Posty: 357
Rejestracja: 18 lip 2005, o 17:28
Lokalizacja: Głogów / Wrocław

Postautor: RcTomek » 26 mar 2009, o 12:00

Można też zrobić tak:

Kod: Zaznacz cały

1./x
wystarczy dodać kropkę po 1.

W przypadku dwóchh zmiennych int i float:
(float)a/b

Wróć do „PLD/FPGA i inne zagadnienia techniki cyfrowej”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości