Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 19 kwi 2026, o 20:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 21 paź 2015, o 21:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Programiści moi drodzy, niedawno na forum był poruszony temat zaokrąglania wyniku przy dzieleniu liczb całkowitych, ale nie mogę znaleźć - był chyba w zupełnie innym nie związanym z tą kwestią temacie o ile pamiętam. Przeglądając zawartość bibliotek natknąłem się na jakieś round(), ale to chyba nie o to chodzi, bo tam coś kojarzę jakieś inne nazwy. Póki co rozwiązałem problem programowo, ale potrzeba mi te kilka bajtów odzyskać, a chodzi o zaokrąglenie w górę, bo zwykłe dzielenie liczb całkowitych, np. 19/10 da mi wynik 1, a chciałbym 2 (w końcu 1.9 bliżej do dwójki niż do jedynki), a poza tym mam potrzebę dociągania w górę nawet przy wyniku 1.1 aby otrzymać docelowo 2.
Przypomina sobie ktoś coś ? :) Z góry dzięki za podpowiedź.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2015, o 21:26 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Nie warto sięgać po round bo wejdziesz w liczby zmiennoprzecinkowe. Postępować możesz zgodnie z tym opisem:
http://mirekk36.blogspot.com/2013/01/rs ... trick.html
Skoro chcesz zaokrąglać zawsze w górę to dodaj 9 przed dzieleniem przez 10 i otrzymasz to co chcesz.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2015, o 21:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

Nie, nie, absolutnie w żadne floaty nie chcę wchodzić, po prostu jak wspominałem były jakieś gotowe funkcje na te zaokrąglenia. Poradnik z linka dawno temu widziałem, ale nie pamiętałem, o takim fajnym czarodziejskim wzorku:

wynik = ( a + b/2 ) / b

Idąc dalej tym tropem, aby uzyskać to co mi potrzeba powinienem go nieco zmodyfikować czyli:

wynik = ( a + b) / b

i zawsze powinno mi dociągać w górę :) Chyba dobrze kombinuję? ;)

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2015, o 21:50 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

SylwekK napisał(a):
Chyba dobrze kombinuję?

Nie do końca. Bo równie dobrze mógłbyś dodać 1:
wynik = ( a + b) / b = a/b + 1
(10 + 10) / 10 = 20 / 10 = 2 // za dużo
(11 + 10) / 10 = 21 / 10 = 2
(19 + 10) / 10 = 29 / 10 = 2
(20 + 10) / 10 = 30 / 10 = 3 // za dużo
Może tak:
wynik = ( a + b - 1) / b
(10 + 10 - 1) / 10 = 19 / 10 = 1
(11 + 10 - 1) / 10 = 20 / 10 = 2
(19 + 10 - 1) / 10 = 28 / 10 = 2
(20 + 10 - 1) / 10 = 29 / 10 = 2


Autor postu otrzymał pochwałę

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 paź 2015, o 00:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

No faktycznie, nie zwróciłem uwagi (niedosypianie robi swoje), że dodanie całego dzielnika można zastąpić jedynką w końcowym wyniku, a tą jedynkę dodaję aktualnie u siebie w programie po wyliczeniu reszty z dzielenia i stwierdzeniu, że jakaś reszta jest... byle różne od zera :) Tylko, że to zabiera stosunkowo dużo pamięci, a kończę (mam nadzieję) program gdzie trafiła się jego niespodziewana rozbudowa, w którym zostało mi jakieś 300-400 bajtów z 16kB i każdy bajt jest na wagę złota. Niestety nie ma mowy o zmianie procka na większy, bo seria zmontowanych płytek jest już gotowa.
Kurcze, na bank były funkcje, które realizowały moją zagwozdkę.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 paź 2015, o 07:57 
Offline
Nowy

Dołączył(a): 17 paź 2014
Posty: 23
Pomógł: 1

Może tak:

int a,b,c;
c = a/b;
if( a%b > b/2) c++;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 paź 2015, o 08:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2013
Posty: 1988
Lokalizacja: Lipsko
Pomógł: 125

@nkarol82, no właśnie takie rozwiązanie mam teraz tylko zamiast "b/2" jest "0", a chcę się tego modulo pozbyć.

_________________
http://www.sylwekkuna.com



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 6 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO