Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
fmod() / modf() / frexp() / ldexp()
浮動小数点数を細かく操作するための関数です。『<math.h>』に定義されており、余剰計算・整数部と小数部の分離・仮数と指数への分解など、低レベルな浮動小数点演算に使われます。コンパイル時に『-lm』リンクオプションが必要な場合があります。
構文
// x を y で割った浮動小数点数の余りを返します(符号は x に合わせます)。 double fmod(double x, double y); // x の整数部と小数部を分離します。整数部を *iptr に格納し、小数部を返します。 double modf(double x, double *iptr); // x を 仮数 × 2^exp の形に分解します。仮数を戻り値として返し、指数を *exp に格納します。 // 仮数の絶対値は [0.5, 1.0) の範囲です。 double frexp(double x, int *exp); // x × 2^exp を計算します(frexp の逆操作)。 double ldexp(double x, int exp);
関数一覧
| 関数 | 概要 |
|---|---|
| fmod() | 浮動小数点数の除算余りを返します。整数の『%』演算子の浮動小数点版です。 |
| modf() | 浮動小数点数を整数部と小数部に分割します。両方とも double 型で得られます。 |
| frexp() | 浮動小数点数を仮数部と指数部に分解します。IEEE 754 の内部表現を取り出す低レベル操作です。 |
| ldexp() | 仮数部と指数部から浮動小数点数を合成します。frexp() の逆操作です。 |
サンプルコード
#include <stdio.h>
#include <math.h>
int main(void) {
// fmod で浮動小数点の余りを求めます(% は整数専用なので注意)。
printf("fmod(5.7, 2.0) = %.1f\n", fmod(5.7, 2.0)); // 『1.7』と出力されます。
printf("fmod(-5.7, 2.0) = %.1f\n", fmod(-5.7, 2.0)); // 『-1.7』(被除数の符号)と出力されます。
// 角度を 0°〜360° の範囲に正規化する実用例です。
double angle = 730.5;
double normalized = fmod(angle, 360.0);
printf("%.1f° → 正規化後: %.1f°\n", angle, normalized); // 『10.5°』と出力されます。
// modf で整数部と小数部を分離します。
double int_part;
double frac_part = modf(3.75, &int_part);
printf("3.75 の整数部: %.1f、小数部: %.2f\n", int_part, frac_part);
// 『整数部: 3.0、小数部: 0.75』と出力されます。
double neg_frac = modf(-2.3, &int_part);
printf("-2.3 の整数部: %.1f、小数部: %.1f\n", int_part, neg_frac);
// 符号は元の数に合わせて『整数部: -2.0、小数部: -0.3』と出力されます。
// frexp で浮動小数点数を仮数と指数に分解します。
int exp;
double mantissa = frexp(8.0, &exp);
printf("frexp(8.0): 仮数 = %.4f、指数 = %d\n", mantissa, exp);
// 8.0 = 0.5 × 2^4 なので『仮数 = 0.5000、指数 = 4』と出力されます。
// ldexp で仮数と指数から浮動小数点数を復元します。
double restored = ldexp(mantissa, exp);
printf("ldexp(%.4f, %d) = %.1f\n", mantissa, exp, restored);
// 『8.0』と出力されます(frexp の逆操作)。
return 0;
}
概要
整数型の『%』演算子は浮動小数点数には使えません。浮動小数点数の余りを求める場合は必ず『fmod()』を使用してください。ゲーム開発での角度正規化や周期的な計算など、浮動小数点数の折り返し処理によく使われます。
『modf()』は整数部も double 型(小数部がゼロ)として返します。整数の floor() とは異なり、負の値でも整数部の符号が元の数と一致します(例:-2.3 の整数部は -2.0)。単に小数を切り捨てたい場合は『floor()』が適しています。
『frexp()』と『ldexp()』は IEEE 754 の浮動小数点数の内部表現(仮数部と指数部)を直接操作します。一般的なアプリケーションではあまり使いませんが、数値計算ライブラリや高精度演算の実装では重要な役割を果たします。
fmod(x, 0.0) の結果は未定義(NaN)になります。除数が 0 でないことを事前に確認してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。