modf, modff, modfl

< c‎ | numeric‎ | math
在标头 <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 - 指向要存储整数部分的目标的浮点值的指针

返回值

若不出现错误,则返回与 arg 相同符号的 arg 小数部分。将整数部分放进 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 <float.h>
#include <math.h>
#include <stdio.h>
 
int main(void)
{
    double f = 123.45;
    printf("给定数值 %.2f 十六进制为 %a,\n", f, f);
 
    double f3;
    double f2 = modf(f, &f3);
    printf("modf() 计算 %.2f + %.2f\n", f3, f2);
 
    int i;
    f2 = frexp(f, &i);
    printf("frexp() 计算 %f * 2^%d\n", f2, i);
 
    i = ilogb(f);
    printf("logb()/ilogb() 计算 %f * %d^%d\n", f / scalbn(1.0, i), FLT_RADIX, i);
 
    // 特殊值
    f2 = modf(-0.0, &f3);
    printf("modf(-0) 计算 %.2f + %.2f\n", f3, f2);
    f2 = modf(-INFINITY, &f3);
    printf("modf(-Inf) 计算 %.2f + %.2f\n", f3, f2);
}

可能的输出:

给定数值 123.45 十六进制为 0x1.edccccccccccdp+6,
modf() 计算 123.00 + 0.45
frexp() 计算 0.964453 * 2^7
logb()/ilogb() 计算 1.92891 * 2^6
modf(-0) 计算 -0.00 + -0.00
modf(-Inf) 计算 -INF + -0.00

引用

  • C23 标准(ISO/IEC 9899:2024):
  • 7.12.6.12 The modf functions (第 TBD 页)
  • F.10.3.12 The modf functions (第 TBD 页)
  • C17 标准(ISO/IEC 9899:2018):
  • 7.12.6.12 The modf functions (第 TBD 页)
  • F.10.3.12 The modf functions (第 TBD 页)
  • C11 标准(ISO/IEC 9899:2011):
  • 7.12.6.12 The modf functions (第 246-247 页)
  • F.10.3.12 The modf functions (第 523 页)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.12.6.12 The modf functions (第 227 页)
  • F.9.3.12 The modf functions (第 460 页)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.5.4.6 The modf function

参阅

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