[section:sign_functions Sign Manipulation Functions]

[h4 Synopsis]

``
#include <boost/math/special_functions/sign.hpp>
``

   namespace boost{ namespace math{
   
   template<class T> 
   int signbit(T x);
   
   template <class T>
   int sign (const T& z);

   template <class T, class U>
   T copysign (const T& x, const U& y);

   template <class T>
   ``__sf_result`` changesign (const T& z);
   
   }} // namespaces

[h4 Description]

   template<class T> 
   int signbit(T x);

Returns a non-zero value if the sign bit is set in variable /x/, otherwise `0`.

[important The return value from this function is zero or /not-zero/ and [*not] zero or one.]
   
   template <class T>
   int sign (const T& z);
   
Returns `1` if /x/ `> 0`, `-1` if /x/ `< 0`, and `0` if /x/ is zero.

   template <class T, class U>
   ``__sf_result`` copysign (const T& x, const U& y);

Sets the sign of /x/ to be the same as the sign of /y/.

See [@http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf C99 7.12.11.1 The copysign functions]
for more detail.

   template <class T>
   T changesign (const T& z);

Returns a floating point number with a binary representation
where the signbit is the opposite of the sign bit in /x/,
and where the other bits are the same as in /x/.

This function is widely available, but not specified in any standards.

Rationale: Not specified by TR1, but `changesign(x)`
is both easier to read and more efficient than

  copysign(x, signbit(x) ? 1.0 : -1.0);

For finite values, this function has the same effect as simple negation,
the assignment z = -z, but for nonfinite values,
[@http://en.wikipedia.org/wiki/Infinity#Computing infinities]
and [@http://en.wikipedia.org/wiki/NaN NaNs],
the `changesign(x)` function may be the only portable way
to ensure that the sign bit is changed.

[h5 Sign bits]
One of the bits in the binary representation of a floating-point number gives the sign,
and the remaining bits give the absolute value.
That bit is known as the sign bit.
The sign bit is set = 1 for negative numbers, and is not set = 0 for positive numbers.
(This is true for all binary representations of floating point numbers
that are used by modern microprocessors.) 

[@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf C++ TR1]
specifies `copysign` functions and function templates for accessing the sign bit.

For user-defined types (UDT), the sign may be stored in some other way.
They may also not provide infinity or NaNs.
To use these functions with a UDT,
it may be necessary to explicitly specialize then for UDT type T.

[h5 Examples]

  signbit(3.5) is zero (or false)
  signbit(-7.1) is 1 (or true)
  copysign(4.2, 7.9) is 4.2
  copysign(3.5 -1.4) is -3.5
  copysign(-4.2, 1.0) is 4.2
  copysign(-8.6, -3.3) is -8.6
  changesign(6.9) is -6.9
  changesign(-1.8) is 1.8

[h5 Portability]

The library supports the following binary floating-point formats:

* IEEE 754 single precision
* IEEE 754 double precision
* IEEE 754 extended double precision with 15 exponent bits
* Intel extended double precision
* PowerPC extended double precision
* Motorola 68K extended double precision

The library does not support the VAX floating-point formats.
(These are available on VMS, but the default on VMS is the IEEE 754 floating-point format.)

The main portability issues are:

* Unsupported floating point formats
* The library depends on the header boost/detail/endian.hpp
* Code such as `#if defined(__ia64) || defined(__ia64__) || defined(_M_IA64)`
is used to determine the processor type.

The library has passed all tests on the following platforms:

* Win32 / MSVC 7.1 / 10.0 / x86
* Win32 / Intel C++ 7.1, 8.1, 9.1 / x86
* Mac OS X / GCC 3.3, 4.0 / ppc
* Linux / Intel C++ 9.1 / x86, ia64
* Linux / GCC 3.3 / x86, x64, ia64, ppc, hppa, mips, m68k
* Linux / GCC 3.4 / x64
* HP-UX / aCC, GCC 4.1 / ia64
* HP-UX / aCC / hppa
* Tru64 / Compaq C++ 7.1 / alpha
* VMS / HP C++ 7.1 / alpha     (in IEEE floating point mode)
* VMS / HP C++ 7.2 / ia64      (in IEEE floating point mode)

[endsect][/section:sign_functions Sign Manipulation Functions]
[/ 
  Copyright 2006 John Maddock and Paul A. Bristow 2011.
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or copy at
  http://www.boost.org/LICENSE_1_0.txt).
]

