この記事では、基本的な数値操作から始め、標準ライブラリの便利な関数を紹介し、最終的には自分で数値を切り上げる関数を作成する方法を解説します。
初心者でも理解しやすいように、サンプルコードと実行結果を交えて丁寧に説明しますので、ぜひ最後まで読んでみてください。
C言語での基本的な数値操作
C言語では、数値操作は非常に基本的かつ重要なスキルです。
数値操作には、整数と浮動小数点数の扱い方、標準ライブラリの関数を利用した計算などが含まれます。
ここでは、整数と浮動小数点数の違い、そして標準ライブラリの関数について詳しく解説します。
整数と浮動小数点数の違い
C言語では、数値データ型として主に「整数型」と「浮動小数点型」があります。
これらのデータ型は、それぞれ異なる特性を持っています。
型の種類 | 説明 | 特徴 | 例 |
---|---|---|---|
整数型 (int, long, shortなど) | 小数点を持たない数値を扱う | メモリの使用量が少なく、計算速度が速い | int a = 5; |
浮動小数点型 (float, doubleなど) | 小数点を含む数値を扱う | メモリの使用量が多く、計算速度が遅いが、より精密な計算が可能 | float b = 5.75; |
整数型と浮動小数点型の違いを理解することは、適切なデータ型を選択し、効率的なプログラムを作成するために重要です。
標準ライブラリの関数
C言語には、数値操作を簡単に行うための標準ライブラリが用意されています。
特に、math.h
ライブラリには、数値の切り上げや切り捨てを行う関数が含まれています。
math.hのceil関数
ceil関数
は、指定された浮動小数点数を切り上げて、最も近い整数を返します。
例えば、3.14を切り上げると4になります。
以下にceil関数
の使用例を示します。
#include <stdio.h>
#include <math.h>
int main() {
double num = 3.14;
double result = ceil(num);
printf("ceil(%.2f) = %.2f\n", num, result);
return 0;
}
このプログラムを実行すると、以下のような出力が得られます。
ceil(3.14) = 4.00
math.hのfloor関数
floor関数
は、指定された浮動小数点数を切り捨てて、最も近い整数を返します。
例えば、3.14を切り捨てると3になります。
以下にfloor関数
の使用例を示します。
#include <stdio.h>
#include <math.h>
int main() {
double num = 3.14;
double result = floor(num);
printf("floor(%.2f) = %.2f\n", num, result);
return 0;
}
このプログラムを実行すると、以下のような出力が得られます。
floor(3.14) = 3.00
これらの関数を利用することで、数値の切り上げや切り捨てを簡単に行うことができます。
次のセクションでは、これらの関数を参考にして、自作のcell関数
を実装する方法について解説します。
自作cell関数
基本的な実装
整数の切り上げ
まずは、整数の切り上げを行う関数を実装します。
整数の場合、切り上げはそのままの値を返すだけで良いので、特に複雑な処理は必要ありません。
int ceil_int(int num) {
return num;
}
浮動小数点数の切り上げ
次に、浮動小数点数の切り上げを行う関数を実装します。
浮動小数点数の場合、整数部分と小数部分を分けて考える必要があります。
小数部分が0でない場合は、整数部分に1を加えることで切り上げを実現します。
#include <math.h>
double ceil_double(double num) {
int int_part = (int)num;
if (num > int_part) {
return int_part + 1;
} else {
return int_part;
}
}
エッジケースの処理
負の数の切り上げ
負の数の場合も考慮する必要があります。
負の数の切り上げは、整数部分が小数部分よりも小さい場合に整数部分をそのまま返すことになります。
double ceil_double(double num) {
int int_part = (int)num;
if (num > int_part) {
return int_part + 1;
} else if (num < int_part) {
return int_part;
} else {
return num;
}
}
既に整数の場合
既に整数の場合は、そのままの値を返すようにします。
この場合、特に追加の処理は必要ありません。
double ceil_double(double num) {
int int_part = (int)num;
if (num == int_part) {
return num;
} else if (num > int_part) {
return int_part + 1;
} else {
return int_part;
}
}
cell関数のテスト
正の整数のテスト
正の整数に対して切り上げ関数をテストします。
例えば、5
を入力した場合、結果は5
になります。
#include <stdio.h>
int main() {
printf("ceil_int(5) = %d\n", ceil_int(5)); // 5
return 0;
}
負の整数のテスト
負の整数に対して切り上げ関数をテストします。
例えば、-3
を入力した場合、結果は-3
になります。
#include <stdio.h>
int main() {
printf("ceil_int(-3) = %d\n", ceil_int(-3)); // -3
return 0;
}
浮動小数点数のテスト
浮動小数点数に対して切り上げ関数をテストします。
例えば、3.7
を入力した場合、結果は4
になります。
#include <stdio.h>
int main() {
printf("ceil_double(3.7) = %.1f\n", ceil_double(3.7)); // 4.0
return 0;
}
テストコードの実装
全てのテストケースをまとめたテストコードを実装します。
#include <stdio.h>
int ceil_int(int num);
double ceil_double(double num);
int main() {
// 正の整数のテスト
printf("ceil_int(5) = %d\n", ceil_int(5)); // 5
// 負の整数のテスト
printf("ceil_int(-3) = %d\n", ceil_int(-3)); // -3
// 浮動小数点数のテスト
printf("ceil_double(3.7) = %.1f\n", ceil_double(3.7)); // 4.0
printf("ceil_double(-2.3) = %.1f\n", ceil_double(-2.3)); // -2.0
printf("ceil_double(4.0) = %.1f\n", ceil_double(4.0)); // 4.0
return 0;
}
int ceil_int(int num) {
return num;
}
double ceil_double(double num) {
int int_part = (int)num;
if (num == int_part) {
return num;
} else if (num > int_part) {
return int_part + 1;
} else {
return int_part;
}
}
テスト結果の確認
上記のテストコードを実行すると、以下のような結果が得られます。
ceil_int(5) = 5
ceil_int(-3) = -3
ceil_double(3.7) = 4.0
ceil_double(-2.3) = -2.0
ceil_double(4.0) = 4.0
これで、数値を切り上げるcell関数
の自作方法とそのテストが完了しました。
これらの関数を使うことで、C言語での数値操作がより柔軟に行えるようになります。