今回は整数除算の商の端数を切り上げます。+∞方向に丸めるといってもよいでしょう。
元ネタでは負の数は対象にしていませんでしたが、せっかく実装し直すのでこちらでは負の数も対象にしました。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
template <typename T> T iceil(T dividend, T divisor) { assert(is_integral<T>::value); T lhs = dividend; T rhs = divisor; if (rhs < 0) { lhs = -lhs; rhs = -rhs; } return (lhs + (rhs - 1)) / rhs; } |
例によってC++98以降で使えるようにはしましたが、is_integralにはTR1かBoost C++ Librariesを使うようにしてください。C++11以降なら標準ライブラリだけでOKです。使っているのはassertの引数だけなのでNDEBUGマクロを定義すれば標準ライブラリの範囲で大丈夫でしょう。
境界値のチェックはやっていませんのでオーバーフローが起きると未定義の動作になりますが、とりあえずこれで動作します。
以前のWebサイトには定数式にするためのメタ関数も掲載していたのですが、C++14以降ならconstexprを付けるだけで済みます。C++11のconstexprは制限が多いのでもう一工夫必要になります(今回は掲載しません)。
標準関数のceilを使っても端数の切り上げを行うことができます。ただし、ceilは引数も返却値も浮動小数点数ですので、整数だけで処理したい場合には不向きです。