【C言語】数値を切り捨てする関数を自作する方法

この記事では、C言語で数値を切り捨てる方法について学びます。

まず、整数型と浮動小数点型の違いや、標準ライブラリのfloor関数trunc関数について解説します。

その後、自分で切り捨て関数を作成し、テストする方法を紹介します。

最後に、これらの関数を使った実際のプログラム例を見て、どのように応用できるかを理解します。

初心者の方でもわかりやすいように、サンプルコードと実行結果を交えて説明しますので、ぜひ一緒に学んでいきましょう。

目次から探す

C言語での基本的な数値操作

C言語では、数値操作は非常に基本的かつ重要なスキルです。

数値の型や標準ライブラリの関数を理解することで、効率的なプログラムを作成することができます。

ここでは、整数型と浮動小数点型の違い、そして標準ライブラリに含まれる数値操作の関数について解説します。

整数型と浮動小数点型の違い

C言語には、数値を表現するためのいくつかのデータ型があります。

主に使用されるのは「整数型」と「浮動小数点型」です。

  • 整数型: 整数型は、小数点を含まない数値を表現します。

代表的な整数型には、intshortlongunsigned intなどがあります。

整数型は、メモリの使用量が少なく、計算速度が速いという特徴があります。

  • 浮動小数点型: 浮動小数点型は、小数点を含む数値を表現します。

代表的な浮動小数点型には、floatdoublelong doubleがあります。

浮動小数点型は、より広い範囲の数値を表現できる反面、計算精度が整数型に比べて低くなることがあります。

標準ライブラリの関数

C言語の標準ライブラリには、数値操作を簡単に行うための関数が多数含まれています。

ここでは、数値の切り捨てに関連する代表的な関数であるfloor関数trunc関数について解説します。

floor関数

floor関数は、指定した浮動小数点数を超えない最大の整数を返す関数です。

例えば、3.7をfloor関数に渡すと、3が返されます。

floor関数は、math.hヘッダファイルに含まれており、以下のように使用します。

#include <stdio.h>
#include <math.h>
int main() {
    double num = 3.7;
    double result = floor(num);
    printf("floor(%.1f) = %.1f\n", num, result);
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

floor(3.7) = 3.0

trunc関数

trunc関数は、指定した浮動小数点数の小数部分を切り捨てて整数部分だけを返す関数です。

例えば、3.7をtrunc関数に渡すと、3が返されます。

trunc関数math.hヘッダファイルに含まれており、以下のように使用します。

#include <stdio.h>
#include <math.h>
int main() {
    double num = 3.7;
    double result = trunc(num);
    printf("trunc(%.1f) = %.1f\n", num, result);
    return 0;
}

このプログラムを実行すると、以下のような出力が得られます。

trunc(3.7) = 3.0

floor関数trunc関数の違いは、負の数に対する挙動です。

例えば、-3.7を渡した場合、floor関数は-4を返しますが、trunc関数は-3を返します。

これらの関数を使い分けることで、目的に応じた数値操作が可能になります。

自作関数

C言語では標準ライブラリに数値を切り捨てる関数が用意されていますが、特定の要件に応じて自作の関数を作成することもあります。

ここでは、整数型と浮動小数点型の数値を切り捨てる関数を自作する方法について解説します。

整数型の切り捨て関数

整数型の数値を切り捨てる関数は比較的簡単に実装できます。

整数型の場合、切り捨てとはそのままの値を返すことを意味します。

実装例

以下に、整数型の数値を切り捨てる関数の実装例を示します。

#include <stdio.h>
// 整数型の数値を切り捨てる関数
int truncate_int(int num) {
    return num;
}
int main() {
    int num = 123;
    printf("切り捨て前: %d\n", num);
    printf("切り捨て後: %d\n", truncate_int(num));
    return 0;
}

コードの解説

上記のコードでは、truncate_intという関数を定義しています。

この関数は引数として整数型の数値を受け取り、そのまま返すだけです。

整数型の場合、特に切り捨ての処理は必要ありません。

  1. #include <stdio.h>: 標準入出力ライブラリをインクルードします。
  2. int truncate_int(int num): 整数型の数値を切り捨てる関数を定義します。
  3. return num;: 引数として受け取った数値をそのまま返します。
  4. int main(): メイン関数です。

ここでtruncate_int関数を呼び出し、結果を表示します。

浮動小数点型の切り捨て関数

浮動小数点型の数値を切り捨てる場合、整数部分だけを取り出す必要があります。

これには、標準ライブラリの関数を使わずに自作する方法を紹介します。

実装例

以下に、浮動小数点型の数値を切り捨てる関数の実装例を示します。

#include <stdio.h>
// 浮動小数点型の数値を切り捨てる関数
double truncate_double(double num) {
    if (num > 0) {
        return (int)num;
    } else {
        return (int)num - 1;
    }
}
int main() {
    double num = 123.456;
    printf("切り捨て前: %f\n", num);
    printf("切り捨て後: %f\n", truncate_double(num));
    return 0;
}

コードの解説

上記のコードでは、truncate_doubleという関数を定義しています。

この関数は引数として浮動小数点型の数値を受け取り、その整数部分だけを返します。

  1. #include <stdio.h>: 標準入出力ライブラリをインクルードします。
  2. double truncate_double(double num): 浮動小数点型の数値を切り捨てる関数を定義します。
  3. if (num > 0): 数値が正の場合、整数部分を返します。
  4. return (int)num;: 数値を整数型にキャストして返します。
  5. else: 数値が負の場合、整数部分から1を引いた値を返します。
  6. return (int)num - 1;: 数値を整数型にキャストし、1を引いて返します。
  7. int main(): メイン関数です。

ここでtruncate_double関数を呼び出し、結果を表示します。

このようにして、整数型と浮動小数点型の数値を切り捨てる関数を自作することができます。

次に、これらの関数をテストする方法について解説します。

自作関数のテスト

自作した関数が正しく動作するかどうかを確認するためには、テストを行うことが重要です。

ここでは、テストケースの設計から実際のテストコードの実装、そしてテスト結果の確認方法について解説します。

テストケースの設計

テストケースを設計する際には、関数が期待通りに動作するかどうかを確認するために、さまざまな入力値を用意する必要があります。

テストケースは大きく分けて「正常系」と「異常系」に分類されます。

正常系のテスト

正常系のテストでは、関数が正しく動作することを確認するために、通常の入力値を使用します。

以下に、整数型と浮動小数点型の切り捨て関数に対する正常系のテストケースを示します。

  • 整数型の切り捨て関数
  • 入力: 5, 期待される出力: 5
  • 入力: -3, 期待される出力: -3
  • 入力: 0, 期待される出力: 0
  • 浮動小数点型の切り捨て関数
  • 入力: 5.7, 期待される出力: 5.0
  • 入力: -3.2, 期待される出力: -4.0
  • 入力: 0.0, 期待される出力: 0.0

異常系のテスト

異常系のテストでは、関数が予期しない入力値に対しても適切に動作することを確認します。

異常系のテストケースとしては、極端に大きな値や小さな値、ゼロ除算などが考えられますが、ここでは基本的な範囲内でのテストを行います。

  • 整数型の切り捨て関数
  • 入力: INT_MAX, 期待される出力: INT_MAX
  • 入力: INT_MIN, 期待される出力: INT_MIN
  • 浮動小数点型の切り捨て関数
  • 入力: DBL_MAX, 期待される出力: DBL_MAX
  • 入力: DBL_MIN, 期待される出力: DBL_MIN

テストコードの実装

テストケースが設計できたら、次に実際のテストコードを実装します。

ここでは、C言語の標準ライブラリを使用してテストを行います。

テストコードの例

以下に、整数型と浮動小数点型の切り捨て関数に対するテストコードの例を示します。

#include <stdio.h>
#include <limits.h>
#include <float.h>

// 整数型の切り捨て関数
int truncate_int(int value) {
    return value;
}

// 浮動小数点型の切り捨て関数
double truncate_double(double value) {
    return (value >= 0) ? (int)value : (int)value - 1;
}

void test_truncate_int() {
    printf("truncate_intのテスト...\n");
    printf("入力: 5, 期待される出力: 5, 実際の出力: %d\n", truncate_int(5));
    printf("入力: -3, 期待される出力: -3, 実際の出力: %d\n", truncate_int(-3));
    printf("入力: 0, 期待される出力: 0, 実際の出力: %d\n", truncate_int(0));
    printf("入力: INT_MAX, 期待される出力: INT_MAX, 実際の出力: %d\n", truncate_int(INT_MAX));
    printf("入力: INT_MIN, 期待される出力: INT_MIN, 実際の出力: %d\n", truncate_int(INT_MIN));
}

void test_truncate_double() {
    printf("truncate_doubleのテスト...\n");
    printf("入力: 5.7, 期待される出力: 5.0, 実際の出力: %.1f\n", truncate_double(5.7));
    printf("入力: -3.2, 期待される出力: -4.0, 実際の出力: %.1f\n", truncate_double(-3.2));
    printf("入力: 0.0, 期待される出力: 0.0, 実際の出力: %.1f\n", truncate_double(0.0));
    printf("入力: DBL_MAX, 期待される出力: DBL_MAX, 実際の出力: %.1f\n", truncate_double(DBL_MAX));
    printf("入力: DBL_MIN, 期待される出力: DBL_MIN, 実際の出力: %.1f\n", truncate_double(DBL_MIN));
}

int main() {
    test_truncate_int();
    test_truncate_double();
    return 0;
}

テスト結果の確認方法

テストコードを実行すると、各テストケースの入力値と期待される出力値、そして実際の出力値が表示されます。

これにより、自作関数が正しく動作しているかどうかを確認することができます。

例えば、上記のテストコードを実行した場合、以下のような出力が得られます。

truncate_intのテスト...
入力: 5, 期待される出力: 5, 実際の出力: 5
入力: -3, 期待される出力: -3, 実際の出力: -3
入力: 0, 期待される出力: 0, 実際の出力: 0
入力: INT_MAX, 期待される出力: INT_MAX, 実際の出力: 2147483647
入力: INT_MIN, 期待される出力: INT_MIN, 実際の出力: -2147483648
truncate_doubleのテスト...
入力: 5.7, 期待される出力: 5.0, 実際の出力: 5.0
入力: -3.2, 期待される出力: -4.0, 実際の出力: -4.0
入力: 0.0, 期待される出力: 0.0, 実際の出力: 0.0
入力: DBL_MAX, 期待される出力: DBL_MAX, 実際の出力: 0.0
入力: DBL_MIN, 期待される出力: DBL_MIN, 実際の出力: 0.0

このようにして、各テストケースの結果を確認し、自作関数が期待通りに動作しているかどうかを検証します。

もし期待される出力と実際の出力が一致しない場合は、関数の実装に問題がある可能性があるため、再度コードを見直す必要があります。

応用例

ここでは、自作した切り捨て関数を利用して、実際のプログラムでどのように活用できるかを見ていきます。

具体的には、数値の配列処理と数値の丸め処理について解説します。

切り捨て関数を利用したプログラム

数値の配列処理

まずは、数値の配列を処理する例を見てみましょう。

ここでは、浮動小数点数の配列を切り捨てて整数に変換するプログラムを作成します。

#include <stdio.h>
// 浮動小数点数を切り捨てる関数
int truncate_float(double num) {
    return (int)num;
}
int main() {
    double numbers[] = {3.14, 2.71, 1.41, 0.99, -1.23};
    int size = sizeof(numbers) / sizeof(numbers[0]);
    int truncated_numbers[size];
    // 配列の各要素を切り捨て
    for (int i = 0; i < size; i++) {
        truncated_numbers[i] = truncate_float(numbers[i]);
    }
    // 結果を表示
    printf("元の配列: ");
    for (int i = 0; i < size; i++) {
        printf("%.2f ", numbers[i]);
    }
    printf("\n");
    printf("切り捨て後の配列: ");
    for (int i = 0; i < size; i++) {
        printf("%d ", truncated_numbers[i]);
    }
    printf("\n");
    return 0;
}

このプログラムでは、numbersという浮動小数点数の配列を定義し、各要素を自作のtruncate_float関数で切り捨てて整数に変換しています。

結果はtruncated_numbersという整数の配列に格納され、最後に元の配列と切り捨て後の配列を表示します。

実行結果は以下のようになります。

元の配列: 3.14 2.71 1.41 0.99 -1.23 
切り捨て後の配列: 3 2 1 0 -1

数値の丸め処理

次に、数値の丸め処理を行うプログラムを見てみましょう。

ここでは、四捨五入ではなく、常に切り捨てる処理を行います。

#include <stdio.h>
// 浮動小数点数を切り捨てる関数
int truncate_float(double num) {
    return (int)num;
}
int main() {
    double number = 5.67;
    int truncated_number = truncate_float(number);
    printf("元の数値: %.2f\n", number);
    printf("切り捨て後の数値: %d\n", truncated_number);
    return 0;
}

このプログラムでは、numberという浮動小数点数を定義し、それをtruncate_float関数で切り捨てています。

結果はtruncated_numberという整数に格納され、最後に元の数値と切り捨て後の数値を表示します。

実行結果は以下のようになります。

元の数値: 5.67
切り捨て後の数値: 5

このように、自作の切り捨て関数を利用することで、数値の配列処理や丸め処理を簡単に行うことができます。

これらの応用例を参考にして、さらに複雑な数値操作を行うプログラムを作成してみてください。

目次から探す