最終更新日時(UTC):
が更新

履歴 編集

function
<cmath>

std::copysign(C++11)

namespace std {
  float
    copysign(float x,
             float y);               // (1) C++11からC++20まで
  double
    copysign(double x,
             double y);              // (2) C++11からC++20まで
  long double
    copysign(long double x,
             long double y);         // (3) C++11からC++20まで

  constexpr floating-point-type
    copysign(floating-point-type x,
             floating-point-type y); // (4) C++23

  Integral
    copysign(Integral x
             Integral y);            // (5) C++11
  constexpr Integral
    copysign(Integral x
             Integral y);            // (5) C++23

  float
    copysignf(float x,
              float y);              // (6) C++17
  constexpr float
    copysignf(float x,
              float y);              // (6) C++23

  long double
    copysignl(long double x,
              long double y);        // (7) C++17
  constexpr long double
    copysignl(long double x,
              long double y);        // (7) C++23
}

概要

xの絶対値にyの符号が付いた値を生成する。

  • (1) : floatに対するオーバーロード
  • (2) : doubleに対するオーバーロード
  • (3) : long doubleに対するオーバーロード
  • (4) : 浮動小数点数型に対するオーバーロード
  • (5) : 整数型に対するオーバーロード (doubleにキャストして計算される)
  • (6) : float型規定
  • (7) : long double型規定

戻り値

xの絶対値にyの符号が付いた値を返す。

xの値がNaNである場合、yの符号が付いたNaNを返す。

備考

  • 符号付きゼロを表現するが負のゼロを取り扱わない実装では、この関数はゼロを正と見なす。
  • C++23では、(1)、(2)、(3)が(4)に統合され、拡張浮動小数点数型を含む浮動小数点数型へのオーバーロードとして定義された

#include <iostream>
#include <cmath>

int main()
{
  float result1 = std::copysign(1.0f, 2.0f);
  float result2 = std::copysign(1.0f, -2.0f);

  std::cout << result1 << std::endl;
  std::cout << result2 << std::endl;
}

出力

1
-1

備考

特定の環境では、早期に constexpr 対応されている場合がある:

  • GCC 4.6.1 以上

実装例

namespace std {
  float copysign(float x, float y)
  {
    float absolute_value = std::isnan(x) ?
                           std::numeric_limits<float>::quiet_NaN() :
                           std::abs(x);
    return y >= 0 ? absolute_value : -absolute_value;
  }

  double copysign(double x, double y)
  {
    double absolute_value = std::isnan(x) ?
                            std::numeric_limits<double>::quiet_NaN() :
                            std::abs(x);
    return y >= 0 ? absolute_value : -absolute_value;
  }

  long double copysign(long double x, long double y)
  {
    long double absolute_value = std::isnan(x) ?
                                 std::numeric_limits<long double>::quiet_NaN() :
                                 std::abs(x);
    return y >= 0 ? absolute_value : -absolute_value;
  }
}

バージョン

言語

  • C++11

処理系

参照