std:: modf, std:: modff, std:: modfl
|
定义于头文件
<cmath>
|
||
| (1) | ||
|
float
modf
(
float
num,
float
*
iptr
)
;
double
modf
(
double
num,
double
*
iptr
)
;
|
(C++23 前) | |
|
constexpr
/* floating-point-type */
modf
(
/* floating-point-type */
num,
|
(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) |
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
|
|