os/kernelhwsrv/kernel/eka/euser/maths/um_pow10.cpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/kernelhwsrv/kernel/eka/euser/maths/um_pow10.cpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,265 @@
     1.4 +// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
     1.5 +// All rights reserved.
     1.6 +// This component and the accompanying materials are made available
     1.7 +// under the terms of the License "Eclipse Public License v1.0"
     1.8 +// which accompanies this distribution, and is available
     1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
    1.10 +//
    1.11 +// Initial Contributors:
    1.12 +// Nokia Corporation - initial contribution.
    1.13 +//
    1.14 +// Contributors:
    1.15 +//
    1.16 +// Description:
    1.17 +// e32\euser\maths\um_pow10.cpp
    1.18 +// Return a power of 10 as a TReal
    1.19 +// 
    1.20 +//
    1.21 +
    1.22 +#include "um_std.h"
    1.23 +
    1.24 +#if defined(__USE_VFP_MATH) && !defined(__CPU_HAS_VFP)
    1.25 +#error	__USE_VFP_MATH was defined but not __CPU_HAS_VFP - impossible combination, check variant.mmh 
    1.26 +#endif
    1.27 +
    1.28 +
    1.29 +// Tables of powers of 10
    1.30 +LOCAL_D const TUint32 PositivePowersOfTen[] =
    1.31 +	{
    1.32 +// Positive powers 1-31
    1.33 +	0x00000000,0xA0000000,0x80020000,
    1.34 +	0x00000000,0xC8000000,0x80050000,
    1.35 +	0x00000000,0xFA000000,0x80080000,
    1.36 +	0x00000000,0x9C400000,0x800C0000,
    1.37 +	0x00000000,0xC3500000,0x800F0000,
    1.38 +	0x00000000,0xF4240000,0x80120000,
    1.39 +	0x00000000,0x98968000,0x80160000,
    1.40 +	0x00000000,0xBEBC2000,0x80190000,
    1.41 +	0x00000000,0xEE6B2800,0x801C0000,
    1.42 +	0x00000000,0x9502F900,0x80200000,
    1.43 +	0x00000000,0xBA43B740,0x80230000,
    1.44 +	0x00000000,0xE8D4A510,0x80260000,
    1.45 +	0x00000000,0x9184E72A,0x802A0000,
    1.46 +	0x80000000,0xB5E620F4,0x802D0000,
    1.47 +	0xA0000000,0xE35FA931,0x80300000,
    1.48 +	0x04000000,0x8E1BC9BF,0x80340000,
    1.49 +	0xC5000000,0xB1A2BC2E,0x80370000,
    1.50 +	0x76400000,0xDE0B6B3A,0x803A0000,
    1.51 +	0x89E80000,0x8AC72304,0x803E0000,
    1.52 +	0xAC620000,0xAD78EBC5,0x80410000,
    1.53 +	0x177A8000,0xD8D726B7,0x80440000,
    1.54 +	0x6EAC9000,0x87867832,0x80480000,
    1.55 +	0x0A57B400,0xA968163F,0x804B0000,
    1.56 +	0xCCEDA100,0xD3C21BCE,0x804E0000,
    1.57 +	0x401484A0,0x84595161,0x80520000,
    1.58 +	0x9019A5C8,0xA56FA5B9,0x80550000,
    1.59 +	0xF4200F3A,0xCECB8F27,0x80580000,
    1.60 +	0xF8940984,0x813F3978,0x805C0000,
    1.61 +	0x36B90BE5,0xA18F07D7,0x805F0000,
    1.62 +	0x04674EDF,0xC9F2C9CD,0x80620000,
    1.63 +	0x45812296,0xFC6F7C40,0x80650000,
    1.64 +
    1.65 +// Positive powers 32-31*32 in steps of 32
    1.66 +	0x2B70B59E,0x9DC5ADA8,0x80690000,
    1.67 +	0xFFCFA6D5,0xC2781F49,0x80D30000,
    1.68 +	0xC59B14A3,0xEFB3AB16,0x813D0000,
    1.69 +	0x80E98CE0,0x93BA47C9,0x81A80000,
    1.70 +	0x7FE617AA,0xB616A12B,0x82120000,
    1.71 +	0x3927556B,0xE070F78D,0x827C0000,
    1.72 +	0xE33CC930,0x8A5296FF,0x82E70000,
    1.73 +	0x9DF9DE8E,0xAA7EEBFB,0x83510000,
    1.74 +	0x5C6A2F8C,0xD226FC19,0x83BB0000,
    1.75 +	0xF2CCE376,0x81842F29,0x84260000,
    1.76 +	0xDB900AD2,0x9FA42700,0x84900000,
    1.77 +	0xAEF8AA17,0xC4C5E310,0x84FA0000,
    1.78 +	0xE9B09C59,0xF28A9C07,0x85640000,
    1.79 +	0xEBF7F3D4,0x957A4AE1,0x85CF0000,
    1.80 +	0x0795A262,0xB83ED8DC,0x86390000,
    1.81 +	0xA60E91C7,0xE319A0AE,0x86A30000,
    1.82 +	0x432D7BC3,0x8BF61451,0x870E0000,
    1.83 +	0x6B6795FD,0xAC83FB89,0x87780000,
    1.84 +	0xB8FA79B0,0xD4A44FB4,0x87E20000,
    1.85 +	0xE54A9D1D,0x830CF791,0x884D0000,
    1.86 +	0xADE24964,0xA1884B69,0x88B70000,
    1.87 +	0x1F8F01CC,0xC71AA36A,0x89210000,
    1.88 +	0x437028F3,0xF56A298F,0x898B0000,
    1.89 +	0xCD00A68C,0x973F9CA8,0x89F60000,
    1.90 +	0xD7CC9ECD,0xBA6D9B40,0x8A600000,
    1.91 +	0x8D737F0E,0xE5CA5A0B,0x8ACA0000,
    1.92 +	0x1346BDA5,0x8D9E89D1,0x8B350000,
    1.93 +	0xE3D5DBEA,0xAE8F2B2C,0x8B9F0000,
    1.94 +	0x5A0C1B30,0xD7293020,0x8C090000,
    1.95 +	0x0D2ECFD2,0x849A672A,0x8C740000,
    1.96 +	0x41FA93DE,0xA3722C13,0x8CDE0000,
    1.97 +
    1.98 +// Positive powers 1024-8*1024 in steps of 1024
    1.99 +	0x81750C17,0xC9767586,0x8D480000,
   1.100 +	0xC53D5DE5,0x9E8B3B5D,0x9A920000,
   1.101 +	0xD88B5A8B,0xF9895D25,0xA7DB0000,
   1.102 +	0x8A20979B,0xC4605202,0xB5250000,
   1.103 +	0xFED3AB23,0x9A8A7EF0,0xC26F0000,
   1.104 +	0x73A56037,0xF33C80E8,0xCFB80000,
   1.105 +	0x61889066,0xBF6B0EC4,0xDD020000,
   1.106 +	0x7FAF211A,0x96A3A1D1,0xEA4C0000
   1.107 +	};
   1.108 +
   1.109 +LOCAL_D const TUint32 NegativePowersOfTen[] =
   1.110 +	{
   1.111 +// Negative powers 1-31
   1.112 +	0xCCCCCCCD,0xCCCCCCCC,0x7FFB0000,
   1.113 +	0x70A3D70A,0xA3D70A3D,0x7FF80000,
   1.114 +	0x8D4FDF3B,0x83126E97,0x7FF50000,
   1.115 +	0xE219652C,0xD1B71758,0x7FF10000,
   1.116 +	0x1B478423,0xA7C5AC47,0x7FEE0000,
   1.117 +	0xAF6C69B6,0x8637BD05,0x7FEB0000,
   1.118 +	0xE57A42BC,0xD6BF94D5,0x7FE70000,
   1.119 +	0x8461CEFD,0xABCC7711,0x7FE40000,
   1.120 +	0x36B4A597,0x89705F41,0x7FE10000,
   1.121 +	0xBDEDD5BF,0xDBE6FECE,0x7FDD0000,
   1.122 +	0xCB24AAFF,0xAFEBFF0B,0x7FDA0000,
   1.123 +	0x6F5088CC,0x8CBCCC09,0x7FD70000,
   1.124 +	0x4BB40E13,0xE12E1342,0x7FD30000,
   1.125 +	0x095CD80F,0xB424DC35,0x7FD00000,
   1.126 +	0x3AB0ACD9,0x901D7CF7,0x7FCD0000,
   1.127 +	0xC44DE15B,0xE69594BE,0x7FC90000,
   1.128 +	0x36A4B449,0xB877AA32,0x7FC60000,
   1.129 +	0x921D5D07,0x9392EE8E,0x7FC30000,
   1.130 +	0xB69561A5,0xEC1E4A7D,0x7FBF0000,
   1.131 +	0x92111AEB,0xBCE50864,0x7FBC0000,
   1.132 +	0x74DA7BEF,0x971DA050,0x7FB90000,
   1.133 +	0xBAF72CB1,0xF1C90080,0x7FB50000,
   1.134 +	0x95928A27,0xC16D9A00,0x7FB20000,
   1.135 +	0x44753B53,0x9ABE14CD,0x7FAF0000,
   1.136 +	0xD3EEC551,0xF79687AE,0x7FAB0000,
   1.137 +	0x76589DDB,0xC6120625,0x7FA80000,
   1.138 +	0x91E07E48,0x9E74D1B7,0x7FA50000,
   1.139 +	0x8300CA0E,0xFD87B5F2,0x7FA10000,
   1.140 +	0x359A3B3E,0xCAD2F7F5,0x7F9E0000,
   1.141 +	0x5E14FC32,0xA2425FF7,0x7F9B0000,
   1.142 +	0x4B43FCF5,0x81CEB32C,0x7F980000,
   1.143 +
   1.144 +// Negative powers 32-31*32 in steps of 32
   1.145 +	0x453994BA,0xCFB11EAD,0x7F940000,
   1.146 +	0xA539E9A5,0xA87FEA27,0x7F2A0000,
   1.147 +	0xFD75539B,0x88B402F7,0x7EC00000,
   1.148 +	0x64BCE4A1,0xDDD0467C,0x7E550000,
   1.149 +	0xDB73A093,0xB3F4E093,0x7DEB0000,
   1.150 +	0x5423CC06,0x91FF8377,0x7D810000,
   1.151 +	0x4A314EBE,0xECE53CEC,0x7D160000,
   1.152 +	0x637A193A,0xC0314325,0x7CAC0000,
   1.153 +	0x836AC577,0x9BECCE62,0x7C420000,
   1.154 +	0x478238D1,0xFD00B897,0x7BD70000,
   1.155 +	0x46F34F7D,0xCD42A113,0x7B6D0000,
   1.156 +	0xB11B0858,0xA686E3E8,0x7B030000,
   1.157 +	0x3FFC68A6,0x871A4981,0x7A990000,
   1.158 +	0xB6074245,0xDB377599,0x7A2E0000,
   1.159 +	0x79007736,0xB1D983B4,0x79C40000,
   1.160 +	0xDB23D21C,0x9049EE32,0x795A0000,
   1.161 +	0x467F9466,0xEA1F3806,0x78EF0000,
   1.162 +	0xEE5092C7,0xBDF139F0,0x78850000,
   1.163 +	0xB4730DD0,0x9A197865,0x781B0000,
   1.164 +	0x8871347D,0xFA0A6CDB,0x77B00000,
   1.165 +	0x3C8736FC,0xCADB6D31,0x77460000,
   1.166 +	0x52EB8375,0xA493C750,0x76DC0000,
   1.167 +	0x774FB85E,0x85855C0F,0x76720000,
   1.168 +	0x505DE96B,0xD8A66D4A,0x76070000,
   1.169 +	0xCB39A7B1,0xAFC47766,0x759D0000,
   1.170 +	0xA9B05AC8,0x8E997872,0x75330000,
   1.171 +	0xFDC06462,0xE761832E,0x74C80000,
   1.172 +	0xBB827F2D,0xBBB7EF38,0x745E0000,
   1.173 +	0xE1F045DD,0x984B9B19,0x73F40000,
   1.174 +	0x3613F568,0xF71D01E0,0x73890000,
   1.175 +	0x3F64789E,0xC87B6D2F,0x731F0000,
   1.176 +
   1.177 +// Negative powers 1024-8*1024 in steps of 1024
   1.178 +	0xDA57C0BE,0xA2A682A5,0x72B50000,
   1.179 +	0x34362DE4,0xCEAE534F,0x656B0000,
   1.180 +	0x91575A88,0x8350BF3C,0x58220000,
   1.181 +	0xD2CE9FDE,0xA6DD04C8,0x4AD80000,
   1.182 +	0x0DA5D8E8,0xD408CB01,0x3D8E0000,
   1.183 +	0x22EB58E9,0x86B77A60,0x30450000,
   1.184 +	0x4779611E,0xAB2F7655,0x22FB0000,
   1.185 +	0x686DA869,0xD986C20B,0x15B10000
   1.186 +	};
   1.187 +
   1.188 +TInt Math::MultPow10X(TRealX& aTrg, TInt aPower)
   1.189 +	{
   1.190 +	if (aTrg.IsZero())
   1.191 +		return KErrNone;
   1.192 +	if (!aTrg.IsFinite())
   1.193 +		{
   1.194 +		if (aTrg.IsNaN())
   1.195 +			return KErrArgument;
   1.196 +		return KErrOverflow;
   1.197 +		}
   1.198 +	if (aPower==0)
   1.199 +		return KErrNone;
   1.200 +	// smallest non-zero TRealX is 2^-32766=2.83E-9864
   1.201 +	// largest TRealX is 2^32768=1.42E+9864
   1.202 +	// Therefore aPower>=19728 guarantees an overflow
   1.203 +	// and aPower<=-19728 guarantees an underflow
   1.204 +	if (aPower>=19728)
   1.205 +		{
   1.206 +		aTrg.SetInfinite(aTrg.iSign);
   1.207 +		return KErrOverflow;
   1.208 +		}
   1.209 +	if (aPower<=-19728)
   1.210 +		{
   1.211 +		aTrg.SetZero(aTrg.iSign);
   1.212 +		return KErrUnderflow;
   1.213 +		}
   1.214 +	const TRealX* powTab;
   1.215 +	if (aPower>0)
   1.216 +		powTab=(const TRealX*)PositivePowersOfTen;
   1.217 +	else
   1.218 +		{
   1.219 +		aPower=-aPower;
   1.220 +		powTab=(const TRealX*)NegativePowersOfTen;
   1.221 +		}
   1.222 +	TInt r=KErrNone;
   1.223 +	while(aPower>=8192)
   1.224 +		{
   1.225 +		aPower-=8192;
   1.226 +		r=aTrg.MultEq(powTab[31+31+7]);
   1.227 +		if (r!=KErrNone)
   1.228 +			return r;
   1.229 +		}
   1.230 +	TInt bottom5=aPower & 0x1f;
   1.231 +	TInt middle5=(aPower>>5)&0x1f;
   1.232 +	TInt top3=(aPower>>10);
   1.233 +	if (top3)
   1.234 +		r=aTrg.MultEq(powTab[31+31+top3-1]);
   1.235 +	if (r==KErrNone && middle5)
   1.236 +		r=aTrg.MultEq(powTab[31+middle5-1]);
   1.237 +	if (r==KErrNone && bottom5)
   1.238 +		r=aTrg.MultEq(powTab[bottom5-1]);
   1.239 +	return r;
   1.240 +	}
   1.241 +
   1.242 +
   1.243 +
   1.244 +
   1.245 +EXPORT_C TInt Math::Pow10(TReal &aTrg,const TInt aExp)
   1.246 +/**
   1.247 +Calculates the value of 10 to the power of x.
   1.248 +
   1.249 +@param aTrg A reference containing the result. 
   1.250 +@param aExp The power to which 10 is to be raised.
   1.251 +
   1.252 +@return KErrNone if successful, otherwise another of
   1.253 +        the system-wide error codes.
   1.254 +*/
   1.255 +//
   1.256 +// Write the binary floating point representation of a power of 10 to aSrc
   1.257 +// Returns KErrNone if OK or a negative error number otherwise.
   1.258 +//
   1.259 +	{
   1.260 +#ifndef __USE_VFP_MATH
   1.261 +	TRealX x=1;
   1.262 +	TInt r=Math::MultPow10X(x,aExp);
   1.263 +	TInt s=x.GetTReal(aTrg);
   1.264 +	return (r==KErrNone)?s:r;
   1.265 +#else // __USE_VFP_MATH
   1.266 +	return Math::Pow(aTrg,10,aExp);
   1.267 +#endif
   1.268 +	}