Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zaokruzivanje brojeva, funkcija u c-u, hitno

[es] :: C/C++ programiranje :: Zaokruzivanje brojeva, funkcija u c-u, hitno

[ Pregleda: 12560 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

fresh.bm

Član broj: 162156
Poruke: 182
*.broadband.blic.net.



+1 Profil

icon Zaokruzivanje brojeva, funkcija u c-u, hitno25.07.2009. u 13:33 - pre 179 meseci
Radim program koji vrsi matematicka izracunavanja ali sam naisao na problem.

Kada mi se u procesu racunanja javi broj npr. 22.5, 38.5, funkcija round() iz biblioteke math.h mi zaokruzuje te brojeve na 23, 39.
Meni treba funkcija koja ce vrsiti zaokruzivanje po principu da ako je parna cifra ne dirati broj,
ne odgovara mi funkcija floor, zato sto u slucaju neparnog broja round() dobro zaokruzuje,
kako da resim problem, nisam uspio naci ni jednu funkciju u c-u koja ce mi obaviti ovaj posao a rijec je o nekoliko hiljada izracunavanja koja moraju biti zaokruzena po tim pravilima. To mi pravi ogroman problem, jer klijent zahtjeva bas takav princip zaokruzivanja.
Molim za pomoc, hvala.
 
Odgovor na temu

kiklop74
Darko Miletić
Buenos Aires

Član broj: 78422
Poruke: 569
*.fibertel.com.ar.

Sajt: ar.linkedin.com/pub/darko..


+13 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno25.07.2009. u 18:48 - pre 179 meseci
http://www.elook.org/programming/c/floor.html
Tko leti vrijedi
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno26.07.2009. u 23:01 - pre 179 meseci
Neverovatno da ne mogu da nađem odgovarajuću funkciju nigde na Internetu! To zaokruživanje se zove "round to even", dat je opis algoritma na Vikipediji (u članku Rounding), ali nigde nema funkcija koja bi to efikasno implementirala u C++-u. Evo meta-koda iz glave (ovde pretpostavljam da je floor funkcija efikasnija od množenja za ispitivanje graničnog slučaja):

Code:

f = floor(x);

if (x - f == .5)
  return f + (f % 2 ? 1 : 0);
else
  return round(x);
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno27.07.2009. u 13:38 - pre 179 meseci
Evo i efikasnije varijante (isto iz glave, treba je testirati):

Code:

r = round(x);

return (r % 2 == 1 && r - x == 0.5) ? r - 1 : r;
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno27.07.2009. u 16:50 - pre 179 meseci
Ok, sad pregledah svoje "k u p u s a r e" i zaista nema jednostavnog resenja.
Algoritam koji ja imam se svodi na vase resenje sa floor ali u modifikovanoj varijatni posto ne bi trebalo porediti rezultat fp operacije sa ==. Npr 3.5-3 moze biti 0.5 ali moze biti i 0.500000001 ili slicno u zavisnosti od implementacije i tacnosti runtime-a, isto vazi i za sve ostale fp operacije, pa samim tim i za vrednosti koje se salju u round_half_even.
.NET je to resio kroz overload operator== koji vraca true ako je abs(x-y)<delta, za c/c++ mora da se povede racuna o nepreciznosti fp tipova. Ovu funkciju nisam pozvao godinama, pa proverite prvo dal radi...

Code:
double round_half_even(double x, const double delta) 
  {
    // symmetry, recurse on negative
    if (x < 0.0) return -round_half_even(-x, delta);

    // decompose 
    double i;
    double f = modf(x, &i);

    // are we "around .5"?
    if (abs(f-0.5) < delta) 
    {
        // is int even? if so we are there
        if (fmod(i, 2.0) < delta) return i;

        // if not, pump it up and round
        return round(i + 0.5);
    }

    // regular symmetric round
    return round(x);
}


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Mihajlo Cvetanović
Beograd

Moderator
Član broj: 37636
Poruke: 1249



+96 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno27.07.2009. u 17:50 - pre 179 meseci
Da, i meni je to ispitivanje jednakosti sa 0.5 bolo oči. Možda bi moglo da se koristi i ceil(x - 0.5) != floor(x + 0.5), odnosno round(x) != -round(-x) (pitanje je kako je implementirana round funkcija).
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno27.07.2009. u 20:45 - pre 179 meseci
ne mozes sa ceil i floor jer greska moze da prebaci u oba smera tj rezultat moze da bude 3.0000..001 ili 2.9999..999 sto daje dva razlicita ceil-a i floor-a . Ti fp brojevi su cudo
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

goran_7
Goran Maric
Nezaposlen
Doboj

Član broj: 158123
Poruke: 56
94.250.84.*



Profil

icon Re: Zaokruzivanje brojeva, funkcija u c-u, hitno02.08.2009. u 18:02 - pre 179 meseci
Izracunaj prvo izraz, pa onda iskoristi funkciju round('dobijena vrijednost'), meni je to pomoglo mozda ce i tebi.

Usput, moram postaviti pitanje u vezi zaokruzivanja float brojeva na odredjeni broj decimalnih mjesta.
Primjer, x = 2.34637382823 trebam zaokruziti na dvije decimale.
da li postoji standardna funkcija u C/C++-u? Ja je nisam nigdje nasao!
Moze li mi neko pomoci? Hvala.
Da ne dodje do zabune, ne trebam ispisivati brojeve sa dvije decimale, nego ih moram koristiti u racunanju, sto mi nakon nekoliko izracunavanja unese veliku gresku.
Hvala.
 
Odgovor na temu

[es] :: C/C++ programiranje :: Zaokruzivanje brojeva, funkcija u c-u, hitno

[ Pregleda: 12560 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.