Как только вы получите дробную часть числа, проблема в значительной степени решена. Один из способов получить дробную часть состоит в том, чтобы многократно вычитать степени числа 2 из вашего числа (при условии, что оно было положительным, если оно изначально было отрицательным).
Функция ниже, getWholeMaker
, возвращает то, что вы хотите («вещь», которая должна быть добавлена для округления числа). Время выполнения O(log(n))
и использует только элементарные операции.
/* Returns the factional part of x */
double getFrac(double x) {
if(x < 0) x = -x;
if(x < 1) return x;
else if(x < 2) return x-1;
/* x >= 0 */
double t = 2;
while(t+t <= x) t += t;
/* t is now the largest power of 2 less than or equal to x */
while(t >= 1) {
if(t <= x) x -= t;
t /= 2;
}
return x;
}
double getWholeMaker(double x) {
double frac = getFrac(x);
double sign = x >= 0 ? +1 : -1;
return sign * (frac <= 0.5 ? -frac : 1-frac);
}