williamr@2: // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@2: // under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: // which accompanies this distribution, and is available williamr@2: // at the URL "http://www.symbianfoundation.org/legal/licencesv10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // e32\include\e32math.h williamr@2: // williamr@2: // williamr@2: williamr@2: #ifndef __E32MATH_H__ williamr@2: #define __E32MATH_H__ williamr@2: #include williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KMaxPrecision=15; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KPrecisionLimit=12; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KMantissaBits=53; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KMaxExponent=1023; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KExponentBias=1022; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KSpecialExponent=2047; williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The maximum exponent for a 32-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal32MaxExponent=128; // changed from 127 williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The minimum exponent for a 32-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal32MinExponent=-125; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KTReal32ExponentBias=126; williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KTReal32SpecialExponent=255; // changed from KTReal32ExponentBad williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A zero exponent value for a 32-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal32ZeroExponent=0; williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The maximum exponent for a 64-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal64MaxExponent=1024; // changed from 1023 williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The minimum exponent for a 64-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal64MinExponent=-1021; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KTReal64ExponentBias=1022; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TInt KTReal64SpecialExponent=2047; // changed from KTReal64BadExponent williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A zero exponent value for a 64-bit floating point number. williamr@2: */ williamr@2: const TInt KTReal64ZeroExponent=0; williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The minimum value of a 64-bit floating point number. williamr@2: */ williamr@2: const TReal KMinTReal=2.2250738585072015E-308; // changed from TReal64 williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The maximum value of a 64-bit floating point number. williamr@2: */ williamr@2: const TReal KMaxTReal=1.7976931348623157E+308; // williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The minimum value of a 32-bit floating point number. williamr@2: */ williamr@2: const TReal32 KMinTReal32=1.17549435E-38f; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The maximum value of a 32-bit floating point number. williamr@2: */ williamr@2: const TReal32 KMaxTReal32=3.4028234663852885981170418348452e+38f; williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The minimum value of a 64-bit floating point number. williamr@2: */ williamr@2: const TReal64 KMinTReal64=2.2250738585072015E-308; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The maximum value of a 64-bit floating point number. williamr@2: */ williamr@2: const TReal64 KMaxTReal64=1.7976931348623157E+308; williamr@2: // williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TReal KSqhf=0.70710678118654752440; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Log 2 to the base "e". williamr@2: */ williamr@2: const TReal KRln2=1.4426950408889634; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Log 10 to the base "e". williamr@2: */ williamr@2: const TReal KRln10=0.4342944819032518; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Log 2 to the base 10. williamr@2: */ williamr@2: const TReal KRlg2=0.3010299956639812; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The mathematical constant Pi. williamr@2: */ williamr@2: const TReal KPi=3.1415926535897932; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The reciprocal of the mathematical constant Pi. williamr@2: */ williamr@2: const TReal KPiInv=0.3183098861837907; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The mathematical constant Pi divided by 2. williamr@2: */ williamr@2: const TReal KPiBy2=1.5707963267948966; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: Not used. williamr@2: */ williamr@2: const TReal KDrpi=0.6366197723675813; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The square root of 3. williamr@2: */ williamr@2: const TReal KSqt3=1.7320508075688773; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: */ williamr@2: const TReal KMsq3=0.2679491924311227; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The multiplying factor to convert radians to degrees. williamr@2: */ williamr@2: const TReal KRadToDeg=57.29577951308232; williamr@2: williamr@2: williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: The multiplying factor to convert degrees to radians. williamr@2: */ williamr@2: const TReal KDegToRad=0.017453292519943296; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: class TRealX williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A class encapsulating an extended precision real value. williamr@2: williamr@2: This class provides 64 bit precision and a dynamic range of approximately williamr@2: 1E-9863 to 1E+9863. All member functions are optimized for speed. williamr@2: */ williamr@2: { williamr@2: public: williamr@2: enum TRealXOrder {ELessThan=1,EEqual=2,EGreaterThan=4,EUnordered=8}; williamr@2: public: williamr@2: IMPORT_C TRealX(); williamr@2: IMPORT_C TRealX(TInt aInt); williamr@2: IMPORT_C TRealX(TUint aInt); williamr@2: IMPORT_C TRealX(TUint aExp, TUint aMantHi, TUint aMantLo); williamr@2: IMPORT_C TRealX(const TInt64 &aInt); williamr@2: IMPORT_C TRealX(TReal32 aReal) __SOFTFP; williamr@2: IMPORT_C TRealX(TReal64 aReal) __SOFTFP; williamr@2: IMPORT_C TRealX &operator=(TInt aInt); williamr@2: IMPORT_C TRealX &operator=(TUint aInt); williamr@2: IMPORT_C TRealX &operator=(const TInt64& aInt); williamr@2: IMPORT_C TRealX &operator=(TReal32 aReal) __SOFTFP; williamr@2: IMPORT_C TRealX &operator=(TReal64 aReal) __SOFTFP; williamr@2: IMPORT_C TInt Set(TInt aInt); williamr@2: IMPORT_C TInt Set(TUint aInt); williamr@2: IMPORT_C TInt Set(const TInt64& aInt); williamr@2: IMPORT_C TInt Set(TReal32 aReal) __SOFTFP; williamr@2: IMPORT_C TInt Set(TReal64 aReal) __SOFTFP; williamr@2: IMPORT_C operator TInt() const; williamr@2: IMPORT_C operator TUint() const; williamr@2: IMPORT_C operator TInt64() const; williamr@2: IMPORT_C operator TReal32() const __SOFTFP; williamr@2: IMPORT_C operator TReal64() const __SOFTFP; williamr@2: IMPORT_C TInt GetTReal(TReal32 &aVal) const; williamr@2: IMPORT_C TInt GetTReal(TReal64 &aVal) const; williamr@2: IMPORT_C void SetZero(TBool aNegative=EFalse); williamr@2: IMPORT_C void SetNaN(); williamr@2: IMPORT_C void SetInfinite(TBool aNegative); williamr@2: IMPORT_C TBool IsZero() const; williamr@2: IMPORT_C TBool IsNaN() const; williamr@2: IMPORT_C TBool IsInfinite() const; williamr@2: IMPORT_C TBool IsFinite() const; williamr@2: IMPORT_C const TRealX &operator+=(const TRealX &aVal); williamr@2: IMPORT_C const TRealX &operator-=(const TRealX &aVal); williamr@2: IMPORT_C const TRealX &operator*=(const TRealX &aVal); williamr@2: IMPORT_C const TRealX &operator/=(const TRealX &aVal); williamr@2: IMPORT_C const TRealX &operator%=(const TRealX &aVal); williamr@2: IMPORT_C TInt AddEq(const TRealX &aVal); williamr@2: IMPORT_C TInt SubEq(const TRealX &aVal); williamr@2: IMPORT_C TInt MultEq(const TRealX &aVal); williamr@2: IMPORT_C TInt DivEq(const TRealX &aVal); williamr@2: IMPORT_C TInt ModEq(const TRealX &aVal); williamr@2: IMPORT_C TRealX operator+() const; williamr@2: IMPORT_C TRealX operator-() const; williamr@2: IMPORT_C TRealX &operator++(); williamr@2: IMPORT_C TRealX operator++(TInt); williamr@2: IMPORT_C TRealX &operator--(); williamr@2: IMPORT_C TRealX operator--(TInt); williamr@2: IMPORT_C TRealX operator+(const TRealX &aVal) const; williamr@2: IMPORT_C TRealX operator-(const TRealX &aVal) const; williamr@2: IMPORT_C TRealX operator*(const TRealX &aVal) const; williamr@2: IMPORT_C TRealX operator/(const TRealX &aVal) const; williamr@2: IMPORT_C TRealX operator%(const TRealX &aVal) const; williamr@2: IMPORT_C TInt Add(TRealX& aResult,const TRealX &aVal) const; williamr@2: IMPORT_C TInt Sub(TRealX& aResult,const TRealX &aVal) const; williamr@2: IMPORT_C TInt Mult(TRealX& aResult,const TRealX &aVal) const; williamr@2: IMPORT_C TInt Div(TRealX& aResult,const TRealX &aVal) const; williamr@2: IMPORT_C TInt Mod(TRealX& aResult,const TRealX &aVal) const; williamr@2: IMPORT_C TRealXOrder Compare(const TRealX& aVal) const; williamr@2: inline TBool operator==(const TRealX &aVal) const; williamr@2: inline TBool operator!=(const TRealX &aVal) const; williamr@2: inline TBool operator>=(const TRealX &aVal) const; williamr@2: inline TBool operator<=(const TRealX &aVal) const; williamr@2: inline TBool operator>(const TRealX &aVal) const; williamr@2: inline TBool operator<(const TRealX &aVal) const; williamr@2: public: williamr@2: /** williamr@2: The mantissa. williamr@2: */ williamr@2: // Represented as two adjacent 32 bit values, rather than one 64 value. williamr@2: // This is to avoid EABI introduced padding overheads and BC breakages. williamr@2: // This representation works because the mantissa is always accessed from williamr@2: // assembler code as two 32 bit quantities. The C++ code that accesses it williamr@2: // now constructs an automatic TInt64 with the two components. williamr@2: TUint32 iMantLo; williamr@2: TUint32 iMantHi; williamr@2: williamr@2: /** williamr@2: The sign: 0 for +, 1 for - williamr@2: */ williamr@2: TInt8 iSign; williamr@2: williamr@2: /** williamr@2: Flags: 0 for exact, 1 for rounded down, 2 for rounded up williamr@2: */ williamr@2: TUint8 iFlag; williamr@2: williamr@2: /** williamr@2: Exponent: biased by 32767, iExp=0 => zero, +65535 => infinity or NaN williamr@2: */ williamr@2: TUint16 iExp; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: struct SPoly williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A structure containing the set of coefficients for a polynomial. williamr@2: williamr@2: @see Math::Poly williamr@2: */ williamr@2: { williamr@2: TInt num; williamr@2: TReal c[1]; williamr@2: }; williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: class Math williamr@2: /** williamr@2: @publishedAll williamr@2: @released williamr@2: williamr@2: A collection of mathematical functions. williamr@2: */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static TInt ACos(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt ASin(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt ATan(TReal &aTrg,const TReal &aSrcY,const TReal &aSrcX); williamr@2: IMPORT_C static TInt Cos(TReal &aTrg,const TReal &aSrc); williamr@2: williamr@2: /** williamr@2: This function is not implemented by Symbian OS. williamr@2: */ williamr@2: IMPORT_C static TInt DtoR(TReal &aTrg,const TDesC &aSrc,TInt &aPos,const TChar aPoint); williamr@2: IMPORT_C static TInt Exp(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Frac(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Int(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Int(TInt16 &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Int(TInt32 &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Log(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Ln(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Mod(TReal &aTrg,const TReal &aSrc,const TReal &aModulus); williamr@2: IMPORT_C static TReal Poly(TReal aVal,const SPoly *aPoly) __SOFTFP; williamr@2: IMPORT_C static TInt Pow(TReal &aTrg,const TReal &aSrc,const TReal &aPower); williamr@2: IMPORT_C static TInt Pow10(TReal &aTrg,const TInt exp); williamr@2: IMPORT_C static TInt Rand(TInt64 &aSeed); williamr@2: IMPORT_C static TReal FRand(TInt64 &aSeed) __SOFTFP; williamr@2: IMPORT_C static TUint32 Random(); williamr@2: IMPORT_C static TInt Round(TReal &aTrg,const TReal &aSrc,TInt aDecimalPlaces); williamr@2: IMPORT_C static TInt Sin(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Sqrt(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TInt Tan(TReal &aTrg,const TReal &aSrc); williamr@2: IMPORT_C static TBool IsZero(const TReal &aVal); williamr@2: IMPORT_C static TBool IsNaN(const TReal &aVal); williamr@2: IMPORT_C static TBool IsInfinite(const TReal &aVal); williamr@2: IMPORT_C static TBool IsFinite(const TReal &aVal); williamr@2: IMPORT_C static void PolyX(TRealX& aY, const TRealX& aX, TInt aDeg, const TRealX *aCoef); williamr@2: static TInt MultPow10X(TRealX& aTrg, TInt aPower); williamr@2: IMPORT_C static void Mul64(Int64 aX, Int64 aY, Int64& aOutH, Uint64& aOutL); williamr@2: IMPORT_C static void UMul64(Uint64 aX, Uint64 aY, Uint64& aOutH, Uint64& aOutL); williamr@2: IMPORT_C static Int64 DivMod64(Int64 aDividend, Int64 aDivisor, Int64& aRemainder); williamr@2: IMPORT_C static Uint64 UDivMod64(Uint64 aDividend, Uint64 aDivisor, Uint64& aRemainder); williamr@2: private: williamr@2: IMPORT_C static void SetZero(TReal &aVal,TInt aSign=0); williamr@2: IMPORT_C static void SetNaN(TReal &aVal); williamr@2: IMPORT_C static void SetInfinite(TReal &aVal,TInt aSign); williamr@2: }; williamr@2: williamr@2: #include williamr@2: williamr@2: #endif // __E32MATH_H__