modf, modff, modfl

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
(C99)
(C99)
(C99)
(C99)(C99)(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)
类型
宏常量
 
在标头 <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 标准(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)
取整到绝对值不大于给定值的最接近整数
(函数)