Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語でfloat・double型の2つの数値の剰余(モジュロ)を求める方法

C言語では、floatdouble といった浮動小数点型の2つの数値に対して、剰余(モジュロ)を求めることができます。剰余とは、割り算を行った際の「余り」を計算する演算のことです。

整数型であれば % 演算子が使えますが、浮動小数点数には適用できません。そこで活躍するのが、<math.h> ヘッダーで定義されている remainder() 関数です。この関数は、分子÷分母の浮動小数点剰余を計算するために用意されています。

remainder() 関数の仕組み

remainder(x, y) の戻り値は、次の式で表されます。

remainder(x, y) = x − rquote * y

ここで rquotex/y の商を表し、最も近い整数値へ丸められます(IEEE 754 規格に準拠した丸め処理)。この関数は doublefloatlong double 型の引数を2つ受け取り、引数と同じ型の剰余を返します。第1引数が分子(被除数)、第2引数が分母(除数)です。

補足:fmod() 関数との違い

類似の関数として fmod() がありますが、fmod() は商を0方向へ切り捨てるのに対し、remainder() は最も近い整数へ丸めるため、同じ入力でも結果が異なる場合があります。用途に応じて使い分けるようにしましょう。

サンプルコード

#include <stdio.h>
#include <math.h>
main() {
    double x = 14.5, y = 4.1;
    double res = remainder(x, y);
    printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
    x = -34.50;
    y = 4.0;
    res = remainder(x, y);
    printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
    x = 65.23;
    y = 0;
    res = remainder(x, y);
    printf("Remainder of %lf/%lf is: %lf\n",x,y, res);
}

実行結果

Remainder of 14.500000/4.100000 is: -1.900000
Remainder of -34.500000/4.000000 is: 1.500000
Remainder of 65.230000/0.000000 is: -1.#IND00

出力結果を見ると、14.5 ÷ 4.1 の剰余は -1.9 となっています。これは、商 14.5/4.1 ≒ 3.54 を最も近い整数である 4 に丸めてから計算しているためです。同様に、-34.5 ÷ 4.0 では商 -8.625 が -9 に丸められ、結果は 1.5 になります。

なお、分母に 0 を指定した場合は除算が定義されず、無効な値(NaN)が返される点に注意してください。

  1. C#で2つの2進数の合計を求める方法【サンプルコード付き】

    C#で2つの2進数の合計を求めるには、まず対象となる2進数を変数に設定します。本記事では、剰余演算と繰り上がり(キャリー)処理を組み合わせて、2進数同士の加算を行うプログラムの実装方法を解説します。 手順1:2進数を設定する はじめに、加算したい2つの2進数を変数として定義します。ここでは例として次の値を使用します。 val1 = 11110; val2 = 11100; 手順2:displaySum()メソッドを呼び出す 次に、合計を計算して表示するために作成した displaySum() メソッドを呼び出します。 sum = displaySum(val1, val2); displayS

  2. C#で2つの2進数の積を求める方法をわかりやすく解説

    2つの2進数の積(掛け算の結果)を求めるには、まず対象となる2進数を設定します。C#では、2進数をlong型の整数として扱い、筆算と同じ要領で各桁を処理していくことで積を計算できます。ここでは、2進数「11100」と「10001」の積を求める例を見ていきましょう。1. 2進数の設定最初に、掛け合わせる2つの2進数を変数に代入し、コンソールに表示します。val1 = 11100; val2 = 10001; Console.WriteLine(Binary one: +val1); Console.WriteLine(Binary two: +val2);2. ループ処理で積を計算する次に、w