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

Dzielenie dwóch intów = zawsze zero?

Ostatnio zmodyfikowano 2014-07-19 20:01
Autor Wiadomość
OczkoSX
Temat założony przez niniejszego użytkownika
Dzielenie dwóch intów = zawsze zero?
» 2014-07-19 17:21:18
Hej!
Spotkałem się dzisiaj z nietypowym problemem. Chciałem stworzyć funkcję losującą liczbę która może być ujemna jak i niecałkowita. Napisałem coś takiego:
float losA =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz ) +(( rand() % po_przec ) / po_przec );
Wartości zmiennych:
C/C++
przedzial_pocz = - 1000;
przedzial_kon = 1000;
po_przec = 100;

Teoretycznie program powinien działać tak:
Wylosuj liczbę z zakresu od -1000 do 1000, a następnie wylosuj liczbę z zakresu 0-99, podziel ją przez 100 i dodaj do pierwszej liczby.

Niestety, wynik zawsze jest liczbą całkowitą. Podzieliłem to na dwie funkcje, właśnie na liczbę A i liczbę B:
C/C++
int A =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz );
float B =( rand() % po_przec ) / po_przec;

Co się okazało? Zmienna A miała jakąś wartość, np. -79, ale B było zerowe...
Podzieliłem to na trzy zmienne:
C/C++
int A =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz );
int B =( rand() % po_przec );
float C = B / po_przec;

Zmienna A miała wartość -79, B miało wartość 76, czyli C powinno mieć 0.76, ale niestety i tym razem się zawiodłem - C miało wartość ZERO.
Macie jakiś pomysł jak to rozwiązać?

Jeśli zrzutuję to w np. ten sposób:
C/C++
int A =( rand() %( przedzial_kon - przedzial_pocz + 1 ) + przedzial_pocz );
int B =( rand() % po_przec );
float C = B * 1.f / po_przec;
To jeśli B będzie równe 84, to dostaję na C wartość 0.839999974. Proszę, pomóżcie!
P-114051
pekfos
» 2014-07-19 17:29:36
Operacja na samych int daje wynik w int, a dlaczego w int nie uświadczysz ułamków, to powinieneś dobrze wiedzieć.
P-114054
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-07-19 17:32:01
No ok, wpadłem na to wcześniej więc dodałem to * 1.f. Niestety właśnie wychodzi taki dziwny wynik, nie chcę tego dodatkowo zaokrąglać...
P-114055
pekfos
» 2014-07-19 17:37:22
dziwny wynik
0.839999974 to normalny wynik
P-114058
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-07-19 17:41:21
To w jaki sposób mogę uzyskać 0.84 ? Nie wiem jakim cudem 84.0 / 100.0 daje 0.39999974 i to jest normalny wynik...


PS.Jeśli uzyskam liczbę 50, to wynik normalnie wychodzi 0.5
P-114060
pekfos
» 2014-07-19 17:48:44
To w jaki sposób mogę uzyskać 0.84 ?
No przecież masz.. Lepszego wyniku przy użyciu typów podstawowych nie uzyskasz i, na dobrą sprawę, nie powinno Ci to w żaden sposób przeszkadzać.
P-114061
OczkoSX
Temat założony przez niniejszego użytkownika
» 2014-07-19 17:51:02
Jak to mam jak nie mam? Chcę to póżniej wykorzystać. W zmiennej mam wartość 0.839999974 a chciałbym 0.84

Dobra, nie było tematu. Wartość 0.839999974 pokazuje tylko w debugerze Visuala, jeśli ją wypiszę na Cout to wszystko jest ok. Dzięki za pomoc, zamykam
P-114062
pekfos
» 2014-07-19 17:55:13
Lepszego wyniku przy użyciu typów podstawowych nie uzyskasz i, na dobrą sprawę, nie powinno Ci to w żaden sposób przeszkadzać.
P-114063
« 1 » 2
  Strona 1 z 2 Następna strona