std::modf
STD::MODf
Defined in header | | |
---|---|---|
float modf( float x, float* iptr | (1) | |
double modf( double x, double* iptr | (2) | |
long double modf( long double x, long double* iptr | (3) | |
1-3%29分解给定的浮点值x
分为整数部分和分数部分,每个部分具有相同的类型和符号x
将浮点格式%29中的整部分%28存储在iptr
...
参数
x | - | floating point value |
---|---|---|
iptr | - | pointer to floating point value to store the integral part to |
返回值
如果没有发生错误,则返回x
有相同的标志x
...将整部分计算到以下值中:iptr
...
中存储的返回值和值之和。*iptr
施予x
%28允许舍入%29。
错误处理
中指定的任何错误均不受此函数的影响。数学[医]错误处理...
如果实现支持ieee浮点算法%28IEC 60559%29,
- 如果
x
是±0,±0是返回,±0存储在*iptr
...
- 如果
x
是±∞,±0是返回,±∞存储在*iptr
...
- 如果
x
是NaN,NaN是返回的,NaN存储在*iptr
...
- 返回的值是准确的,当前舍入模式被忽略
注记
该函数的实现方式如下:
二次
double modf(double x, double* iptr)
{
#pragma STDC FENV_ACCESS ON
int save_round = std::fegetround(
std::fesetround(FE_TOWARDZERO
*iptr = std::nearbyint(x
std::fesetround(save_round
return std::copysign(std::isinf(x) ? 0.0 : x - (*iptr), x
}
二次
例
比较了不同的浮点分解函数。
二次
#include <iostream>
#include <cmath>
#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
二次
另见
trunc (C++11) | nearest integer not greater in magnitude than the given value (function) |
---|
c MODEF文件
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。