首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

std::modf

Defined in header <cmath>

?

?

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...
  • 返回的值是准确的,当前舍入模式被忽略

注记

该函数的实现方式如下:

二次

代码语言:javascript
复制
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);
}

二次

比较了不同的浮点分解函数。

二次

代码语言:javascript
复制
#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';
 
}

二次

可能的产出:

二次

代码语言:javascript
复制
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文件

代码语言:txt
复制
 ? cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com