名稱空間
變體
操作

fmod, fmodf, fmodl

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
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)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(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 的浮點餘數精確值為 x - n * y,其中 nx / y 的小數部分被截斷後的值。

返回值的符號與 x 相同,並且其絕對值小於或等於 y

目錄

[編輯] 引數

x, y - 浮點值

[編輯] 返回值

如果成功,返回如上定義的除法 x / y 的浮點餘數。

如果發生域錯誤,則返回實現定義的值 (支援 NaN 時返回 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 的範圍。

fmoddouble 版本行為如同以下實現:

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 fmod 函式 (p: TBD)
  • 7.25 型別通用數學 <tgmath.h> (p: TBD)
  • F.10.7.1 fmod 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.12.10.1 fmod 函式 (p: 185)
  • 7.25 泛型數學 <tgmath.h> (p: 274-275)
  • F.10.7.1 fmod 函式 (p: 385)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.12.10.1 fmod 函式 (p: 254)
  • 7.25 型別通用數學 <tgmath.h> (p: 373-375)
  • F.10.7.1 fmod 函式 (p: 528)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.12.10.1 fmod 函式 (p: 235)
  • 7.22 型別通用數學 <tgmath.h> (p: 335-337)
  • F.9.7.1 fmod 函式 (p: 465)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.5.6.4 fmod 函式

[編輯] 另請參閱

計算整數除法的商和餘數
(函式) [編輯]
計算浮點除法運算的帶符號餘數
(函式) [編輯]
(C99)(C99)(C99)
計算帶符號餘數以及除法運算的最後三位
(函式) [編輯]
C++ 文件 關於 fmod