C言語の標準ライブラリに用意されているceil関数
。ceil関数
を使えば簡単に数値の小数点以下の数値を切り上げることができます。
ですが、ceil関数
を使えない状況下で数値の切り上げを行おうと思うとceil関数
を自作しなければなりません。
今回はceil関数
を自作するプログラムの書き方について解説します。
サンプルコード
サンプルコードでは小数第一位で切り上げを行っています。
int main() {
double num = 2.5;
double result = (int)(num + 0.9);
return 0;
}
解説
切り上げを行っているのは4行目の(int)(num + 0.9)
の部分です。
まず、切り上げ対象の数値に対して0.9
を足すと、切り上げが必要な数字だった場合は1の位の数値が1上がります。
- 2.5に0.9を足すと3.4
- 2.1に0.9を足すと3.0
- 2.0に0.9を足すと2.9
この時点ではまだ切り上げ処理は行われていません。
数値の切り上げで重要なポイントは、int型への型キャストです。
int型の値に型キャストを行うとき、小数値が自動的に切り捨てられる仕様となっており、この仕様を応用すれば簡単に切り上げ処理を実装できます。
例えば今回のnum + 0.9
は2.5 + 0.9 = 3.4
なので、小数値が切り捨てられて3になり、結果的に数値が切り上げられます。
変数numの値が、切り上げる必要のない2.0
だったときはどうでしょうか。
この場合は2.0 + 0.9 = 2.9
となり、小数値が切り捨てられて計算結果は2
。切り上げは行われていません。
このように、int型へのキャストの仕様を応用することによって、if文を使った条件分岐を実装することなく切り上げ処理を実装できます。
負数にも対応する場合
先程のサンプルコードは正数にしか対応しておらず、負数の切り上げをしようとすると計算結果が狂います。
例えば-2.4
を切り上げ処理する場合、正しい計算結果は-2ですが、上記サンプルコードだと-2.4 + 0.9 = -1.5
。-1.5
を切り上げると-1
になってしまい、正しい切り上げ計算結果ではなくなります。
負数の場合は元の数値を型キャストするだけで切り上げられるため、負数かどうかを判定する条件分岐が必要です。
そのため、正数・負数両方に対応した切り上げを実装する場合は、以下のコードになります。
int main() {
double num = 2.1;
double result;
if (num < 0) {
//負数のとき
result = (int)num;
}
else {
//正数のとき
result = (int)(num + 0.9);
}
return 0;
}
短くまとめるなら、三項演算子を使って(int)( num < 0.0 ? num : num + 0.9 );
としましょう。
ceil関数
の自作はこのように簡単にできてしまうので、試しに自作してみたいけど書き方がわからなかった方はこのサンプルコードを使って覚えてください。