名前空間
変種
操作

fmod, fmodf, fmodl

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(C99)
分類
(C99)
(C99)
(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <math.h> で定義
float       fmodf( float x, float y );
(1) (C99およびそれ以降)
double      fmod( double x, double y );
(2)
long double fmodl( long double x, long double y );
(3) (C99およびそれ以降)
ヘッダ <tgmath.h> で定義
#define fmod( x, y )
(4) (C99およびそれ以降)
1-3) 除算 x/y の浮動小数点の余りを計算します。
4) 型総称マクロ。 いずれかの引数が long double 型の場合は fmodl が呼ばれます。 そうでなく、いずれかの引数が整数型または double 型の場合は fmod が呼ばれます。 そうでなければ fmodf が呼ばれます。

この関数によって計算される除算 x/y の浮動小数点の余りは、正確に値 x - n*y です。 ただし nx/y の小数部を切り捨てたものです。

戻り値は x と同じ符号を持ち、 y より小さいまたは等しい絶対値を持ちます。

目次

[編集] 引数

x, y - 浮動小数点値

[編集] 戻り値

成功した場合、上で定義された通りの除算 x/y の浮動小数点の余りを返します。

定義域エラーが発生した場合、処理系定義の値 (サポートされていれば NaN) が返されます。

アンダーフローにより値域エラーが発生した場合、 (丸めた後の) 正しい結果が返されます。

[編集] エラー処理

math_errhandling で規定されている通りにエラーが報告されます。

y がゼロの場合、定義域エラーが発生する場合があります。

処理系が IEEE 浮動小数点算術 (IEC 60559) をサポートしている場合、

  • x が ±0 であり y がゼロでなければ、 ±0 が返されます。
  • x が ±∞ であり y が NaN でなければ、 NaN が返され、 FE_INVALID が発生します。
  • y が ±0 であり x が NaN でなければ、 NaN が返され、 FE_INVALID が発生します。
  • y が ±∞ であり x が有限であれば、 x が返されます。
  • いずれかの引数が NaN であれば、 NaN が返されます。

[編集] ノート

POSIX は、 x が無限大または y がゼロの場合、定義域エラーが発生することを要求しています

fmod は浮動小数点型の符号なし整数型へのサイレントなラッピングを行うのに便利です (しかし remainder はそうではありません)。 (0.0 <= (y = fmod(rint(x), 65536.0 )) ? y : 65536.0 + y)unsigned short に対応する [-0.0 .. 65535.0] の範囲内になりますが、 remainder(rint(x), 65536.0)signed short の範囲外である [-32767.0, +32768.0] の範囲内になります。

fmod の double 版は以下のように実装されているかのように動作します。

double fmod(double x, double y)
{
#pragma STDC FENV_ACCESS ON
    double result = remainder(fabs(x), (y = fabs(y)));
    if (signbit(result)) result += y;
    return copysign(result, x);
}

[編集]

#include <stdio.h>
#include <math.h>
#include <fenv.h>
 
#pragma STDC FENV_ACCESS ON
int main(void)
{
    printf("fmod(+5.1, +3.0) = %.1f\n", fmod(5.1,3));
    printf("fmod(-5.1, +3.0) = %.1f\n", fmod(-5.1,3));
    printf("fmod(+5.1, -3.0) = %.1f\n", fmod(5.1,-3));
    printf("fmod(-5.1, -3.0) = %.1f\n", fmod(-5.1,-3));
 
    // special values
    printf("fmod(+0.0, 1.0) = %.1f\n", fmod(0, 1));
    printf("fmod(-0.0, 1.0) = %.1f\n", fmod(-0.0, 1));
    printf("fmod(+5.1, Inf) = %.1f\n", fmod(5.1, INFINITY));
 
    // error handling
    feclearexcept(FE_ALL_EXCEPT);
    printf("fmod(+5.1, 0) = %.1f\n", fmod(5.1, 0));
    if(fetestexcept(FE_INVALID)) puts("    FE_INVALID raised");
}

出力例:

fmod(+5.1, +3.0) = 2.1
fmod(-5.1, +3.0) = -2.1
fmod(+5.1, -3.0) = 2.1
fmod(-5.1, -3.0) = -2.1
fmod(+0.0, 1.0) = 0.0
fmod(-0.0, 1.0) = -0.0
fmod(+5.1, Inf) = 5.1
fmod(+5.1, 0) = nan
    FE_INVALID raised

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.10.1 The fmod functions (p: 254)
  • 7.25 Type-generic math <tgmath.h> (p: 373-375)
  • F.10.7.1 The fmod functions (p: 528)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.10.1 The fmod functions (p: 235)
  • 7.22 Type-generic math <tgmath.h> (p: 335-337)
  • F.9.7.1 The fmod functions (p: 465)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.5.6.4 The fmod function

[編集] 関連項目

整数除算の商と余りを計算します
(関数) [edit]
浮動小数点除算の符号付きの余りを計算します
(関数) [edit]
(C99)(C99)(C99)
除算の下位3ビットと符号付きの余りを計算します
(関数) [edit]