fmod, fmodf, fmodl

< 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 的准确值,其中 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.0 .. 65535.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 <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));
 
    // 特殊值
    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

引用

  • 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

参阅

计算整数除法的商和余数
(函数)
计算浮点除法运算的带符号余数
(函数)
(C99)(C99)(C99)
计算除法运算的带符号余数,以及商的后三位
(函数)