組み込みの天井または床の機能を使用せずに、数値を最も近い整数に丸めるために、数値に加算/減算するために必要な分数を決定するための優れたアルゴリズムは何ですか?
編集:数を最も近い整数に丸めるのに必要な部分を理解するための数学的数のトリックを探しています。数学演算が原始的であるほど、優れています。他人の手順は使用しないでください。どちらの方法でも、方法に合った0.5を使用できます。これは私の宿題の質問ではありません。また、これをどこでも使用するつもりはありません。
数値を1で変更して、小数部分を取得します。> 0.5の場合は切り上げ、それ以外の場合は切り下げます。
また
数値を0.5で割ります。奇数の場合は切り上げ、それ以外の場合は切り下げます。
数値の小数部分を取得すると、問題はほとんど解決されます。小数部分を取得する 1 つの方法は、数値から 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);
}