最終更新日時:
が更新

履歴 編集

function
<cmath>

std::copysign(C++11)

namespace std {
  double copysign(double x, double y);
  float copysign(float x, float y);
  long double copysign(long double x, long double y);

  Integral copysign(Integral x, Integral y);
}

概要

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

戻り値

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

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

備考

符号付きゼロを表現するが負のゼロを取り扱わない実装では、この関数はゼロを正と見なす。

#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

処理系