Namespaces
Variants

std:: copysign, std:: copysignf, std:: copysignl

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)
(C++11) (C++11)
copysign
(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 copysign ( float mag, float sgn ) ;

double copysign ( double mag, double sgn ) ;

long double copysign ( long double mag, long double sgn ) ;
(C++23 이전)
constexpr /*floating-point-type*/

copysign ( /*floating-point-type*/ mag,

/*floating-point-type*/ sgn ) ;
(C++23 이후)
float copysignf ( float mag, float sgn ) ;
(2) (C++11 이후)
(C++23부터 constexpr)
long double copysignl ( long double mag, long double sgn ) ;
(3) (C++11 이후)
(C++23부터 constexpr)
SIMD 오버로드 (C++26 이후)
헤더 파일에 정의됨 <simd>
template < class V0, class V1 >

constexpr /*math-common-simd-t*/ < V0, V1 >

copysign ( const V0 & v_mag, const V1 & v_sgn ) ;
(S) (C++26 이후)
추가 오버로드 (C++11 이후)
헤더 파일에 정의됨 <cmath>
template < class Integer >
double copysign ( Integer mag, Integer sgn ) ;
(A) (C++23부터 constexpr)
1-3) mag 의 크기와 sgn 의 부호를 갖는 부동 소수점 값을 구성합니다. 라이브러리는 모든 cv-한정되지 않은 부동 소수점 타입에 대해 std::copysign 의 오버로드를 매개변수 타입으로 제공합니다. (C++23부터)
S) SIMD 오버로드는 v_mag v_sgn 에 대해 요소별(element-wise) std::copysign 연산을 수행합니다.
(정의는 math-common-simd-t 참조)
(C++26부터)
A) 모든 정수 타입에 대해 추가 오버로드가 제공되며, 이들은 double 로 처리됩니다.
(since C++11)

목차

매개변수

mag, sgn - 부동 소수점 또는 정수 값

반환값

오류가 발생하지 않으면, 크기가 mag 이고 부호가 sgn 인 부동 소수점 값이 반환됩니다.

만약 mag 가 NaN이면, sgn 의 부호를 가진 NaN이 반환됩니다.

만약 sgn 가 -0인 경우, 결과는 구현체가 산술 연산에서 부호 있는 0을 일관되게 지원하는 경우에만 음수가 됩니다.

오류 처리

이 함수는 math_errhandling 에 지정된 어떤 오류에도 영향을 받지 않습니다.

구현이 IEEE 부동 소수점 연산(IEC 60559)을 지원하는 경우,

참고 사항

std::copysign 는 NaN 값의 부호를 조작하는 유일한 이식 가능한 방법입니다 (NaN의 부호를 검사하려면 std::signbit 도 사용할 수 있습니다).

추가 오버로드는 반드시 (A) 와 정확히 동일하게 제공될 필요는 없습니다. 첫 번째 인수 num1 과 두 번째 인수 num2 에 대해 다음을 보장할 수 있을 만큼만 충분하면 됩니다:

  • num1 또는 num2 long double 타입을 가지는 경우, std :: copysign ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: copysign ( static_cast < long double > ( num1 ) ,
    static_cast < long double > ( num2 ) )
    .
  • 그렇지 않고 num1 및/또는 num2 double 또는 정수 타입을 가지는 경우, std :: copysign ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: copysign ( static_cast < double > ( num1 ) ,
    static_cast < double > ( num2 ) )
    .
  • 그렇지 않고 num1 또는 num2 float 타입을 가지는 경우, std :: copysign ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: copysign ( static_cast < float > ( num1 ) ,
    static_cast < float > ( num2 ) )
    .
(C++23 이전)

num1 num2 이 산술 타입을 가지는 경우, std :: copysign ( num1, num2 ) 는 다음 코드와 동일한 효과를 가집니다: std :: copysign ( static_cast < /*common-floating-point-type*/ > ( num1 ) ,
static_cast < /*common-floating-point-type*/ > ( num2 ) )
, 여기서 /*common-floating-point-type*/ num1 num2 의 타입들 사이에서 가장 높은 부동소수점 변환 순위 와 가장 높은 부동소수점 변환 하위 순위 를 가지는 부동소수점 타입이며, 정수 타입 인수들은 double 과 동일한 부동소수점 변환 순위를 가진 것으로 간주됩니다.

가장 높은 순위와 하위 순위를 가지는 부동소수점 타입이 존재하지 않는 경우, 오버로드 해결 은 제공된 오버로드들 중에서 사용 가능한 후보를 결과로 내지 않습니다.

(C++23 이후)

예제

#include <cmath>
#include <iostream>
int main()
{
    std::cout << std::showpos
              << "copysign(1.0,+2.0) = " << std::copysign(1.0, +2.0) << '\n'
              << "copysign(1.0,-2.0) = " << std::copysign(1.0, -2.0) << '\n'
              << "copysign(inf,-2.0) = " << std::copysign(INFINITY, -2.0) << '\n'
              << "copysign(NaN,-2.0) = " << std::copysign(NAN, -2.0) << '\n';
}

출력:

copysign(1.0,+2.0) = +1
copysign(1.0,-2.0) = -1
copysign(inf,-2.0) = -inf
copysign(NaN,-2.0) = -nan

참고 항목

부동 소수점 값의 절댓값 ( |x| )
(함수)
(C++11)
주어진 숫자가 음수인지 확인
(함수)
C documentation for copysign