SpeedCrunch
0.11
|
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