SpeedCrunch  0.11
/usr/src/RPM/BUILD/speedcrunch-0.11/src/math/hmath.h
Go to the documentation of this file.
00001 // HMath: C++ high precision math routines
00002 // Copyright (C) 2004 Ariya Hidayat <ariya.hidayat@gmail.com>
00003 // Copyright (C) 2007-2008, 2014 Helder Correia <helder.pereira.correia@gmail.com>
00004 // Copyright (C) 2008 Wolf Lammen
00005 //
00006 // This program is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU General Public License
00008 // as published by the Free Software Foundation; either version 2
00009 // of the License, or (at your option) any later version.
00010 //
00011 // This program is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // GNU General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU General Public License
00017 // along with this program; see the file COPYING.  If not, write to
00018 // the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019 // Boston, MA 02110-1301, USA.
00020 
00021 #ifndef MATH_HMATH_H
00022 #define MATH_HMATH_H
00023 
00024 #include "core/errors.h"
00025 
00026 #include <ostream>
00027 
00028 class HMath;
00029 class HNumberPrivate;
00030 
00031 class HNumber
00032 {
00033   friend class HMath;
00034   friend HNumber operator-( const HNumber & );
00035   friend HNumber operator-( const HNumber &, const HNumber& );
00036   friend bool operator>( const HNumber& l, const HNumber& r );
00037   friend bool operator<( const HNumber& l, const HNumber& r );
00038   friend bool operator>=( const HNumber& l, const HNumber& r );
00039   friend bool operator<=( const HNumber& l, const HNumber& r );
00040   friend bool operator==( const HNumber& l, const HNumber& r );
00041   friend bool operator!=( const HNumber& l, const HNumber& r );
00042 
00043   public:
00044     HNumber();
00045     HNumber( const HNumber& );
00046     HNumber( int i );
00047     HNumber( const char* );
00048     ~HNumber();
00049 
00050     bool isNan() const;
00051     bool isZero() const;
00052     bool isPositive() const;
00053     bool isNegative() const;
00054     bool isInteger() const;
00055 
00056 //TODO formats should be separated from numbers
00057 
00058     // 'g': decimal general (default)
00059     // 'f': decimal fixed
00060     // 'e': decimal scientific
00061     // 'n': decimal engineering
00062     // 'h': hexadecimal
00063     // 'o': octal
00064     // 'b': binary
00065     char format() const;
00066     HNumber& setFormat( char c = 0 );
00067 
00068     int toInt() const;
00069     Error error() const;
00070 
00071     HNumber& operator=( const HNumber& );
00072     HNumber operator+( const HNumber& ) const;
00073     HNumber& operator+=( const HNumber& );
00074     HNumber& operator-=( const HNumber& );
00075     HNumber operator*( const HNumber& ) const;
00076     HNumber& operator*=( const HNumber& );
00077     HNumber operator/( const HNumber& ) const;
00078     HNumber& operator/=( const HNumber& );
00079     HNumber operator%( const HNumber& ) const;
00080     HNumber operator&( const HNumber& ) const;
00081     HNumber& operator&=( const HNumber& );
00082     HNumber operator|( const HNumber& ) const;
00083     HNumber& operator|=( const HNumber& );
00084     HNumber operator^( const HNumber& ) const;
00085     HNumber& operator^=( const HNumber& );
00086     HNumber operator~() const;
00087     HNumber operator>>( const HNumber& ) const;
00088     HNumber operator<<( const HNumber& ) const;
00089 
00090   private:
00091     HNumberPrivate * d;
00092 
00093     int compare( const HNumber & other ) const;
00094 };
00095 
00096 class HMath
00097 {
00098   public:
00099     // FORMAT
00100     static char * format( const HNumber & n, char format = 'g', int prec = -1 );
00101     // CONSTANTS
00102     static HNumber e();
00103     static HNumber phi();
00104     static HNumber pi();
00105     static HNumber nan(Error error = Success);
00106     // GENERAL MATH
00107     static HNumber rad2deg( const HNumber & angle );
00108     static HNumber deg2rad( const HNumber & angle );
00109     static HNumber max( const HNumber & n1, const HNumber & n2 );
00110     static HNumber min( const HNumber & n1, const HNumber & n2 );
00111     static HNumber abs( const HNumber & n );
00112     static HNumber integer( const HNumber & n );
00113     static HNumber frac( const HNumber & n );
00114     static HNumber floor( const HNumber & n );
00115     static HNumber ceil( const HNumber & n );
00116     static HNumber gcd( const HNumber & n1, const HNumber & n2 );
00117     static HNumber idiv( const HNumber& n1, const HNumber& n2 );
00118     static HNumber round( const HNumber & n, int prec = 0 );
00119     static HNumber trunc( const HNumber & n, int prec = 0 );
00120     static HNumber sqrt( const HNumber & n );
00121     static HNumber cbrt( const HNumber & n );
00122     static HNumber raise( const HNumber & n1, int n );
00123     static HNumber raise( const HNumber & n1, const HNumber & n2 );
00124     static HNumber sgn( const HNumber & x );
00125     // EXPONENTIAL FUNCTION AND RELATED
00126     static HNumber exp( const HNumber & x );
00127     static HNumber ln( const HNumber & x );
00128     static HNumber lg( const HNumber & x );
00129     static HNumber lb( const HNumber & x );
00130     static HNumber log( const HNumber & base, const HNumber & x );
00131     static HNumber sinh( const HNumber & x );
00132     static HNumber cosh( const HNumber & x );
00133     static HNumber tanh( const HNumber & x );
00134     static HNumber arsinh( const HNumber & x );
00135     static HNumber arcosh( const HNumber & x );
00136     static HNumber artanh( const HNumber & x );
00137     // TRIGONOMETRY
00138     static HNumber sin( const HNumber & x );
00139     static HNumber cos( const HNumber & x );
00140     static HNumber tan( const HNumber & x );
00141     static HNumber cot( const HNumber & x );
00142     static HNumber sec( const HNumber & x );
00143     static HNumber csc( const HNumber & x );
00144     static HNumber arcsin( const HNumber & x );
00145     static HNumber arccos( const HNumber & x );
00146     static HNumber arctan( const HNumber & x );
00147     // HIGHER MATH FUNCTIONS
00148     static HNumber factorial( const HNumber & x, const HNumber & base = HNumber(1) );
00149     static HNumber gamma( const HNumber & x);
00150     static HNumber lnGamma( const HNumber & x);
00151     static HNumber erf( const HNumber & x );
00152     static HNumber erfc( const HNumber & x );
00153     // PROBABILITY
00154     static HNumber nCr( const HNumber & n, const HNumber & k );
00155     static HNumber nPr( const HNumber & n, const HNumber & r );
00156     static HNumber binomialPmf( const HNumber & k, const HNumber & n, const HNumber & p );
00157     static HNumber binomialCdf( const HNumber & k, const HNumber & n, const HNumber & p );
00158     static HNumber binomialMean( const HNumber & n, const HNumber & p );
00159     static HNumber binomialVariance( const HNumber & n, const HNumber & p );
00160     static HNumber hypergeometricPmf( const HNumber & k, const HNumber & N, const HNumber & M, const HNumber & n );
00161     static HNumber hypergeometricCdf( const HNumber & k, const HNumber & N, const HNumber & M, const HNumber & n );
00162     static HNumber hypergeometricMean( const HNumber & N, const HNumber & M, const HNumber & n );
00163     static HNumber hypergeometricVariance( const HNumber & N, const HNumber & M, const HNumber & n );
00164     static HNumber poissonPmf( const HNumber & k, const HNumber & l );
00165     static HNumber poissonCdf( const HNumber & k, const HNumber & l );
00166     static HNumber poissonMean( const HNumber & l );
00167     static HNumber poissonVariance( const HNumber & l );
00168     // LOGIC
00169     static HNumber mask( const HNumber & val, const HNumber & bits );
00170     static HNumber sgnext( const HNumber & val, const HNumber & bits );
00171     static HNumber ashr( const HNumber & val, const HNumber & bits );
00172 };
00173 
00174 std::ostream & operator<<( std::ostream &, const HNumber & );
00175 
00176 #endif