命名空间
变体
操作

modf, modff, modfl

来自 cppreference.cn
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本操作
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大值/最小值操作
(C99)
(C99)
指数函数
(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)
(C23)(C23)(C23)(C23)
浮点操作
(C99)(C99)
(C99)(C23)
(C99)
modf
(C23)(C23)
窄化操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数
十进制重编码函数
总阶数和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
误差和伽马函数
(C99)
(C99)
(C99)
(C99)
类型
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
错误处理
快速操作指示符
 
定义于头文件 <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++ 文档 关于 modf