プロが教える店舗&オフィスのセキュリティ対策術

技術評論社より出版の、「C言語による最新アルゴリズム事典」(奥村晴彦著)の「四捨五入」の項目について質問です。

「a >= 0, b > 0の2整数について、a / bを四捨五入で小数第一位までに丸める方法」が以下のように書かれています。

整数型変数rを使って、
r = (10 * a + b / 2) / b;
printf("a / b = %d.%d\n", r / 10, r % 10);

rには、結果の小数a.bが10 * a + bの形に入ることになるのでしょうが、何故そうなるのかわかりません。

どうかご教授ください。m(__)m

A 回答 (1件)

このアルゴリズムの目的は、割り算による誤差をなくすことです。


そのため、整数演算をメインにしています。

実数で四捨五入するなら、

floor(10.0*a/(double)b+0.5)/10.0

でしょう。これを、割り算を後回しにすると、

floor((10.0*a+0.5*b)/b)/10.0

となりますね。これを整数演算にしたものが提示された式です。
(10*a)%b+b/2がb以上であれば(10*a+b/2)/bは(10*a)/b+1となります。この仕組みで四捨五入が実現されています。
bが奇数の場合、b/2の余りが捨てられてしまいますが、(10*a)%bが(b+1)/2以上でないと切り上げる必要がないので、問題ありません。
    • good
    • 0
この回答へのお礼

よくわかりました!
ご丁寧にどうもありがとうございました。

お礼日時:2010/02/27 17:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!