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>
template < class V0, class V1 >

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

copysign ( const V0 & v_mag, const V1 & v_sgn ) ;
(S) (C++26から)
定義先ヘッダ <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 に対して要素ごとの std::copysign を実行します。
(定義については math-common-simd-t を参照)
(C++26以降)
A) すべての整数型に対して追加のオーバーロードが提供されており、これらは double として扱われます。
(since C++11)

目次

パラメータ

mag, sgn - 浮動小数点または整数値

戻り値

エラーが発生しない場合、 mag の絶対値と sgn の符号を持つ浮動小数点値が返されます。

mag がNaNの場合、 sgn の符号を持つNaNが返されます。

sgn が -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)
指定された数値が負かどうかをチェックする
(関数)