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ć