Namespaces
Variants

std:: modf, std:: modff, std:: modfl

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
modf
(C++11) (C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
(C++11)
(C++11)
(C++11)
Macro constants
헤더에 정의됨 <cmath>
(1)
float modf ( float num, float * iptr ) ;

double modf ( double num, double * iptr ) ;

long double modf ( long double num, long double * iptr ) ;
(C++23 이전)
constexpr /* floating-point-type */

modf ( /* floating-point-type */ num,

/* floating-point-type */ * iptr ) ;
(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)
1-3) 주어진 부동 소수점 값 num 을 정수 부분과 소수 부분으로 분해하며, 각 부분은 num 과 동일한 타입과 부호를 가집니다. 정수 부분(부동 소수점 형식)은 iptr 이 가리키는 객체에 저장됩니다. 라이브러리는 std::modf 의 오버로드를 매개변수 num 의 타입과 iptr 이 가리키는 타입으로서 모든 cv-한정되지 않은 부동 소수점 타입에 대해 제공합니다. (C++23 이후)
A) 모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은 double 로 처리됩니다.
(since C++11)

목차

매개변수

num - 부동 소수점 또는 정수 값
iptr - 정수 부분을 저장할 부동 소수점 값에 대한 포인터

반환값

오류가 발생하지 않으면, num 과 동일한 부호를 가진 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 << "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

참고 항목

(C++11) (C++11) (C++11)
주어진 값의 크기보다 크지 않은 가장 가까운 정수
(함수)
C 문서 for modf