text: /* -*- C++ -*- ------------------------------------------------------------
   
  Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
  
  The Configurable Math Library (CML) is distributed under the terms of the
  Boost Software License, v1.0 (see cml/LICENSE for details).
  
   *-----------------------------------------------------------------------*/
  /** @file
   *  @brief Useful constants.
   */
  
  #ifndef cml_constants_h
  #define cml_constants_h
  
  #include <cmath>
  
  #if !defined(M_PI)
  #define M_PI 3.14159265358979323846264338327950288
  #endif
  
  #if !defined(M_SQRT2)
  #define M_SQRT2 1.41421356237309504880168872420969808
  #endif
  
  #if !defined(M_E)
  #define M_E 2.71828182845904523536028747135266250
  #endif
  
  namespace cml {
  
  #if 1
  
  /** Templated constants struct.
   *
   * Either float or double can be used.
   */
  template<typename Float>
  struct constants {
      static Float pi()           { return M_PI;                             }
      static Float two_pi()       { return 2.*M_PI;                          }
      static Float inv_pi()       { return 1./M_PI;                          }
      static Float inv_two_pi()   { return 1./(2.*M_PI);                     }
      static Float pi_over_2()    { return M_PI/2.;                          }
      static Float pi_over_4()    { return M_PI/4.;                          }
      static Float deg_per_rad()  { return 180./M_PI;                        }
      static Float rad_per_deg()  { return M_PI/180.;                        }
      static Float sqrt_2()       { return M_SQRT2;                          }
      static Float sqrt_3()       { return 1.732050807568877293527446341505; }
      static Float sqrt_5()       { return 2.236067977499789696409173668731; }
      static Float sqrt_6()       { return 2.449489742783178098197284074705; }
      static Float e()            { return M_E;                              }
  };
  
  #else
  
  /* XXX This version requires an explicit instantiation of *every* constant
   * below, e.g.:
   *
   * template<typename F> const F cml::constants<F>::pi;
   */
  /** Templated constants struct.
   *
   * Either float or double can be used.
   */
  template<typename Float>
  struct constants {
      static const Float pi = M_PI;
      static const Float two_pi = 2.*M_PI;
      static const Float inv_pi = 1./M_PI;                /* 1/pi */
      static const Float inv_two_pi = 1./(2.*M_PI);       /* 1/(2*pi) */
      static const Float pi_over_2 = M_PI/2.;             /* pi/2 */
      static const Float pi_over_4 = M_PI/4.;             /* pi/4 */
      static const Float deg_per_rad = 180./M_PI;
      static const Float rad_per_deg = M_PI/180.;
      static const Float sqrt_2 = M_SQRT2;
      static const Float sqrt_3 = 1.73205080756887729352744634150587237;
      static const Float sqrt_5 = 2.23606797749978969640917366873127624;
      static const Float sqrt_6 = 2.44948974278317809819728407470589139;
      static const Float e = M_E;
  };
  
  #endif
  
  } // namespace cml
  
  #endif
  