fmod, fmodf, fmodl

来自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)
(C23)(C23)(C23)(C23)
浮点数操作
(C99)(C99)
(C99)(C23)
(C99)
窄化运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量与量指数函数
十进制重编码函数
全序与载荷函数
分类
误差及伽马函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点数值
(C99)(C23)
参数与返回值
错误处理
快速运算指示
 
在标头 <math.h> 定义
float       fmodf(float x, float y );
(1) (C99 起)
double      fmod(double x, double y );
(2)
longdouble fmodl(longdouble x, longdouble y );
(3) (C99 起)
在标头 <tgmath.h> 定义
#define fmod( x, y )
(4) (C99 起)
1-3) 计算除法运算 x / y 的浮点数余数。
4) 泛型宏:若任何实参拥有 longdouble 类型则调用 fmodl。否则,若任何实参拥有整数类型或 double 类型则调用 fmod。否则调用 fmodf

此函数计算的除法 x / y 的浮点数余数是 x - n * y 的准确值,其中 n 是截断小数部分的 x / 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] 内,它对应 unsignedshort,但 remainder(rint(x), 65536.0) 在范围 [-32767.0+32768.0] 内,它在 signedshort 的范围外。

fmoddouble 版本表现为如同实现如下:

double fmod(double x, double y){#pragma STDC FENV_ACCESS ONdouble result =remainder(fabs(x), (y =fabs(y)));if(signbit(result)) result += y;returncopysign(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));   // 特殊值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));   // 错误处理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 (第 TBD 页)
  • 7.25 Type-generic math <tgmath.h> (第 TBD 页)
  • F.10.7.1 The fmod functions (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.12.10.1 The fmod functions (第 185 页)
  • 7.25 Type-generic math <tgmath.h> (第 274-275 页)
  • F.10.7.1 The fmod functions (第 385 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.12.10.1 The fmod functions (第 254 页)
  • 7.25 Type-generic math <tgmath.h> (第 373-375 页)
  • F.10.7.1 The fmod functions (第 528 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.12.10.1 The fmod functions (第 235 页)
  • 7.22 Type-generic math <tgmath.h> (第 335-337 页)
  • F.9.7.1 The fmod functions (第 465 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.5.6.4 The fmod function

[编辑]参阅

计算整数除法的商和余数
(函数)[编辑]
计算浮点数除法运算的带符号余数
(函数)[编辑]
(C99)(C99)(C99)
计算除法运算的带符号余数,以及商的后三位
(函数)[编辑]
fmod 的 C++ 文档
close