copysign, copysignf, copysignl - cppreference.com (original) (raw)

Defined in header <math.h>
float copysignf( float x, float y ); (1) (since C99)
double copysign( double x, double y ); (2) (since C99)
long double copysignl( long double x, long double y ); (3) (since C99)
Defined in header <tgmath.h>
#define copysign(x, y) (4) (since C99)

1-3) Composes a floating-point value with the magnitude of x and the sign of y.

  1. Type-generic macro: If any argument has type long double, copysignl is called. Otherwise, if any argument has integer type or has type double, copysign is called. Otherwise, copysignf is called.

Contents

[edit] Parameters

x, y - floating-point values

[edit] 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.

[edit] Error handling

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

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

[edit] Notes

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).

[edit] Example

#include <math.h> #include <stdio.h>   int main(void) { printf("copysign(1.0,+2.0) = %+.1f\n", copysign(1.0,+2.0)); printf("copysign(1.0,-2.0) = %+.1f\n", copysign(1.0,-2.0)); printf("copysign(INFINITY,-2.0) = %f\n", copysign(INFINITY,-2.0)); printf("copysign(NAN,-2.0) = %f\n", copysign(NAN,-2.0)); }

Possible output:

copysign(1.0,+2.0) = +1.0 copysign(1.0,-2.0) = -1.0 copysign(INFINITY,-2.0) = -inf copysign(NAN,-2.0) = -nan

[edit] References

[edit] See also