命名空间
变体
操作

modf、modff、modfl

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常见数学函数
类型
(C99)(C99)    

(C99)(C99)    

函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小操作
(C99)
(C23)    
指数函数
(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)
(C99)
最接近整数的浮点运算
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
modf
(C23)(C23)
缩窄运算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
总排序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(C99)(C99)(C99)    
错误处理
(C99)    

 
定义在头文件 <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 中指定的任何错误的影响。

如果实现支持 IEEE 浮点运算(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("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);
 
    // special values
    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

[编辑] 参考文献

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

[编辑] 另请参阅

(C99)(C99)(C99)
舍入到最接近的整数,该整数的大小不超过给定值
(函数) [编辑]
C++ 文档 for modf