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

< cpp‎ | numeric‎ | math

定义于头文件 `<cmath>` |  |
float copysign ( float x, float y ); float copysignf( float x, float y ); | (1) | (C++11 起)
double copysign ( double x, double y ); | (2) | (C++11 起)
long double copysign ( long double x, long double y ); long double copysignl( long double x, long double y ); | (3) | (C++11 起)
Promoted copysign ( Arithmetic1 x, Arithmetic2 y ); | (4) | (C++11 起)

1-3) 以 `x` 的模和 `y` 的符号组成浮点值。
4) 重载集或函数模板，用于所有 (1-3) 所不覆盖的算术类型参数组合。若任何参数拥有整数类型，则将它转型到 double 。若任何参数为 long double ，则返回类型 `Promoted` 亦为 long double ， 否则返回类型始终是 double 。

### 参数

x, y | - | 浮点值

### 返回值

若无错误发生，则返回以 `x` 的模与 `y` 的符号组成的浮点值。

若 `x` 为 NaN ，则返回带 `y` 符号的 NaN 。

若 `y` 为 -0 ，则仅若实现支持与算术运算一致的有符号零，结果才为负。

### 错误处理

此函数不受制于任何指定于 math_errhandling 的错误

若实现支持 IEEE 浮点算术（ IEC 60559 ），则

- 返回值是准确的（决不引发 FE_INEXACT ）且独立于当前舍入模式。

### 注意

`std::copysign` 是操作 NaN 值符号的唯一可移植方式（ signbit 亦可用于检验 NaN 的符号）

### 示例

    #include <iostream>
    #include <cmath>

    int main(void)
    {
        std::cout << "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

### 参阅

abs(float)fabs fabsf fabsl (C++11)(C++11) | 浮点值的绝对值（ \(\small{|x|}\)|x| ） (函数)
signbit (C++11) | 检查给定数是否为负 (函数)