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)
宏常量
 
定义于头文件 <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)
计算除法运算的带符号余数,以及商的后三位
(函数) [编辑]
fmodC++ 文档