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

From cppreference.com
< cpp‎ | numeric‎ | math

Defined in header `<cmath>` |  |
float copysign ( float x, float y ); float copysignf( float x, float y ); | (1) | (since C++11)
double copysign ( double x, double y ); | (2) | (since C++11)
long double copysign ( long double x, long double y ); long double copysignl( long double x, long double y ); | (3) | (since C++11)
Promoted copysign ( Arithmetic1 x, Arithmetic2 y ); | (4) | (since C++11)

1-3) Composes a floating point value with the magnitude of `x` and the sign of `y`.
4) A set of overloads or a function template for all combinations of arguments of arithmetic type not covered by (1-3). If any argument has integral type, it is cast to double. If any argument is long double, then the return type `Promoted` is also long double, otherwise the return type is always double.

### Parameters

x, y | - | floating point values

### Return value

If no errors occur, the floating point value with the magnitude of `x` and the sign of `y` is returned.

If `x` is NaN, then NaN with the sign of `y` is returned.

If `y` is -0, the result is only negative if the implementation supports the signed zero consistently in arithmetic operations.

### Error handling

This function is not subject to any errors specified in math_errhandling.

If the implementation supports IEEE floating-point arithmetic (IEC 60559),

- The returned value is exact (FE_INEXACT is never raised) and independent of the current rounding mode.

### Notes

`std::copysign` is the only portable way to manipulate the sign of a NaN value (to examine the sign of a NaN, signbit may also be used)

### Example

Run this code

    #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';
    }

Output:

    copysign(1.0,+2.0) = 1
    copysign(1.0,-2.0) = -1
    copysign(inf,-2.0) = -inf
    copysign(NaN,-2.0) = -nan

### See also

abs(float)fabsfabsffabsl (C++11)(C++11) | absolute value of a floating point value (|x|) (function)
signbit (C++11) | checks if the given number is negative (function)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/numeric/math/copysign&oldid=108291"