C 参考手册

位置:首页 > C 参考手册 >数值 >常用数学函数 > modf, modff, modfl

定义于头文件 <math.h>
float       modff( float arg, float* iptr );
(1) (C99 起)
double      modf( double arg, double* iptr );
(2)
long double modfl( long double arg, long double* iptr );
(3) (C99 起)
1-3) 分解给定的浮点值 arg 为整数和分数部分,每个都拥有与 arg 相同的类型和符号。(以浮点格式)存储整数部分于 iptr 所指向的对象。

参数

arg - 浮点值
iptr - 指向要存储整数部分的目标的浮点值的指针

返回值

若不出现错误,则返回与 x 相同符号的 x 小数部分。将整数部分放进 iptr 所指向的值。

返回值和存储于 *iptr 的值的和给出 arg (允许舍入)。

错误处理

此函数不受制于任何指定于 math_errhandling 的错误。

若实现支持 IEE 浮点算术( IEC 60559 ),则

  • arg 为 ±0 ,则返回 ±0 ,并存储 ±0 于 *iptr
  • arg 为 ±∞ ,则返回 ±0 ,并存储 ±∞ 于 *iptr
  • arg 为 NaN ,则返回 NaN ,并存储 NaN 于 *iptr
  • 返回值是准确的,忽略当前舍入模式

注意

此函数表现为如同实现如下:

double modf(double value, double *iptr)
{
#pragma STDC FENV_ACCESS ON
    int save_round = fegetround();
    fesetround(FE_TOWARDZERO);
    *iptr = std::nearbyint(value);
    fesetround(save_round);
    return copysign(isinf(value) ? 0.0 : value - (*iptr), value);
}

示例

#include <stdio.h>
#include <math.h>
#include <float.h>
 
int main(void)
{
    double f = 123.45;
    printf("Given the number %.2f or %a in hex,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() makes %.2f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() makes %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() make %f * %d^%d\n", f/scalbn(1.0, i), FLT_RADIX, i);
 
    // 特殊值
    f2 = modf(-0.0, &f3);
    printf("modf(-0) makes %.2f + %.2f\n", f3, f2);
    f2 = modf(-INFINITY, &f3);
    printf("modf(-Inf) makes %.2f + %.2f\n", f3, f2);
}

可能的输出:

Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123.00 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0.00 + -0.00
modf(-Inf) makes -INF + -0.00

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.12.6.12 The modf functions (p: 246-247)
  • F.10.3.12 The modf functions (p: 523)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.12.6.12 The modf functions (p: 227)
  • F.9.3.12 The modf functions (p: 460)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.5.4.6 The modf function

参阅

(C99)(C99)(C99)
取整到绝对值不大于给定值的最接近整数
(函数)