このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/3
#  お題:aをもっとも近いbの倍数に丸める。ちょうど中間の場合は 
#  0から遠ざかる方向へ丸める。bが実数の場合は誤差はやむを得ないものとする。 
#  例 
#  a=123,b=12 -> 120 
#  a=126,b=12 -> 132 
#  a=-123,b=12 -> -120 
#  a=-126,b=12 -> -132 
#  a=1.234,b=0.01 -> 1.23 
#  a=1.235,b=0.01 -> 1.24 
# 
# 

'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。
bが実数の場合は誤差はやむを得ないものとする。'(_a,_b,_aにもっとも近いbの倍数) :-
findall(_bの倍数,(
            nth1(_倍数,_,_),
            _bの倍数 is _b * _倍数,
            ( bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b),!,fail;'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b))),
        [_aに等しいかaより小さい数,_aに等しいかaより大きい数]),
'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aにもっとも近いbの倍数).

bの倍数がaをb以上超えたら終了(_bの倍数,_a,_b) :-
abs(_bの倍数) >= abs(_a + _b).

'bの倍数がaの前後(ただしaを超える場合はbの倍数とaの差はb未満)'(_bの倍数,_a,_b) :-
abs(_bの倍数 - _a) =< abs(_b).

'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_a,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより大きい数) :-
abs(_aに等しいかaより大きい数 - _a) =< abs(_aに等しいかaより小さい数 - _a),!.
'aをもっとも近いbの倍数に丸める。ちょうど中間の場合は0から遠ざかる方向へ丸める。'(_,_aに等しいかaより小さい数,_aに等しいかaより大きい数,_aに等しいかaより小さい数).