______________________________________________________________________

  26   Numerics library                         [lib.numerics]

  ______________________________________________________________________

1 This clause describes components that C++ programs may use to  perform
  seminumerical operations.

2 The following subclauses describe components for complex number types,
  numeric ( n -at-a-time) arrays, generalized  numeric  algorithms,  and
  facilities included from the ISO C library, as summarized in Table 1:

                    Table 1--Numerics library summary

     +--------------------------------------------------------------+
     |                   Subclause                       Header(s)  |
     +--------------------------------------------------------------+
     |_lib.complex.numbers_ Complex numbers              <complex>  |
     +--------------------------------------------------------------+
     |_lib.numarray_ Numeric arrays                      <valarray> |
     +--------------------------------------------------------------+
     |_lib.numeric.ops_ Generalized numeric operations   <numeric>  |
     +--------------------------------------------------------------+
     |_lib.c.math_ C library                             <cmath>    |
     |                                                   <cstdlib>  |
     +--------------------------------------------------------------+

  26.1  Complex numbers                            [lib.complex.numbers]

  Header <complex> synopsis

  namespace std {
    template<class T> class complex;
    class complex<float>;
    class complex<double>;
    class complex<long double>;
    template<class T>
      complex<T> operator+(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator+(const complex<T>&, const T&);
    template<class T>
      complex<T> operator+(const T&, const complex<T>&);

    template<class T>
      complex<T> operator-(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator-(const complex<T>&, const T&);
    template<class T>
      complex<T> operator-(const T&, const complex<T>&);
    template<class T>
      complex<T> operator*(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator*(const complex<T>&, const T&);
    template<class T>
      complex<T> operator*(const T&, const complex<T>&);
    template<class T>
      complex<T> operator/(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator/(const complex<T>&, const T>&);
    template<class T>
      complex<T> operator/(const T&, const complex<T>&);
    template<class T>
      complex<T> operator+(const complex<T>&);
    template<class T>
      complex<T> operator-(const complex<T>&);
    template<class T>
      complex<T> operator==(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator==(const complex<T>&, const T&);
    template<class T>
      complex<T> operator==(const T&, const complex<T>&);
    template<class T>
      complex<T> operator!=(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator!=(const complex<T>&, const T&);
    template<class T>
      complex<T> operator!=(const T&, const complex<T>&);
    template<class T>
      istream& operator>>(istream&, complex<T>&);
    template<class T>
      ostream& operator<<(ostream&, const complex<T>&);
    template<class T>
      T abs(const complex<T>&);
    template<class T>
      T norm(const complex<T>&);
    template<class T>
      T arg(const complex<T>&);
    template<class T>
      T real(const complex<T>&);
    template<class T>
      T imag(const complex<T>&);

    template<class T>
      complex<T> conj(const complex<T>&);
    template<class T>
      complex<T> cos(const complex<T>&);
    template<class T>
      complex<T> cosh(const complex<T>&);
    template<class T>
      complex<T> exp(const complex<T>&);
    template<class T>
      complex<T> log(const complex<T>&);
    template<class T>
      complex<T> sin(const complex<T>&);
    template<class T>
      complex<T> sinh(const complex<T>&);
    template<class T>
      complex<T> sqrt(const complex<T>&);
    template<class T>
      complex<T> pow(const complex<T>&, int);
    template<class T>
      complex<T> pow(const complex<T>&, const T&);
    template<class T>
      complex<T> pow(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> pow(const T&, const complex<T>&);
    template<class T>
      complex<T> polar(const T&, const T&);
  }

1 The header <complex> defines a three types, and numerous functions for
  representing and manipulating complex numbers.

  26.1.1  Complex numbers types                      [lib.complex.types]

  26.1.1.1  Template class complex                         [lib.complex]
  namespace std {
    template<class T>
    class complex {
    public:
      complex();
      complex(const T& re);
      complex(const T& re, const T& im);

      T real() const;
      T imag() const;
      template<class X> complex(const complex<X>&);
      template<class X> complex<T>& operator= (const complex<X>&);
      template<class X> complex<T>& operator+=(const complex<X>&);
      template<class X> complex<T>& operator-=(const complex<X>&);
      template<class X> complex<T>& operator*=(const complex<X>&);
      template<class X> complex<T>& operator/=(const complex<X>&);
    };

    class complex<float> {
    public:
      complex(float re = 0.0f, float im = 0.0f);
      explicit complex(const complex<double>&);
      explicit complex(const complex<long double>&);
      float real() const;
      float imag() const;
      template<class X> complex(const complex<X>&);
      template<class X> complex<float>& operator= (const complex<X>&);
      template<class X> complex<float>& operator+=(const complex<X>&);
      template<class X> complex<float>& operator-=(const complex<X>&);
      template<class X> complex<float>& operator*=(const complex<X>&);
      template<class X> complex<float>& operator/=(const complex<X>&);
    };
    class complex<double> {
    public:
      complex(double re = 0.0, double im = 0.0);
      complex(const complex<float>&);
      explicit complex(const complex<long double>&);
      double real() const;
      double imag() const;
      template<class X> complex(const complex<X>&);
      template<class X> complex<double>& operator= (const complex<X>&);
      template<class X> complex<double>& operator+=(const complex<X>&);
      template<class X> complex<double>& operator-=(const complex<X>&);
      template<class X> complex<double>& operator*=(const complex<X>&);
      template<class X> complex<double>& operator/=(const complex<X>&);
    };
    class complex<long double> {
    public:
      complex(long double re = 0.0L, long double im = 0.0L);
      complex(const complex<float>&);
      complex(const complex<double>&);
      long double real() const;
      long double imag() const;
      template<class X> complex(const complex<X>&);
      template<class X> complex<long double>& operator= (const complex<X>&);
      template<class X> complex<long double>& operator+=(const complex<X>&);
      template<class X> complex<long double>& operator-=(const complex<X>&);
      template<class X> complex<long double>& operator*=(const complex<X>&);
      template<class X> complex<long double>& operator/=(const complex<X>&);
    };
    template<class T>
      complex<T> operator+(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator+(const complex<T>&, const T&);
    template<class T>
      complex<T> operator+(const T&, const complex<T>&);

    template<class T>
      complex<T> operator-(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator-(const complex<T>&, const T&);
    template<class T>
      complex<T> operator-(const T&, const complex<T>&);
    template<class T>
      complex<T> operator*(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator*(const complex<T>&, const T&);
    template<class T>
      complex<T> operator*(const T&, const complex<T>&);
    template<class T>
      complex<T> operator/(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator/(const complex<T>&, const T>&);
    template<class T>
      complex<T> operator/(const T&, const complex<T>&);
    template<class T>
      complex<T> operator+(const complex<T>&);
    template<class T>
      complex<T> operator-(const complex<T>&);
    template<class T>
      complex<T> operator==(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator==(const complex<T>&, const T&);
    template<class T>
      complex<T> operator==(const T&, const complex<T>&);
    template<class T>
      complex<T> operator!=(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> operator!=(const complex<T>&, const T&);
    template<class T>
      complex<T> operator!=(const T&, const complex<T>&);
    template<class T>
      istream& operator>>(istream&, complex<T>&);
    template<class T>
      ostream& operator<<(ostream&, const complex<T>&);
    template<class T>
      T abs(const complex<T>&);
    template<class T>
      T norm(const complex<T>&);
    template<class T>
      T arg(const complex<T>&);
    template<class T>
      T real(const complex<T>&);
    template<class T>
      T imag(const complex<T>&);

    template<class T>
      complex<T> conj(const complex<T>&);
    template<class T>
      complex<T> cos(const complex<T>&);
    template<class T>
      complex<T> cosh(const complex<T>&);
    template<class T>
      complex<T> exp(const complex<T>&);
    template<class T>
      complex<T> log(const complex<T>&);
    template<class T>
      complex<T> sin(const complex<T>&);
    template<class T>
      complex<T> sinh(const complex<T>&);
    template<class T>
      complex<T> sqrt(const complex<T>&);
    template<class T>
      complex<T> pow(const complex<T>&, int);
    template<class T>
      complex<T> pow(const complex<T>&, const T&);
    template<class T>
      complex<T> pow(const complex<T>&, const complex<T>&);
    template<class T>
      complex<T> pow(const T&, const complex<T>&);
    template<class T>
      complex<T> polar(const T&, const T&);
  }

1 The class complex describes an object that  can  store  the  Cartesian
  components, real() and imag(), of a complex number.

  26.1.1.1.1  complex constructor                     [lib.complex.cons]

  template<class T>
    complex(const T& re = T(), const T& im = T());

  Effects:
    Constructs an object of class complex.

1 Postcondition: real() == re  && imag() == im.

  26.1.1.1.2  operator+=                              [lib.complex.op+=]

  template<class T>
    complex<T>& operator+=(const complex<T>& rhs);

  Effects:
    Adds the complex value rhs to the complex value *this and stores the
    sum in *this.
  Returns:
    *this.

  26.1.1.1.3  operator-=                              [lib.complex.op-=]

  template<class T>
    complex<T>& operator-=(const complex<T>& rhs);

  Effects:
    Subtracts the complex value rhs from the  complex  value  *this  and
    stores the difference in *this.
  Returns:
    *this.

  26.1.1.1.4  operator*=                              [lib.complex.op*=]

  template<class T>
    complex<T>& operator*=(const complex<T>& rhs);

  Effects:
    Multiplies  the  complex  value  rhs  by the complex value *this and
    stores the product in *this.
  Returns:
    *this.

  26.1.1.1.5  operator/=                              [lib.complex.op/=]

  template<class T>
    complex<T>& operator/=(const complex<T>& rhs);

  Effects:
    Divides the complex value rhs  into  the  complex  value  *this  and
    stores the quotient in *this.
  Returns:
    *this.

  26.1.1.2  complex operations                         [lib.complex.ops]

  26.1.1.2.1  operator+                                  [lib.op+.fc.fc]

  template<class T>
    complex<T> operator+(const complex<T>& lhs);

  Returns:
    complex<T>(lhs).

    template<class T>
      complex<T> operator+(const complex<T>& lhs, const complex<T>& rhs);
    template<class T>
      complex<T> operator+(const complex<T>& lhs, const T& rhs);
    template<class T>
      complex<T> operator+(const T& lhs, const complex<T>& rhs);

  Returns:
    complex<T>(lhs) += rhs.

  26.1.1.2.2  operator-                                  [lib.op-.fc.fc]

  template<class T>
    complex<T> operator-(const complex<T>& lhs);

  Returns:
    complex<T>(-lhs.real(),-lhs.imag()).

    template<class T>
      complex<T> operator-(const complex<T>& lhs, const complex<T>& rhs);
    template<class T>
      complex<T> operator-(const complex<T>& lhs, const T& rhs);
    template<class T>
      complex<T> operator-(const T& lhs, const complex<T>& rhs);

  Returns:
    complex<T>(lhs) -= rhs.

  26.1.1.2.3  operator*                                  [lib.op*.fc.fc]

  template<class T>
    complex<T> operator*(const complex<T>& lhs, const complex<T>& rhs);
  template<class T>
    complex<T> operator*(const complex<T>& lhs, const t7 rhs);
  template<class T>
    complex<T> operator*(const T& lhs, const complex<T>& rhs);

  Returns:
    complex<T>(lhs) *= rhs.

  26.1.1.2.4  operator/                                  [lib.op/.fc.fc]

  template<class T>
    complex<T> operator/(const complex<T>& lhs, const complex<T>& rhs);
  template<class T>
    complex<T> operator/(const complex<T>& lhs, const T& rhs);
  template<class T>
    complex<T> operator/(const T& lhs, const complex<T>& rhs);

  Returns:
    complex<T>(lhs) /= rhs.

  26.1.1.2.5  operator==                                [lib.op==.fc.fc]

  template<class T>
    bool operator==(const complex<T>& lhs, const complex<T>& >rhs);
  template<class T>
    bool operator==(const complex<T>& lhs, const T& rhs);
  template<class T>
    bool operator==(const T& lhs, const complex<T>& rhs);

  Returns:
    lhs.real() == rhs.real() && lhs.imag() == rhs.imag().1)
  _________________________

  26.1.1.2.6  operator!=                                [lib.op!=.fc.fc]

  template<class T>
    bool operator!=(complex lhs, complex rhs);
  template<class T>
    bool operator!=(complex lhs, float rhs);
  template<class T>
    bool operator!=(float lhs, complex rhs);

  Returns:
    lhs.real() != rhs.real() || lhs.imag() != rhs.imag().2)

  26.1.1.2.7  operator>>                                    [lib.ext.fc]

  template<class T>
    istream& operator>>(istream& is, complex<T>& x);

  Effects:
    Evaluates the expression:

    is >> ch && ch == '('
    && is >> re >> ch && ch == ','
    && is >> im >> ch && ch == ')';

1 where  ch  is an object of type char and re and im are objects of type
  float.  If the result is nonzero, the function assigns complex(re, im)
  to x.
  Returns:
    is.

  26.1.1.2.8  operator<<                                    [lib.ins.fc]

  template<class T>
    ostream& operator<<(ostream& os, complex x);

  Returns:
    os << '(' << x.real() << ',' << x.imag() << ')'.

  26.1.1.2.9  exp                                      [lib.complex.exp]

  template<class T>
    complex<T> exp(const complex<T>& x);

  Returns:
    the exponential of x.

  _________________________
  1)  The  imaginary part is assumed to be T(), or 0.0, for the const T&
  arguments.
  2) The imaginary part is assumed to be T(), or 0.0, for the  const  T&
  arguments.

  26.1.1.3  imag                                      [lib.complex.imag]

  template<class T>
    T imag(const complex<T>& x);

  Returns:
    x .imag().

  26.1.1.4  log                                        [lib.complex.log]

  template<class T>
    complex<T> log(const complex<T>& x);

  Returns:
    the logarithm of x.

  26.1.1.5  norm                                      [lib.complex.norm]

  template<class T>
    T norm(const complex<T>& x);

  Returns:
    the squared magnitude of x.

  26.1.1.6  polar                                    [lib.complex.polar]

  template<class T>
    complex<T> polar(const T& rho, const t& theta);

  Returns:
    the  complex value corresponding to a complex number whose magnitude
    is rho and whose phase angle is theta.

  26.1.1.7  pow                                        [lib.complex.pow]

  template<class T>
    complex<T> pow(const complex<T>& x, const complex<T>& y);
  template<class T>
    complex<T> pow(const complex<T>& x, const t& y);
  template<class T>
    complex<T> pow(const complex<T>& x, int y);
  template<class T>
    complex<T> pow(const T& x, const complex<T>& y);

  Returns:
    x raised to the power y.

  26.1.1.8  real                                      [lib.complex.real]

  template<class T>
    T real(const complex<T>& x);

  Returns:
    x .real().

  26.1.1.9  sin                                        [lib.complex.sin]

  template<class T>
    complex<T> sin(const complex<T>& x);

  Returns:
    the sine of x.

  26.1.1.10  sinh                                     [lib.complex.sinh]

  template<class T>
    complex<T> sinh(const complex<T>& x);

  Returns:
    the hyperbolic sine of x.

  26.1.1.11  sqrt                                             [lib.sqrt]

  template<class T>
    complex<T> sqrt(const complex<T>& x);

  Returns:
    the square root of x.

  26.2  Numeric arrays                                    [lib.numarray]

  Header <valarray> synopsis

  namespace std {
    template<class T> class valarray;       // An array of type T
    class slice;                            // a BLAS-like slice out of an array
    template<class T> class slice_array;
    class gslice;                           // a generalized slice out of an array
    template<class T> class gslice_array;
    template<class T> class mask_array;     // a masked array
    template<class T> class indirect_array; // an indirected array

    template<class T> const valarray<T> operator* (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator* (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator/ (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator/ (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator% (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator% (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator+ (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator+ (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator- (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator- (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator^ (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator^ (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator& (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator& (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator| (const valarray<T>&, const T&);
    template<class T> const valarray<T> operator| (const T&, const valarray<T>&);
    template<class T> const valarray<T> operator<<(const valarray<T>&, const T&);
    template<class T> const valarray<T> operator<<(const T&, const valarray<T>&);
    template<class T> const valarray<T> operator>>(const valarray<T>&, const T&);
    template<class T> const valarray<T> operator>>(const T&, const valarray<T>&);
    template<class T> const valarray<T> operator&&(const valarray<T>&, const T&);
    template<class T> const valarray<T> operator&&(const T&, const valarray<T>&);
    template<class T> const valarray<T> operator||(const valarray<T>&, const T&);
    template<class T> const valarray<T> operator||(const T&, const valarray<T>&);
    template<class T> const valarray<T> operator* (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator/ (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator% (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator+ (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator- (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator^ (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator| (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator& (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator<<(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator>>(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator&&(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> operator||(const valarray<T>&, const valarray<T>&);

    template<class T> const valarray<bool> operator==(const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator==(const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator==(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<bool> operator!=(const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator!=(const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator!=(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<bool> operator< (const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator< (const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator< (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<bool> operator> (const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator> (const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator> (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<bool> operator<=(const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator<=(const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator<=(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<bool> operator>=(const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator>=(const valarray<T>&, const T&);
    template<class T> const valarray<bool> operator>=(const T&, const valarray<T>&);
    template<class T> const valarray<bool> operator>=(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> abs  (const valarray<T>&);
    template<class T> const valarray<T> acos (const valarray<T>&);
    template<class T> const valarray<T> asin (const valarray<T>&);
    template<class T> const valarray<T> atan (const valarray<T>&);
    template<class T> const valarray<T> atan2(const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> atan2(const valarray<T>&, const T&);
    template<class T> const valarray<T> atan2(const T&, const valarray<T>&);
    template<class T> const valarray<T> cos  (const valarray<T>&);
    template<class T> const valarray<T> cosh (const valarray<T>&);
    template<class T> const valarray<T> exp  (const valarray<T>&);
    template<class T> const valarray<T> log  (const valarray<T>&);
    template<class T> const valarray<T> log10(const valarray<T>&);
    template<class T> const valarray<T> pow  (const valarray<T>&, const valarray<T>&);
    template<class T> const valarray<T> pow  (const valarray<T>&, const T&);
    template<class T> const valarray<T> pow  (const T&, const valarray<T>&);
    template<class T> const valarray<T> sin  (const valarray<T>&);
    template<class T> const valarray<T> sinh (const valarray<T>&);
    template<class T> const valarray<T> sqrt (const valarray<T>&);
    template<class T> const valarray<T> tan  (const valarray<T>&);
    template<class T> const valarray<T> tanh (const valarray<T>&);
  }

1 The header  <valarray>  defines  five  template  classes  (  valarray,
  slice_array,   gslice_array,   mask_array,  and  indirect_array),  two
  classes ( slice and gslice), and a series of related  function  signa­
  tures for representing and manipulating arrays of values.3)

2 The valarray array classes are defined to be free of certain forms  of
  aliasing, thus allowing operations on these classes to be optimized.
  _________________________
  3)   If   any   of  the  names  valarray,  slice_array,  gslice_array,
  mask_array, indirect_array, slice or  gslice  are  introduced  into  a
  translation  unit  by any means other than inclusion of the <valarray>
  header file, the resulting behavior is undefined.

3 These  library functions are permitted to throw an bad_alloc exception
  if there are not sufficient resources available to carry out the oper­
  ation.  Note that the exception is not mandated.

  +-------                 BEGIN BOX 1                -------+
  The  descriptions  of valarray and the associated classes which follow
  lack any discussion of possible exceptions.
  +-------                  END BOX 1                 -------+

  26.2.1  Template class valarray<T>             [lib.template.valarray]
  namespace std {
    template<class T> class valarray {
    public:
      valarray();
      valarray(enum Uninitialized, size_t);
      valarray(const T&, size_t);
      valarray(const T*, size_t);
      valarray(const valarray&);
      valarray(const slice_array<T>&);
      valarray(const gslice_array<T>&);
      valarray(const mask_array<T>&);
      valarray(const indirect_array<T>&);
     ~valarray();
      valarray& operator=(const valarray&);
      valarray& operator=(const slice_array<T>&);
      valarray& operator=(const gslice_array<T>&);
      valarray& operator=(const mask_array<T>&);
      valarray& operator=(const indirect_array<T>&);
      size_t length() const;
      operator T*();
      operator const T*() const;
      const T           operator[](size_t);
      T&                operator[](size_t);
      const valarray    operator[](slice) const;
      slice_array<T>    operator[](slice);
      const valarray    operator[](const gslice&) const;
      gslice_array<T>   operator[](const gslice&);
      const valarray    operator[](const valarray<bool>&) const;
      mask_array<T>     operator[](const valarray<bool>&);
      const valarray    operator[](const valarray<int>&) const;
      indirect_array<T> operator[](const valarray<int>&);
      const valarray operator+() const;
      const valarray operator-() const;
      const valarray operator~() const;
      const valarray operator!() const;

      valarray<T>& operator*= (const T&);
      valarray<T>& operator/= (const T&);
      valarray<T>& operator%= (const T&);
      valarray<T>& operator+= (const T&);
      valarray<T>& operator-= (const T&);
      valarray<T>& operator^= (const T&);
      valarray<T>& operator&= (const T&);
      valarray<T>& operator|= (const T&);
      valarray<T>& operator<<=(const T&);
      valarray<T>& operator>>=(const T&);
      valarray<T>& operator*= (const valarray<T>& ab);
      valarray<T>& operator/= (const valarray<T>& ab);
      valarray<T>& operator%= (const valarray<T>& ab);
      valarray<T>& operator+= (const valarray<T>& ab);
      valarray<T>& operator-= (const valarray<T>& ab);
      valarray<T>& operator^= (const valarray<T>&);
      valarray<T>& operator|= (const valarray<T>&);
      valarray<T>& operator&= (const valarray<T>&);
      valarray<T>& operator<<=(const valarray<T>&);
      valarray<T>& operator>>=(const valarray<T>&);
      const T sum() const;
      void    fill(const T&);
      const T min() const;
      const T max() const;
      const valarray<T> shift(int) const;
      const valarray<T> apply(T func(T)) const;
      const valarray<T> apply(T func(const T&)) const;
      void free();
    };
  }

1 The template class valarray<T> is a one-dimensional smart array,  with
  elements  numbered  sequentially from zero.  It is a representation of
  the mathematical concept of an ordered set of values.  The illusion of
  higher  dimensionality  may  be produced by the familiar idiom of com­
  puted indices, together with the powerful subsetting capabilities pro­
  vided by the generalized subscript operators.4)

2 An  implementation  is  permitted  to  qualify  any  of  the functions
  declared in <valarray> as inline.

3 A specialization of valarray for a type T has well-defined behavior if
  and only if the type T satisfies the following requirements:5)
  _________________________
  4)  The  intent  is  to specify an array template that has the minimum
  functionality necessary to address aliasing ambiguities and  the  pro­
  liferation  of  temporaries.  Thus, the valarray template is neither a
  matrix class nor a field class.  However, it is a very useful building
  block for designing such classes.
  5)  In  other words, valarray<T> should only be instantiated for value
  types.  These include built-in arithmetic types, pointers, the library
  class complex, and instantiations of valarray for value types.

  --T  is  not  an  abstract  class (it has no pure virtual member func­
    tions);

  --T is not a reference type;

  --T is not cv-qualified;

  --If T is a class, it has a public default constructor;

  --If T is a class, it has a public copy constructor with the signature
    T::T(const T&)

  --If T is a class, it has a public destructor;

  --If T is a class, it has a public assignment operator whose signature
    is either

    T& T::operator=(const T&)

    or

    T& T::operator=(T)

  --If T is a class, its assignment operator, copy and default construc­
    tors,  and destructor must correspond to each other in the following
    sense: Initialization of raw storage using the default  constructor,
    followed by assignment, is semantically equivalent to initialization
    of raw storage  using  the  copy  constructor.   Destruction  of  an
    object, followed by initialization of its raw storage using the copy
    constructor, is semantically equivalent to assignment to the  origi­
    nal object.  This rule states that there must not be any subtle dif­
    ferences in the semantics of initialization versus assignment.  This
    gives  an  implementation considerable flexibility in how arrays are
    initialized.  For example, an implementation is allowed to  initial­
    ize  a  valarray by allocating storage using the new operator (which
    implies a call to the default constructor for each element) and then
    assigning  each  element its value.  Or the implementation can allo­
    cate raw storage and use the copy  constructor  to  initialize  each
    element.   If  the distinction between initialization and assignment
    is important for a class, or if it fails to satisfy any of the other
    conditions  listed above, the programmer should use dynarray instead
    of valarray for that class;

  --If T is a class, it does not overload unary operator&.

4 In addition, many member and friend functions of  valarray<T>  can  be
  successfully  instantiated  and  will exhibit well-defined behavior if
  and only if T satisfies additional  requirements  specified  for  each
  such member or friend function.

5 For  example,  it  is legitimate to instantiate valarray<complex>, but
  operator > will not be successfully instantiated for valarray<complex>

  operands, since complex does not have any ordering operators.

  26.2.1.1  valarray constructors                    [lib.valarray.cons]

  valarray();

  Effects:
    Constructs  an object of class valarray<T>, 6) which has zero length
    until it is passed into a library function as a modifiable lvalue or
    through a non-constant this pointer.  This  default  constructor  is
    essential,  since  arrays  of  valarray  are likely to prove useful.
    There must also be a way to change the size of an array  after  ini­
    tialization;  this  is  supplied  by the semantics of the assignment
    operator.

    valarray(enum Uninitialized, size_t);

1 The array created by this constructor has a length equal to the  value
  of the second argument.  The first argument is not used.  The elements
  of the array are constructed using the  default  constructor  for  the
  instantiating  type  T.   The extra argument is needed to prevent this
  constructor from being used by the compiler to silently convert  inte­
  gers to valarray objects.

  valarray(const T&, size_t);

2 The array created by this constructor has a length equal to the second
  argument.  The elements of the array are initialized with the value of
  the first argument.

  valarray(const T*, size_t);

3 The array created by this constructor has a length equal to the second
  argument n.  The values of the elements of the array  are  initialized
  with  the  first  n  values  pointed to by the first argument.  If the
  value of the second argument is greater  than  the  number  of  values
  pointed  to  by  the  first argument, the behavior is undefined.  This
  constructor is the preferred method for converting  a  C  array  to  a
  valarray object.

  valarray(const valarray&);

4 The array created by this constructor has the same length as the argu­
  ment array.  The elements are initialized with the values of the  cor­
  responding  elements  of  the  argument  array.  This copy constructor
  _________________________
  6)  For  convenience,  such  objects  are  referred  to  as ``arrays''
  throughout the remainder of subclause _lib.numarray_.

  creates a distinct array rather than  an  alias.   Implementations  in
  which  arrays  share  storage are permitted, but they must implement a
  copy-on-reference mechanism to ensure  that  arrays  are  conceptually
  distinct.

  valarray(const slice_array<T>&);
  valarray(const gslice_array<T>&);
  valarray(const mask_array<T>&);
  valarray(const indirect_array<T>&);

5 These  conversion  constructors convert one of the four reference tem­
  plates to a valarray.

  26.2.1.2  valarray destructor                       [lib.valarray.des]

  ~valarray();

  26.2.1.3  valarray assignment                       [lib.valarray.op=]

  valarray& operator=(const valarray&);

1 The assignment operator modifies the length of the *this array  to  be
  equal  to that of the argument array.  Each element of the *this array
  is then assigned the value of the corresponding element of  the  argu­
  ment  array.   Assignment  is the usual way to change the length of an
  array after initialization.  Assignment results in  a  distinct  array
  rather than an alias.

  valarray& operator=(const slice_array<T>&);
  valarray& operator=(const gslice_array<T>&);
  valarray& operator=(const mask_array<T>&);
  valarray& operator=(const indirect_array<T>&);

2 These operators allow the results of a generalized subscripting opera­
  tion to be assigned directly to a valarray.

  26.2.1.4  valarray length access                 [lib.valarray.length]

  size_t length() const;

1 This function returns the number of elements in the this array.

  26.2.1.5  valarray pointer conversion               [lib.valarray.ptr]

  operator T*();
  operator const T*() const;

1 A non-constant array may be converted to a pointer to the  instantiat­
  ing  type.   A  constant  array  may  be converted to a pointer to the
  instantiating type, qualified by const.

2 It is guaranteed that

  &a[0] == (T*)a

  for any non-constant valarray<T> a.  The pointer returned for  a  non-
  constant array (whether or not it points to a type qualified by const)
  is valid for the same duration as a reference returned by  the  size_t
  subscript  operator.   The  pointer  returned  for a constant array is
  valid for the lifetime of the array.7)

  26.2.1.6  valarray element access                [lib.valarray.access]

  const T operator[](size_t) const;
  T& operator[](size_t);

1 When  applied  to a constant array, the subscript operator returns the
  value of the corresponding element of the array.  When  applied  to  a
  non-constant  array, the subscript operator returns a reference to the
  corresponding element of the array.

2 Thus, the expression

  (a[i] = q, a[i]) == q

  evaluates as true for any non-constant valarray<T> a, any T q, and for
  any size_t i such that the value of i is less than the length of a.

3 The expression

  &a[i+j] == &a[i] + j

  evaluates  as true for all size_t i and size_t j such that i+j is less
  than the length of the non-constant array a.

4 Likewise, the expression

  &a[i] != &b[j]

  evaluates as true for any two non-constant arrays a and b and for  any
  size_t  i  and size_t j such that i is less than the length of a and j
  is less than the length of b.  This property indicates an  absence  of
  aliasing and may be used to advantage by optimizing compilers.8)
  _________________________
  7) This form of access is essential for reusability and cross-language
  programming.
  8)  Compilers  may  take  advantage of inlining, constant propagation,
  loop fusion, tracking of pointers obtained from operator new, and oth­

5 The  reference  returned  by the subscript operator for a non-constant
  array is guaranteed to be valid until  the  array  to  whose  data  it
  refers  is  passed into any library function as a modifiable lvalue or
  through a non-const this pointer.

6 Computed assigns [such as valarray& operator+=(const valarray&)  ]  do
  not  by  themselves  invalidate references to array data.  If the sub­
  script operator is invoked with a size_t argument whose value  is  not
  less than the length of the array, the behavior is undefined.

  26.2.1.7  valarray subset operations                [lib.valarray.sub]

  const valarray    operator[](slice) const;
  slice_array<T>    operator[](slice);
  const valarray    operator[](const gslice&) const;
  gslice_array<T>   operator[](const gslice&);
  const valarray    operator[](const valarray<bool>&) const;
  mask_array<T>     operator[](const valarray<bool>&);
  const valarray    operator[](const valarray<int>&) const;
  indirect_array<T> operator[](const valarray<int>&);

1 Each  of  these  operations  returns  a subset of the this array.  The
  const- qualified versions return this subset as a new  valarray.   The
  non- const versions return a class template object which has reference
  semantics to the original array.

  26.2.1.8  valarray unary operators                [lib.valarray.unary]

  const valarray operator+() const;
  const valarray operator-() const;
  const valarray operator~() const;
  const valarray operator!() const;

1 Each of these operators may only be instantiated for a type T to which
  the  indicated  operator  can  be  applied and for which the indicated
  operator returns a value which is of type &T or which may be unambigu­
  ously converted to type T.

2 Each  of these operators returns an array whose length is equal to the
  length of the this array.  Each element of the returned array is  ini­
  tialized  with  the  result  of applying the indicated operator to the
  corresponding element of the this array.

  26.2.1.9  valarray binary operators         [lib.valarray.binary.scal]
       with scalars

  _________________________
  er techniques to generate efficient valarrays.

  const valarray operator* (const valarray&, const T&);
  const valarray operator/ (const valarray&, const T&);
  const valarray operator% (const valarray&, const T&);
  const valarray operator+ (const valarray&, const T&);
  const valarray operator- (const valarray&, const T&);
  const valarray operator^ (const valarray&, const T&);
  const valarray operator& (const valarray&, const T&);
  const valarray operator| (const valarray&, const T&);
  const valarray operator<<(const valarray&, const T&);
  const valarray operator>>(const valarray&, const T&);
  const valarray operator&&(const valarray&, const T&);
  const valarray operator||(const valarray&, const T&);

  const valarray operator* (const T&, const valarray&);
  const valarray operator/ (const T&, const valarray&);
  const valarray operator% (const T&, const valarray&);
  const valarray operator+ (const T&, const valarray&);
  const valarray operator- (const T&, const valarray&);
  const valarray operator^ (const T&, const valarray&);
  const valarray operator& (const T&, const valarray&);
  const valarray operator| (const T&, const valarray&);
  const valarray operator<<(const T&, const valarray&);
  const valarray operator>>(const T&, const valarray&);
  const valarray operator&&(const T&, const valarray&);
  const valarray operator||(const T&, const valarray&);

1 Each of these operators may only be instantiated for a type T to which
  the indicated operator can be applied  and  for  which  the  indicated
  operator  returns a value which is of type T or which can be unambigu­
  ously converted to type T.

2 Each of these operators returns an array whose length is equal to  the
  length  of  the array argument.  Each element of the returned array is
  initialized with the result of applying the indicated operator to  the
  corresponding element of the array argument and the scalar argument.

  26.2.1.10  valarray computed assigns       [lib.valarray.cassign.scal]
       with scalars

  valarray& operator*= (const T&);
  valarray& operator/= (const T&);
  valarray& operator%= (const T&);
  valarray& operator+= (const T&);
  valarray& operator-= (const T&);
  valarray& operator^= (const T&);
  valarray& operator&= (const T&);
  valarray& operator|= (const T&);
  valarray& operator<<=(const T&);
  valarray& operator>>=(const T&);

1 Each of these operators may only be instantiated for a type T to which
  the indicated operator can be applied.

2 Each  of  these operators applies the indicated operation to each ele­
  ment of the this array and the scalar argument.

3 The this array is then returned by reference.

4 The appearance of an array on the left hand side of a computed assign­
  ment does not invalidate references or pointers to the elements of the
  array.

  26.2.1.11  valarray binary operations         [lib.valarray.bin.array]
       with other arrays

  const valarray operator* (const valarray&, const valarray&);
  const valarray operator/ (const valarray&, const valarray&);
  const valarray operator% (const valarray&, const valarray&);
  const valarray operator+ (const valarray&, const valarray&);
  const valarray operator- (const valarray&, const valarray&);
  const valarray operator^ (const valarray&, const valarray&);
  const valarray operator& (const valarray&, const valarray&);
  const valarray operator| (const valarray&, const valarray&);
  const valarray operator<<(const valarray&, const valarray&);
  const valarray operator>>(const valarray&, const valarray&);
  const valarray operator&&(const valarray&, const valarray&);
  const valarray operator||(const valarray&, const valarray&);

1 Each of these operators may only be instantiated for a type T to which
  the indicated operator can be applied  and  for  which  the  indicated
  operator  returns a value which is of type T or which can be unambigu­
  ously converted to type T.

2 Each of these operators returns an array whose length is equal to  the
  lengths of the argument arrays.  Each element of the returned array is
  initialized with the result of applying the indicated operator to  the
  corresponding elements of the argument arrays.

3 If  the  argument  arrays do not have the same length, the behavior is
  undefined.

  26.2.1.12  valarray computed               [lib.valarray.assign.array]
       assignments with other arrays

  valarray& operator*= (const valarray&);
  valarray& operator/= (const valarray&);
  valarray& operator%= (const valarray&);
  valarray& operator+= (const valarray&);
  valarray& operator-= (const valarray&);
  valarray& operator^= (const valarray&);
  valarray& operator&= (const valarray&);
  valarray& operator|= (const valarray&);
  valarray& operator<<=(const valarray&);
  valarray& operator>>=(const valarray&);

1 Each of these operators may only be instantiated for a type T to which
  the indicated operator can be applied.  Each of these  operators  per­
  forms  the  indicated operation on each of its elements and the corre­
  sponding element of the argument array.

2 The this array is then returned by reference.

3 If the this array and the argument array do not have the same  length,
  the  behavior  is  undefined.   The appearance of an array on the left
  hand side of a computed assignment does not invalidate  references  or
  pointers.

  26.2.1.13  valarray comparison operators      [lib.valarray.comp.scal]
       with scalars

  const valarray<bool> operator==(const valarray&, const T&);
  const valarray<bool> operator!=(const valarray&, const T&);
  const valarray<bool> operator< (const valarray&, const T&);
  const valarray<bool> operator> (const valarray&, const T&);
  const valarray<bool> operator<=(const valarray&, const T&);
  const valarray<bool> operator>=(const valarray&, const T&);
  const valarray<bool> operator==(const T&, const valarray&);
  const valarray<bool> operator!=(const T&, const valarray&);
  const valarray<bool> operator< (const T&, const valarray&);
  const valarray<bool> operator> (const T&, const valarray&);
  const valarray<bool> operator<=(const T&, const valarray&);
  const valarray<bool> operator>=(const T&, const valarray&);

1 Each of these operators may only be instantiated for a type T to which
  the  indicated  operator  can  be  applied and for which the indicated
  operator returns a value which is of type bool or which can  be  unam­
  biguously converted to type bool.

2 Each  of these operators returns a bool array whose length is equal to
  the length of the array argument.  Each element of the returned  array
  is  initialized  with the result of applying the indicated operator to
  the corresponding element of the this array and the scalar argument.

  26.2.1.14  valarray comparison               [lib.valarray.comp.array]
       operators with other arrays

  const valarray<bool> operator==(const valarray&, const valarray&);
  const valarray<bool> operator!=(const valarray&, const valarray&);
  const valarray<bool> operator< (const valarray&, const valarray&);
  const valarray<bool> operator> (const valarray&, const valarray&);
  const valarray<bool> operator<=(const valarray&, const valarray&);
  const valarray<bool> operator>=(const valarray&, const valarray&);

1 Each of these operators may only be instantiated for a type T to which
  the indicated operator can be applied  and  for  which  the  indicated
  operator  returns  a value which is of type bool or which can be unam­
  biguously converted to type bool.

2 Each of these operators returns a bool array whose length is equal  to
  the length of the array arguments.  Each element of the returned array
  is initialized with the result of applying the indicated  operator  to
  the corresponding elements of the argument arrays.

3 If  the  two array arguments do not have the same length, the behavior
  is undefined.

  26.2.1.15  valarray sum function                    [lib.valarray.sum]

  const T sum() const;

  This function may only be instantiated for a type T  to  which  opera­
  tor+=  can  be applied.  This function returns the sum of all the ele­
  ments of the array.

1 If the array has length 0, the behavior is undefined.   If  the  array
  has  length  1,  sum  returns  the value of element 0.  Otherwise, the
  returned value is calculated by applying operator+= to a  copy  of  an
  element of the array and all other elements of the array in an unspec­
  ified order.

  26.2.1.16  valarray fill function                  [lib.valarray.fill]

  void fill(const T&);

  This function assigns the value of the argument to all the elements of
  the  this  array.  The length of the array is not changed, nor are any
  pointers or references to the elements of the array invalidated.

  26.2.1.17  valarray transcendentals           [lib.valarray.transcend]

  const valarray abs  (const valarray&);
  const valarray acos (const valarray&);
  const valarray asin (const valarray&);
  const valarray atan (const valarray&);
  const valarray atan2(const valarray&, const valarray&);
  const valarray atan2(const valarray&, const T&);
  const valarray atan2(const T&, const valarray&);
  const valarray cos  (const valarray&);
  const valarray cosh (const valarray&);
  const valarray exp  (const valarray&);
  const valarray log  (const valarray&);
  const valarray log10(const valarray&);
  const valarray pow  (const valarray&, const valarray&);
  const valarray pow  (const valarray&, const T&);
  const valarray pow  (const T&, const valarray&);
  const valarray sin  (const valarray&);
  const valarray sinh (const valarray&);
  const valarray sqrt (const valarray&);
  const valarray tan  (const valarray&);
  const valarray tanh (const valarray&);

1 Each of these functions may only be instantiated for a type T to which
  a  unique function with the indicated name can be applied.  This func­
  tion must return a value which is of type T or which can be  unambigu­
  ously converted to type T.

  26.2.1.18  valarray min and max functions        [lib.valarray.minmax]

  const T min(const valarray&);
  const T max(const valarray&);

1 These  functions may only be instantiated for a type T to which opera­
  tor> and operator< may be applied and for which operator>  and  opera­
  tor<  return  a  value which is of type bool or which can be unambigu­
  ously converted to type bool.

2 These functions return the minimum or maximum value found in the argu­
  ment array.

3 The  value  returned  for  an  array of length 0 is undefined.  For an
  array of length 1, the value of element 0 is returned.  For all  other
  array  lengths,  the  determination is made using operator> and opera­
  tor<, in a manner analogous to the application of operator+=  for  the
  sum function.

  26.2.1.19  valarray shift function                [lib.valarray.shift]

  const valarray shift(int) const;

1 This  function  returns an array whose length is identical to the this
  array, but whose element values are shifted the number of places indi­
  cated by the argument.

2 For  example,  if the argument has the value 2, the first two elements
  of the result will be constructed using the default  constructor;  the
  third  element  of  the result will be assigned the value of the first
  element of the argument; etc.

  +-------                 BEGIN BOX 2                -------+
  Should a cshift (circular shift) function also be defined?  This is  a
  common operation in Fortran.
  +-------                  END BOX 2                 -------+

  26.2.1.20  valarray mapping functions               [lib.valarray.map]

  const valarray apply(T func(T)) const;
  const valarray apply(T func(const T&)) const;

1 These  functions  return  an  array  whose length is equal to the this
  array.  Each element of the  returned  array  is  assigned  the  value
  returned  by  applying the argument function to the corresponding ele­
  ment of the this array.

  26.2.1.21  valarray free function                  [lib.valarray.free]

  void free();

1 This function sets the length of an array to zero.9)

  26.2.2  Class slice                                  [lib.class.slice]
  namespace std {
    class slice {
    public:
      slice();
      slice(int, int, int);

      int start() const;
      int length() const;
      int stride() const;
    };
  }

1 The  slice  class  represents a BLAS-like slice from an array.  Such a
  slice is specified by a starting index, a length, and a stride.10)
  _________________________
  9) An implementation may reclaim the storage used by  the  array  when
  this function is called.
  10) C++ programs may instantiate this class.

  26.2.2.1  slice constructors                          [lib.cons.slice]

  slice();
  slice(int start, int length, int stride);
  slice(const slice&);

1 The default constructor for slice creates a slice which  specifies  no
  elements.  A default constructor is provided only to permit the decla­
  ration of arrays of slices.  The  constructor  with  arguments  for  a
  slice takes a start, length, and stride parameter.

2 For example,

  slice(3, 8, 2)

  constructs  a  slice  which  selects  elements 3, 5, 7, ... 17 from an
  array.

  26.2.2.2  slice access functions                    [lib.slice.access]

  int start() const;
  int length() const;
  int stride() const;

1 These functions return the start, length, or  stride  specified  by  a
  slice object.

  26.2.3  Template class slice_array          [lib.template.slice.array]
  namespace std {
    template <class T> class slice_array {
    public:
      void operator=  (const valarray<T>&) const;
      void operator*= (const valarray<T>&) const;
      void operator/= (const valarray<T>&) const;
      void operator%= (const valarray<T>&) const;
      void operator+= (const valarray<T>&) const;
      void operator-= (const valarray<T>&) const;
      void operator^= (const valarray<T>&) const;
      void operator&= (const valarray<T>&) const;
      void operator|= (const valarray<T>&) const;
      void operator<<=(const valarray<T>&) const;
      void operator>>=(const valarray<T>&) const;
      void fill(const T&);
    private:
      slice_array();
      slice_array(const slice_array&);
      slice_array& operator=(const slice_array&);
      //   remainder implementation defined
    };
  }

1 The  slice_array  template is a helper template used by the slice sub­
  script operator

  slice_array<T> valarray<T>::operator[](slice);

  It has reference semantics to a subset of  an  array  specified  by  a
  slice object.

2 For example, the expression

  a[slice(1, 5, 3)] = b;

  has  the  effect of assigning the elements of b to a slice of the ele­
  ments in a.  For the slice shown, the elements selected from a  be  1,
  4, ..., 13.

3 Note  that  programmers may not instantiate slice_array, since all its
  constructors are private.  It is intended purely as a helper class and
  should be transparent to the user.

  26.2.3.1  slice_array constructors                [lib.cons.slice.arr]

  slice_array();
  slice_array(const slice_array&);

1 Note  that the slice_array template has no public constructors.  These
  constructors are declared to be private.  These constructors need  not
  be defined.

  26.2.3.2  slice_array assignment                [lib.slice.arr.assign]

  void         operator=(const valarray<T>&) const;
  slice_array& operator=(const slice_array&);

1 The  second  of these two assignment operators is declared private and
  need not be defined.  The first has reference semantics, assigning the
  values  of  the  argument  array  elements to selected elements of the
  valarray<T> object to which the slice_array object refers.

  26.2.3.3  slice_array computed             [lib.slice.arr.comp.assign]
       assignment

  void operator*= (const valarray<T>&) const;
  void operator/= (const valarray<T>&) const;
  void operator%= (const valarray<T>&) const;
  void operator+= (const valarray<T>&) const;
  void operator-= (const valarray<T>&) const;
  void operator^= (const valarray<T>&) const;
  void operator&= (const valarray<T>&) const;
  void operator|= (const valarray<T>&) const;
  void operator<<=(const valarray<T>&) const;
  void operator>>=(const valarray<T>&) const;

1 These  computed  assignments  have  reference  semantics, applying the
  indicated operation to the elements of the argument array and selected
  elements  of  the  valarray<T>  object to which the slice_array object
  refers.

  26.2.3.4  slice_array fill function               [lib.slice.arr.fill]

  void fill(const T&);

1 This function has reference semantics,  assigning  the  value  of  its
  argument  to  the  elements  of  the  valarray<T>  object to which the
  slice_array object refers.

  26.2.4  The gslice class                            [lib.class.gslice]
  namespace std {
    class gslice {
    public:
      gslice();
      gslice(int s, const valarray<int>& l, const valarray<int>& d);

      int           start() const;
      valarray<int> length() const;
      valarray<int> stride() const;
    };
  }

1 This class represents a generalized slice out of an array.   A  gslice
  is  defined by a starting offset (s), a set of lengths (lj), and a set
  of strides (dj).  The number of  lengths  must  equal  the  number  of
  strides.

2 A  gslice  represents  a  mapping from a set of indices (ij), equal in
  number to the number of strides, to a single index k.   It  is  useful
  for  building  multidimensional  array classes using the valarray tem­
  plate, which is one-dimensional.  The  set  of  one-dimensional  index
  values specified by a gslice are

  k = s + sum_over_j(ijdj)

  where  the multidimensional indices ij range in value from 0 to lij-1.

3 For example, the gslice specification

  start  = 3
  length = {2, 4, 3}
  stride = {19, 4, 1}

  yields the sequence of one-dimensional indices

  k = 3 + (0,1) x 19 = (0,1,2,3) x 4 + (0,1,2) x 1

  which are ordered as shown in the following table:
      (i0, i1, i2, k) =
              (0, 0, 0, 3),
              (0, 0, 1, 4),
              (0, 0, 2, 5),
              (0, 1, 0, 7),
              (0, 1, 1, 8),
              (0, 1, 2, 9),
              (0, 2, 0, 11),
              (0, 2, 1, 12),
              (0, 2, 2, 13),
              (0, 3, 0, 15),
              (0, 3, 1, 16),
              (0, 3, 2, 17),
              (1, 0, 0, 22),
              (1, 0, 1, 23),
              ...
              (1, 3, 2, 36)
  That is, the highest-ordered index turns fastest.

4 It is possible to have  degenerate  generalized  slices  in  which  an
  address is repeated.

5 For  example,  if  the  stride  parameters in the previous example are
  changed to {1, 1, 1}, the first few elements of the resulting sequence
  of indices will be
              (0, 0, 0, 3),
              (0, 0, 1, 4),
              (0, 0, 2, 5),
              (0, 1, 0, 4),
              (0, 1, 1, 5),
              (0, 1, 2, 6),
              ...

6 If  a  degenerate slice is used as the argument to the non- const ver­
  sion of operator[](const gslice&), the  resulting  behavior  is  unde­
  fined.

  26.2.4.1  gslice constructors                        [lib.gslice.cons]

  gslice();
  gslice(int start, const valarray<int>& lengths, const valarray<int>& strides);
  gslice(const gslice&);

1 The  default constructor creates a gslice which specifies no elements.
  The constructor with arguments builds a gslice based on  a  specifica­
  tion of start, lengths, and strides, as explained in the previous sec­
  tion.

  26.2.4.2  gslice access functions                  [lib.gslice.access]

  int           start() const;
  valarray<int> length() const;
  valarray<int> stride() const;

  These  access  functions  return  the  representation  of  the  start,
  lengths, or strides specified for the gslice.

  26.2.5  Template class gslice_array        [lib.template.gslice.array]
  namespace std {
    template <class T> class gslice_array {
    public:
      void operator=  (const valarray<T>&) const;
      void operator*= (const valarray<T>&) const;
      void operator/= (const valarray<T>&) const;
      void operator%= (const valarray<T>&) const;
      void operator+= (const valarray<T>&) const;
      void operator-= (const valarray<T>&) const;
      void operator^= (const valarray<T>&) const;
      void operator&= (const valarray<T>&) const;
      void operator|= (const valarray<T>&) const;
      void operator<<=(const valarray<T>&) const;
      void operator>>=(const valarray<T>&) const;
      void fill(const T&);
    private:
      gslice_array();
      gslice_array(const gslice_array&);
      gslice_array& operator=(const gslice_array&);
      //  remainder implementation defined
    };
  }

1 This  template is a helper template used by the slice subscript opera­
  tor

  gslice_array<T> valarray<T>::operator[](const gslice&);

  It has reference semantics to a subset of  an  array  specified  by  a
  gslice object.

2 Thus, the expression

  a[gslice(1, length, stride)] = b

  has  the  effect of assigning the elements of b to a generalized slice
  of the elements in a.

3 Note that programmers may not instantiate gslice_array, since all  its
  constructors are private.  It is intended purely as a helper class and
  should be transparent to the user.

  26.2.5.1  gslice_array constructors            [lib.gslice.array.cons]

  gslice_array();
  gslice_array(const gslice_array&);

1 The gslice_array template has no public constructors.  It declares the
  above  constructors  to  be  private.   These constructors need not be
  defined.

  26.2.5.2  gslice_array assignment            [lib.gslice.array.assign]

  void operator=(const valarray<T>&) const;
  gslice_array& operator=(const gslice_array&);

1 The second of these two assignment operators is declared  private  and
  need not be defined.  The first has reference semantics, assigning the
  values of the argument array elements  to  selected  elements  of  the
  valarray<T> object to which the gslice_array refers.

  26.2.5.3  gslice_array computed         [lib.gslice.array.comp.assign]
       assignment

  void operator*= (const valarray<T>&) const;
  void operator/= (const valarray<T>&) const;
  void operator%= (const valarray<T>&) const;
  void operator+= (const valarray<T>&) const;
  void operator-= (const valarray<T>&) const;
  void operator^= (const valarray<T>&) const;
  void operator&= (const valarray<T>&) const;
  void operator|= (const valarray<T>&) const;
  void operator<<=(const valarray<T>&) const;
  void operator>>=(const valarray<T>&) const;

1 These computed assignments  have  reference  semantics,  applying  the
  indicated operation to the elements of the argument array and selected
  elements of the valarray<T> object to which  the  gslice_array  object
  refers.

  26.2.5.4  gslice_array fill function           [lib.gslice.array.fill]

  void fill(const T&);

1 This  function  has  reference  semantics,  assigning the value of its
  argument to the elements  of  the  valarray<T>  object  to  which  the
  gslice_array object refers.

  26.2.6  Template class mask_array            [lib.template.mask.array]
  namespace std {
    template <class T> class mask_array {
    public:
      void operator=  (const valarray<T>&) const;
      void operator*= (const valarray<T>&) const;
      void operator/= (const valarray<T>&) const;
      void operator%= (const valarray<T>&) const;
      void operator+= (const valarray<T>&) const;
      void operator-= (const valarray<T>&) const;
      void operator^= (const valarray<T>&) const;
      void operator&= (const valarray<T>&) const;
      void operator|= (const valarray<T>&) const;
      void operator<<=(const valarray<T>&) const;
      void operator>>=(const valarray<T>&) const;
      void fill(const T&);
    private:
      mask_array();
      mask_array(const mask_array&);
      mask_array& operator=(const mask_array&);
      //  remainder implementation defined
    };
  }

1 This template is a helper template used by the mask subscript operator

  mask_array<T> valarray<T>::operator[](const valarray<bool>&);

  It has reference semantics to a subset of  an  array  specified  by  a
  boolean mask.  Thus, the expression

  a[mask] = b;

  has  the  effect of assigning the elements of b to the masked elements
  in a (those for which the corresponding element in mask is true.

2 Note that C++ programs may not declare instances of mask_array,  since
  all  its  constructors are private.  It is intended purely as a helper
  class, and should be transparent to the user.

  26.2.6.1  mask_array constructors                [lib.mask.array.cons]

  mask_array();
  mask_array(const mask_array&);

1 The mask_array template has no public constructors.  It  declares  the
  above  constructors  to  be  private.   These constructors need not be
  defined.

  26.2.6.2  mask_array assignment                [lib.mask.array.assign]

  void operator=(const valarray<T>&) const;
  mask_array& operator=(const mask_array&);

1 The second of these two assignment operators is declared  private  and
  need not be defined.  The first has reference semantics, assigning the
  values of the argument array elements  to  selected  elements  of  the
  valarray<T> object to which it refers.

  26.2.6.3  mask_array computed             [lib.mask.array.comp.assign]
       assignment

  void operator*= (const valarray<T>&) const;
  void operator/= (const valarray<T>&) const;
  void operator%= (const valarray<T>&) const;
  void operator+= (const valarray<T>&) const;
  void operator-= (const valarray<T>&) const;
  void operator^= (const valarray<T>&) const;
  void operator&= (const valarray<T>&) const;
  void operator|= (const valarray<T>&) const;
  void operator<<=(const valarray<T>&) const;
  void operator>>=(const valarray<T>&) const;

1 These computed assignments  have  reference  semantics,  applying  the
  indicated operation to the elements of the argument array and selected
  elements of the valarray<T> object to which the mask object refers.

  26.2.6.4  mask_array fill function               [lib.mask.array.fill]

  void fill(const T&);

  This function has reference semantics,  assigning  the  value  of  its
  argument  to  the  elements  of  the  valarray<T>  object to which the
  mask_array object refers.

  26.2.7  Template class                   [lib.template.indirect.array]
       indirect_array

  namespace std {
    template <class T> class indirect_array {
    public:
      void operator=  (const valarray<T>&) const;
      void operator*= (const valarray<T>&) const;
      void operator/= (const valarray<T>&) const;
      void operator%= (const valarray<T>&) const;
      void operator+= (const valarray<T>&) const;
      void operator-= (const valarray<T>&) const;
      void operator^= (const valarray<T>&) const;
      void operator&= (const valarray<T>&) const;
      void operator|= (const valarray<T>&) const;
      void operator<<=(const valarray<T>&) const;
      void operator>>=(const valarray<T>&) const;
      void fill(const T&);
    private:
      indirect_array();
      indirect_array(const indirect_array&);
      indirect_array& operator=(const indirect_array&);
      //  remainder implementation defined
    };
  }

1 This  template  is  a  helper  template used by the indirect subscript
  operator

  indirect_array<T> valarray<T>::operator[](const valarray<int>&);

  It has reference semantics to a subset of an  array  specified  by  an
  indirect_array.  Thus the expression

  a[indirect] = b;

  has  the  effect  of  assigning the elements of b to the elements in a
  whose indices appear in indirect.

2 Note that C++ programs may not declare  instances  of  indirect_array,
  since  all  its  constructors are private.  It is intended purely as a
  helper class, and should be transparent to the user.

  26.2.7.1  indirect_array constructors        [lib.indirect.array.cons]

  indirect_array();
  indirect_array(const indirect_array&);

  The indirect_array template has no public constructors.  The construc­
  tors  listed  above  are  private.   These  constructors  need  not be
  defined.

  26.2.7.2  indirect_array assignment        [lib.indirect.array.assign]

  void operator=(const valarray<T>&) const;
  indirect_array& operator=(const indirect_array&);

1 The second of these two assignment operators is declared  private  and
  need not be defined.  The first has reference semantics, assigning the
  values of the argument array elements  to  selected  elements  of  the
  valarray<T> object to which it refers.

2 If  the  indirect_array specifies an element in the valarray<T> object
  to which it refers more than once, the behavior is undefined.

3 For example,

  int addr = {2, 3, 1, 4, 4};
  valarray<int> indirect(addr, 5);
  valarray<double> a(0., 10), b(1., 5);
  array[indirect] = b;

  results in undefined behavior since element 4 is  specified  twice  in
  the indirection.

  26.2.7.3  indirect_array              [lib.indirect.array.comp.assign]
       computed assignment

  void operator*= (const valarray<T>&) const;
  void operator/= (const valarray<T>&) const;
  void operator%= (const valarray<T>&) const;
  void operator+= (const valarray<T>&) const;
  void operator-= (const valarray<T>&) const;
  void operator^= (const valarray<T>&) const;
  void operator&= (const valarray<T>&) const;
  void operator|= (const valarray<T>&) const;
  void operator<<=(const valarray<T>&) const;
  void operator>>=(const valarray<T>&) const;

1 These computed assignments  have  reference  semantics,  applying  the
  indicated operation to the elements of the argument array and selected
  elements of the valarray<T> object to which the indirect_array  object
  refers.

2 If  the  indirect_array specifies an element in the valarray<T> object
  to which it refers more than once, the behavior is undefined.

  26.2.7.4  indirect_array fill function       [lib.indirect.array.fill]

  void fill(const T&);

1 This function has reference semantics,  assigning  the  value  of  its
  argument  to the elements of the valarray<T> object to which the indi­
  rect_array object refers.

  26.3  Generalized numeric operations                 [lib.numeric.ops]

  Header <numeric> synopsis

  namspace std {
    template <class InputIterator, class T>
      T accumulate(InputIterator first, InputIterator last, T init);
    template <class InputIterator, class T, class BinaryOperation>
      T accumulate(InputIterator first, InputIterator last, T init,
                   BinaryOperation binary_op);
    template <class InputIterator1, class InputIterator2, class T>
      T inner_product(InputIterator1 first1, InputIterator1 last1,
                      InputIterator2 first2, T init);
    template <class InputIterator1, class InputIterator2, class T,
              class BinaryOperation1, class BinaryOperation2>
      T inner_product(InputIterator1 first1, InputIterator1 last1,
                      InputIterator2 first2, T init,
                      BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);
    template <class InputIterator, class OutputIterator>
      OutputIterator partial_sum(InputIterator first, InputIterator last,
                                 OutputIterator result);
    template <class InputIterator, class OutputIterator, class BinaryOperation>
      OutputIterator partial_sum(InputIterator first, InputIterator last,
                                 OutputIterator result, BinaryOperation binary_op);
    template <class InputIterator, class OutputIterator>
      OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                         OutputIterator result);
    template <class InputIterator, class OutputIterator, class BinaryOperation>
      OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                         OutputIterator result, BinaryOperation binary_op);
  }

  26.3.1  Accumulate                                    [lib.accumulate]

  template <class InputIterator, class T>
    T accumulate(InputIterator first, InputIterator last, T init);
  template <class InputIterator, class T, class BinaryOperation>
    T accumulate(InputIterator first, InputIterator last, T init,
   BinaryOperation binary_op);

  Effects:
    Initializes the accumulator acc with the initial value init and then
    modifies  it  with  acc  =  acc + *i or acc = binary_op(acc, *i) for
    every  iterator  i in the range [first, last) in order.11) binary_op
  _________________________
  11) accumulate is similar to the APL  reduction  operator  and  Common
  Lisp reduce function, but it avoids the difficulty of defining the re­
  sult of reduction on an empty sequence by always requiring an  initial
  value.

    is assumed not to cause side effects.

  26.3.2  Inner product                              [lib.inner.product]

  template <class InputIterator1, class InputIterator2, class T>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, T init);
  template <class InputIterator1, class InputIterator2, class T,
            class BinaryOperation1, class BinaryOperation2>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, T init,
                    BinaryOperation1 binary_op1, BinaryOperation2 binary_op2);

  Effects:
    Computes its result by initializing the  accumulator  acc  with  the
    initial value init and then modifying it with

    acc = acc + (*i1) * (*i2)

    or

    acc = binary_op1(acc, binary_op2(*i1, *i2))

    for  every iterator i1 in the range [first, last) and iterator i2 in
    the range [first2, first2 + (last - first)) in order.
  Requires:
    binary_op1 and binary_op2 shall not cause side effects.

  26.3.3  Partial sum                                  [lib.partial.sum]

  template <class InputIterator, class OutputIterator>
    OutputIterator partial_sum(InputIterator first, InputIterator last,
                 OutputIterator result);
  template <class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator partial_sum(InputIterator first, InputIterator last,
                               OutputIterator result, BinaryOperation binary_op);

  Effects:
    Assigns to every iterator i in the range [result, result +  (last  -
    first)) a value correspondingly equal to

    ((...(*first + *(first + 1)) + ...) + *(first + (i - result)))

    or

    binary_op(binary_op(..., binary_op(*first, *(first + 1)),...), *(first + (i - result)))

  Returns:
    result + (last - first).
  Complexity:
    Exactly (last - first) - 1 applications of binary_op.
  Requires:
    binary_op is expected not to have any side effects.

  Notes:
    result may be equal to first.

  26.3.4  Adjacent difference                  [lib.adjacent.difference]

  template <class InputIterator, class OutputIterator>
    OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                       OutputIterator result);
  template <class InputIterator, class OutputIterator, class BinaryOperation>
    OutputIterator adjacent_difference(InputIterator first, InputIterator last,
                                       OutputIterator result, BinaryOperation binary_op);

  Effects:
    Assigns  to  every  element  referred  to by iterator i in the range
    [result + 1, result + (last - first)) a value correspondingly  equal
    to

    *(first + (i - result)) - *(first + (i - result) - 1)

    or

    binary_op(*(first + (i - result)), *(first + (i - result) - 1))

    result gets the value of *first.
  Requires:
    binary_op shall not have any side effects.
  Notes:
    result may be equal to first.
  Returns:
    result + (last - first).
  Complexity:
    Exactly (last - first) - 1 applications of binary_op.

  26.4  C Library                                           [lib.c.math]

1 Headers <cmath> and <cstdlib> ( abs(), div(), rand(), srand()).

                     Table 1--Header <cmath> synopsis

                +-----------------------------------------+
                | Type                Name(s)             |
                +-----------------------------------------+
                |Macro:   HUGE_VAL                        |
                +-----------------------------------------+
                |Functions:                               |
                |acos     ceil       fabs    ldexp   pow  |
                |asin     cos        floor   log     sin  |
                |atan     cosh       fmod    log10   sinh |
                |atan2    exp        frexp   modf    sqrt |
                +-----------------------------------------+

                    Table 1--Header <cstdlib> synopsis

                      +----------------------------+
                      | Type          Name(s)      |
                      +----------------------------+
                      |Macros:   RAND_MAX          |
                      +----------------------------+
                      |Types:    div_t      ldiv_t |
                      +----------------------------+
                      |Functions:                  |
                      |abs       labs       srand  |
                      |div       ldiv       rand   |
                      +----------------------------+

2 The contents are the same as the Standard C library.

  SEE ALSO: ISO C subclauses 7.5, 7.10.2, 7.10.6.