Namespaces
Variants

std:: modf, std:: modff, std:: modfl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
modf
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
定义于头文件 <cmath>
(1)
float modf ( float num, float * iptr ) ;

double modf ( double num, double * iptr ) ;

long double modf ( long double num, long double * iptr ) ;
(C++23 前)
constexpr /* floating-point-type */

modf ( /* floating-point-type */ num,

/* floating-point-type */ * iptr ) ;
(C++23 起)
float modff ( float num, float * iptr ) ;
(2) (C++11 起)
(C++23 起 constexpr)
long double modfl ( long double num, long double * iptr ) ;
(3) (C++11 起)
(C++23 起 constexpr)
额外重载 (C++11 起)
定义于头文件 <cmath>
template < class Integer >
double modf ( Integer num, double * iptr ) ;
(A) (C++23 起 constexpr)
1-3) 将给定的浮点值 num 分解为整数部分和小数部分,各部分与 num 具有相同类型和符号。整数部分(以浮点格式)存储于 iptr 所指向的对象中。 标准库为所有无cv限定浮点类型提供了 std::modf 的重载,分别作为参数 num 的类型和 iptr 所指向的类型。 (since C++23)
A) 为所有整数类型提供了额外的重载,这些类型被视为 double
(since C++11)

目录

参数

num - 浮点数或整数值
iptr - 指向浮点数值的指针,用于存储整数部分

返回值

如果没有错误发生,返回与 num 同符号的小数部分。整数部分存入 iptr 所指向的值中。

返回值与存储在 * iptr 中的值之和等于 num (允许存在舍入误差)。

错误处理

此函数不受 math_errhandling 中指定的任何错误影响。

如果实现支持 IEEE 浮点算术 (IEC 60559),

  • 如果 num 为 ±0,则返回 ±0,并将 ±0 存储于 * iptr
  • 如果 num 为 ±∞,则返回 ±0,并将 ±∞ 存储于 * iptr
  • 如果 num 为 NaN,则返回 NaN,并将 NaN 存储于 * iptr
  • 返回值是精确的, 当前舍入模式 将被忽略。

注释

此函数的行为如同按以下方式实现:

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

额外的重载并不要求完全按照 (A) 的形式提供。只需确保对于整数类型的实参 num std :: modf ( num, iptr ) std :: modf ( static_cast < double > ( num ) , iptr ) 具有相同效果即可。

示例

比较不同的浮点数分解函数:

#include <cmath>
#include <iostream>
#include <limits>
int main()
{
    double f = 123.45;
    std::cout << "给定数值 " << f << " 或十六进制格式 " << std::hexfloat
              << f << std::defaultfloat << ",\n";
    double f3;
    double f2 = std::modf(f, &f3);
    std::cout << "modf() 生成 " << f3 << " + " << f2 << '\n';
    int i;
    f2 = std::frexp(f, &i);
    std::cout << "frexp() 生成 " << f2 << " * 2^" << i << '\n';
    i = std::ilogb(f);
    std::cout << "logb()/ilogb() 生成 " << f / std::scalbn(1.0, i) << " * "
              << std::numeric_limits<double>::radix
              << "^" << std::ilogb(f) << '\n';
    // 特殊值
    f2 = std::modf(-0.0, &f3);
    std::cout << "modf(-0) 生成 " << f3 << " + " << f2 << '\n';
    f2 = std::modf(-INFINITY, &f3);
    std::cout << "modf(-Inf) 生成 " << f3 << " + " << f2 << '\n';
}

可能的输出:

给定数值 123.45 或十六进制格式 0x1.edccccccccccdp+6,
modf() 生成 123 + 0.45
frexp() 生成 0.964453 * 2^7
logb()/ilogb() 生成 1.92891 * 2^6
modf(-0) 生成 -0 + -0
modf(-Inf) 生成 -INF + -0

参阅

(C++11) (C++11) (C++11)
不大于给定值绝对值的最近整数
(函数)
C 文档 for modf