Skip to content

Latest commit

 

History

History
105 lines (82 loc) · 2.46 KB

File metadata and controls

105 lines (82 loc) · 2.46 KB

copysign

  • cmath[meta header]
  • std[meta namespace]
  • function[meta id-type]
  • cpp11[meta cpp]
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);

  float copysignf(float x, float y);                   // C++17 から
  long double copysignl(long double x, long double y); // C++17 から
}
  • Integral[italic]

概要

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;
}
  • std::copysign[color ff0000]

出力

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;
  }
}
  • std::abs[link abs.md]
  • std::isnan[link isnan.md]
  • std::numeric_limits[link /reference/limits/numeric_limits.md]
  • quiet_NaN()[link /reference/limits/numeric_limits/quiet_nan.md]

バージョン

言語

  • C++11

処理系