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: 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: 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: 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: 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! |
|
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ć. |
|
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ć... |
|
pekfos |
» 2014-07-19 17:37:22 0.839999974 to normalny wynik |
|
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 |
|
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ć. |
|
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 |
|
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ć. |
|
|
« 1 » 2 |