modf、modff、modfl
来自 cppreference.com
定义在头文件 <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++ 文档 for modf
|