名前空間
変種
操作

fmod, fmodf, fmodl

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
fmod
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
(C99)(C23)
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
高速演算インジケータ
 
ヘッダー <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 の浮動小数点剰余は、正確には n を小数部分を切り捨てた x / y とすると、x - n * 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) は範囲 [-0.065535.0] にあり、これは unsigned short に対応しますが、remainder(rint(x), 65536.0) は範囲 [-32767.0+32768.0] にあり、これは signed short の範囲外です。

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

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 <fenv.h>
#include <math.h>
#include <stdio.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

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.12.10.1 The fmod functions (p: TBD)
  • 7.25 Type-generic math <tgmath.h> (p: TBD)
  • F.10.7.1 The fmod functions (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.12.10.1 The fmod functions (p: 185)
  • 7.25 Type-generic math <tgmath.h> (p: 274-275)
  • F.10.7.1 The fmod functions (p: 385)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.12.10.1 The fmod functions (p: 254)
  • 7.25 型総称数学関数 <tgmath.h> (p: 373-375)
  • F.10.7.1 The fmod functions (p: 528)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.12.10.1 The fmod functions (p: 235)
  • 7.22 型総称数学関数 <tgmath.h> (p: 335-337)
  • F.9.7.1 The fmod functions (p: 465)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.5.6.4 The fmod function

[編集] 関連項目

整数の除算における商と剰余を計算する
(関数) [編集]
浮動小数点除算演算の符号付き余りを計算する
(関数) [編集]
(C99)(C99)(C99)
符号付き余りおよび除算演算の最後の3ビットを計算する
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)