跳到主要内容

Modf

定义于头文件 <cmath> 中。

描述

将给定浮点值 num 分解为整数部分和小数部分,每个部分都具有与 num 相同的类型和符号。整数部分(浮点格式)存储在 iptr 指向的对象中。
库为所有不带 cv 限定符的浮点类型提供了 std::modf 的重载,作为参数 num 的类型和 iptr 指向的类型。 (自 C++23 起).
附加重载为所有整数类型提供,它们被视为 double (自 C++11 起).

声明

// 1)
constexpr /* floating-point-type */
modf ( /* floating-point-type */ num,
/* floating-point-type */* iptr );
// 2)
constexpr float modff( float num, float* iptr );
// 3)
constexpr long double modfl( long double num, long double* iptr );
附加重载
// 4)
template< class Integer >
double modf ( Integer num, double* iptr );

参数

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

返回值

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

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

错误处理

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

如果实现支持 IEEE 浮点运算(IEC 60559

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

备注

此函数的行为仿佛按以下方式实现:

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);
}

额外的重载不需要完全按照额外重载提供。它们只需要足以确保对于其整数类型的参数 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
<< "Given the number " << f << " or "
<< std::hexfloat << f << std::defaultfloat
<< " in hex,\n";

double f3;
double f2 = std::modf(f, &f3);
std::cout
<< "modf() makes "
<< f3 << " + " << f2
<< '\n';

int i;
f2 = std::frexp(f, &i);
std::cout
<< "frexp() makes "
<< f2 << " * 2^" << i
<< '\n';

i = std::ilogb(f);
std::cout
<< "logb()/ilogb() make "
<< f / std::scalbn(1.0, i) << " * "
<< std::numeric_limits<double>::radix
<< "^" << std::ilogb(f) << '\n';

// special values
f2 = std::modf(-0.0, &f3);
std::cout
<< "modf(-0) makes "
<< f3 << " + " << f2
<< '\n';
f2 = std::modf(-INFINITY, &f3);
std::cout
<< "modf(-Inf) makes "
<< f3 << " + " << f2
<< '\n';
}
可能结果
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0 + -0
modf(-Inf) makes -INF + -0

Modf

定义于头文件 <cmath> 中。

描述

将给定浮点值 num 分解为整数部分和小数部分,每个部分都具有与 num 相同的类型和符号。整数部分(浮点格式)存储在 iptr 指向的对象中。
库为所有不带 cv 限定符的浮点类型提供了 std::modf 的重载,作为参数 num 的类型和 iptr 指向的类型。 (自 C++23 起).
附加重载为所有整数类型提供,它们被视为 double (自 C++11 起).

声明

// 1)
constexpr /* floating-point-type */
modf ( /* floating-point-type */ num,
/* floating-point-type */* iptr );
// 2)
constexpr float modff( float num, float* iptr );
// 3)
constexpr long double modfl( long double num, long double* iptr );
附加重载
// 4)
template< class Integer >
double modf ( Integer num, double* iptr );

参数

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

返回值

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

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

错误处理

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

如果实现支持 IEEE 浮点运算(IEC 60559

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

备注

此函数的行为仿佛按以下方式实现:

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);
}

额外的重载不需要完全按照额外重载提供。它们只需要足以确保对于其整数类型的参数 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
<< "Given the number " << f << " or "
<< std::hexfloat << f << std::defaultfloat
<< " in hex,\n";

double f3;
double f2 = std::modf(f, &f3);
std::cout
<< "modf() makes "
<< f3 << " + " << f2
<< '\n';

int i;
f2 = std::frexp(f, &i);
std::cout
<< "frexp() makes "
<< f2 << " * 2^" << i
<< '\n';

i = std::ilogb(f);
std::cout
<< "logb()/ilogb() make "
<< f / std::scalbn(1.0, i) << " * "
<< std::numeric_limits<double>::radix
<< "^" << std::ilogb(f) << '\n';

// special values
f2 = std::modf(-0.0, &f3);
std::cout
<< "modf(-0) makes "
<< f3 << " + " << f2
<< '\n';
f2 = std::modf(-INFINITY, &f3);
std::cout
<< "modf(-Inf) makes "
<< f3 << " + " << f2
<< '\n';
}
可能结果
Given the number 123.45 or 0x1.edccccccccccdp+6 in hex,
modf() makes 123 + 0.45
frexp() makes 0.964453 * 2^7
logb()/ilogb() make 1.92891 * 2^6
modf(-0) makes -0 + -0
modf(-Inf) makes -INF + -0