| 0 |      1 | // Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
 | 
|  |      2 | // All rights reserved.
 | 
|  |      3 | // This component and the accompanying materials are made available
 | 
|  |      4 | // under the terms of the License "Eclipse Public License v1.0"
 | 
|  |      5 | // which accompanies this distribution, and is available
 | 
|  |      6 | // at the URL "http://www.eclipse.org/legal/epl-v10.html".
 | 
|  |      7 | //
 | 
|  |      8 | // Initial Contributors:
 | 
|  |      9 | // Nokia Corporation - initial contribution.
 | 
|  |     10 | //
 | 
|  |     11 | // Contributors:
 | 
|  |     12 | //
 | 
|  |     13 | // Description:
 | 
|  |     14 | // e32test\math\t_math.cpp
 | 
|  |     15 | // T_MATH.CPP - Test routines for the maths functions
 | 
|  |     16 | // NB When considering the accuracy of the results (i.e. the tolerance used in testApprox()) it
 | 
|  |     17 | // should be remembered that the results expected are not always given to full precision and so
 | 
|  |     18 | // the results obtained are mostly as accurate as can be expected.
 | 
|  |     19 | // Overview:
 | 
|  |     20 | // Test functionality of the Math library.
 | 
|  |     21 | // API Information:
 | 
|  |     22 | // Math.
 | 
|  |     23 | // Details:
 | 
|  |     24 | // - Test math's trigonometric, powers, roots, logs, modulo, sqrt, exp,
 | 
|  |     25 | // Int, Frac, rounding for range of input values are as expected.
 | 
|  |     26 | // - Test the returned error values are as expected when illegal math's
 | 
|  |     27 | // operations are done.
 | 
|  |     28 | // - Check the return value is KErrTotalLossOfPrecision when incorrect values
 | 
|  |     29 | // is passed to modulo function.
 | 
|  |     30 | // - Test for success when the same variable for both operands in some 
 | 
|  |     31 | // Math functions are used.
 | 
|  |     32 | // Platforms/Drives/Compatibility:
 | 
|  |     33 | // All.
 | 
|  |     34 | // Assumptions/Requirement/Pre-requisites:
 | 
|  |     35 | // Failures and causes:
 | 
|  |     36 | // Base Port information:
 | 
|  |     37 | // 
 | 
|  |     38 | //
 | 
|  |     39 | 
 | 
|  |     40 | #include "t_math.h"
 | 
|  |     41 | #include "t_vals.h"
 | 
|  |     42 | 
 | 
|  |     43 | LOCAL_D RTest test(_L("T_MATH"));
 | 
|  |     44 | 
 | 
|  |     45 | LOCAL_D TInt64 rseed = MAKE_TINT64(123456789,987654321);
 | 
|  |     46 | 
 | 
|  |     47 | typedef struct
 | 
|  |     48 |     {
 | 
|  |     49 |     TReal num; // input number
 | 
|  |     50 |     TReal res; // expected result
 | 
|  |     51 |     } SQRT_TEST;
 | 
|  |     52 | 
 | 
|  |     53 | LOCAL_D SQRT_TEST testsqrt[]=
 | 
|  |     54 |     {
 | 
|  |     55 |     {0.0,0.0}, // zero
 | 
|  |     56 | 	{KNegZeroTReal64,KNegZeroTReal64},
 | 
|  |     57 |     {1.0,1.0},
 | 
|  |     58 |     {.64,.8},
 | 
|  |     59 |     {.81,.9},
 | 
|  |     60 |     {9,3},
 | 
|  |     61 |     {25,5},
 | 
|  |     62 |     {10000,100},
 | 
|  |     63 |     {400,20},
 | 
|  |     64 |     {6.25,2.5},
 | 
|  |     65 |     {1E-98,1E-49},
 | 
|  |     66 |     {1E-98,1E-49},
 | 
|  |     67 |     {1E98,1E49},
 | 
|  |     68 |     {1.0000000001,1.00000000005}
 | 
|  |     69 |     };
 | 
|  |     70 | 
 | 
|  |     71 | typedef struct
 | 
|  |     72 |     {
 | 
|  |     73 |     TReal num; // input number
 | 
|  |     74 |     TReal res; // expected result
 | 
|  |     75 |     } TESTLN;
 | 
|  |     76 | 
 | 
|  |     77 | LOCAL_D TESTLN testln[]=
 | 
|  |     78 |     {
 | 
|  |     79 |     {.001,-6.9077552789821317},
 | 
|  |     80 |     {.002,-6.2146080984221917},
 | 
|  |     81 |     {.023,-3.7722610630529874},
 | 
|  |     82 |     {.004,-5.5214609178622464},
 | 
|  |     83 |     {.050,-2.9957322735539910},
 | 
|  |     84 |     {.100,-2.3025850929940457},
 | 
|  |     85 |     {.150,-1.8971199848858813},
 | 
|  |     86 |     {.200,-1.6094379124341004},
 | 
|  |     87 |     {.250,-1.3862943611198906},
 | 
|  |     88 |     {.300,-1.2039728043259360},
 | 
|  |     89 |     {.350,-1.0498221244986777},
 | 
|  |     90 |     {.400,-0.9162907318741551},
 | 
|  |     91 |     {.450,-0.7985076962177716},
 | 
|  |     92 |     {.500,-0.6931471805599453},
 | 
|  |     93 |     {.550,-0.5978370007556204},
 | 
|  |     94 |     {.600,-0.5108256237659907},
 | 
|  |     95 |     {.650,-0.4307829160924543},
 | 
|  |     96 |     {.700,-0.3566749439387324},
 | 
|  |     97 |     {.750,-0.2876820724517809},
 | 
|  |     98 |     {.980,-0.0202027073175194},
 | 
|  |     99 |     {.985,-0.0151136378100482},
 | 
|  |    100 |     {.990,-0.0100503358535014},
 | 
|  |    101 |     {.995,-0.0050125418235443},
 | 
|  |    102 |     {.088,-2.4304184645039306},
 | 
|  |    103 |     {1,0}
 | 
|  |    104 |     };
 | 
|  |    105 | 
 | 
|  |    106 | typedef struct
 | 
|  |    107 |     {
 | 
|  |    108 |     TReal val; // value for which the exponent is to be found
 | 
|  |    109 |     TReal result; // result
 | 
|  |    110 |     } EXP;
 | 
|  |    111 | 
 | 
|  |    112 | LOCAL_D EXP testexp[]=
 | 
|  |    113 |     {
 | 
|  |    114 |     {4E-20,1.0}, 
 | 
|  |    115 | 	{5.4E-20,1.0},
 | 
|  |    116 | 	{0.0,1.0},
 | 
|  |    117 | 	{5E-324,1.0},
 | 
|  |    118 |     };
 | 
|  |    119 | 
 | 
|  |    120 | typedef struct
 | 
|  |    121 |     {
 | 
|  |    122 |     TReal number; // number to be raised to a power
 | 
|  |    123 |     TReal power; // power
 | 
|  |    124 |     TReal result; // result
 | 
|  |    125 |     } POWER;
 | 
|  |    126 | 
 | 
|  |    127 | LOCAL_D POWER testpow[]=
 | 
|  |    128 |     {
 | 
|  |    129 | 	{45,3,91125.0},
 | 
|  |    130 | 	{-2,4,16},
 | 
|  |    131 |     {2,-3,0.125},
 | 
|  |    132 |     {-2,3,-8},
 | 
|  |    133 |     {16,20,1.208925819614628E+24},
 | 
|  |    134 |     };
 | 
|  |    135 | 
 | 
|  |    136 | // Added by AnnW, October 1996
 | 
|  |    137 | LOCAL_D const POWER testpowexact[]=
 | 
|  |    138 | 	{
 | 
|  |    139 | 	{0.0,1.0,0.0},
 | 
|  |    140 | 	{0,7,0},
 | 
|  |    141 | 	{0.0,16.0,0.0},
 | 
|  |    142 | 	{0.0,3.9271E-17,0.0},
 | 
|  |    143 | 	{-2,0,1},
 | 
|  |    144 |     {1,0,1},
 | 
|  |    145 | 	{1.545243,0,1},
 | 
|  |    146 | 	{4.8,0.0,1.0},
 | 
|  |    147 | 	{195.0,0.0,1.0},
 | 
|  |    148 | 	{1.0E-7,0.0,1.0},
 | 
|  |    149 | 	{1.0,2.0,1.0},
 | 
|  |    150 | 	{1.0,1.0E-6,1.0},
 | 
|  |    151 | 	{1.0,1.0E+10,1.0},
 | 
|  |    152 | 	{-1.0,2.0,1.0},
 | 
|  |    153 | 	{-1.0,1.0000000001E+10,-1.0},
 | 
|  |    154 | 	{-1.0,1.0E+10,1.0},
 | 
|  |    155 | 	{1.593704102953967e+3,1.0,1.593704102953967e+3},
 | 
|  |    156 | 	{1.234567E+50,1.0,1.234567E+50},
 | 
|  |    157 | 	{1.2345678901234567E+146,1.0,1.2345678901234567E+146},
 | 
|  |    158 | 	{-7.6543210987654321E-53,1.0,-7.6543210987654321E-53},
 | 
|  |    159 | 	{0.0,2.0,0.0},
 | 
|  |    160 | 	{KNegZeroTReal64,4.0,0.0},
 | 
|  |    161 | 	{KPosInfTReal64,-2.0,0.0},
 | 
|  |    162 | 	{KNegInfTReal64,-2.0,0.0},
 | 
|  |    163 | 	{2.0,KNegInfTReal64,0.0},
 | 
|  |    164 | 	{-2.0,KNegInfTReal64,0.0},
 | 
|  |    165 | 	{0.5,KPosInfTReal64,0.0},
 | 
|  |    166 | 	{-0.5,KPosInfTReal64,0.0},
 | 
|  |    167 | 	{KPosInfTReal64,-5.0,0.0},
 | 
|  |    168 | 	{KPosInfTReal64,-6.0,0.0},
 | 
|  |    169 | 	{KNegInfTReal64,KNegInfTReal64,0.0},
 | 
|  |    170 | 	{KPosInfTReal64,KNegInfTReal64,0.0},
 | 
|  |    171 | 	};
 | 
|  |    172 | 
 | 
|  |    173 | // Check ISO requirements on Pow()
 | 
|  |    174 | //
 | 
|  |    175 | typedef struct
 | 
|  |    176 | 	{
 | 
|  |    177 | 	TReal number;	// number to be raised to a power
 | 
|  |    178 | 	TReal power;	// power
 | 
|  |    179 | 	TInt rc;		// return value from Pow()
 | 
|  |    180 | 	TReal result;	// numerical result
 | 
|  |    181 | 	} POWERISO;
 | 
|  |    182 | 
 | 
|  |    183 | const TReal KPosZeroTReal64 = 0.0;
 | 
|  |    184 | 
 | 
|  |    185 | LOCAL_D const POWERISO testpow_iso[] =
 | 
|  |    186 | 	{
 | 
|  |    187 | 	// pow(+/-0, y) returns +/-INF and raises the ''divide-by-zero''
 | 
|  |    188 | 	// floating-point exception for y an odd integer < 0
 | 
|  |    189 | 	{ KPosZeroTReal64, -3.0, KErrOverflow, KPosInfTReal64 },	// 0
 | 
|  |    190 | 	{ KNegZeroTReal64, -3.0, KErrOverflow, KNegInfTReal64 },	// 1
 | 
|  |    191 | 
 | 
|  |    192 | 	// pow(+/-0, y) returns +INF and raises the ''divide-by-zero''
 | 
|  |    193 | 	// floating-point exception for y < 0 and not an odd integer
 | 
|  |    194 | 	{ KPosZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 },	// 2
 | 
|  |    195 | 	{ KNegZeroTReal64, -2.0, KErrOverflow, KPosInfTReal64 },	// 3
 | 
|  |    196 | 
 | 
|  |    197 | 	// pow(+/-0, y) returns +/-0 for y an odd integer > 0
 | 
|  |    198 | 	{ KPosZeroTReal64, 3.0, KErrNone, KPosZeroTReal64 },		// 4
 | 
|  |    199 | 	{ KNegZeroTReal64, 3.0, KErrNone, KNegZeroTReal64 },		// 5
 | 
|  |    200 | 
 | 
|  |    201 | 	// pow(+/-0, y) returns +0 for y > 0 and not an odd integer
 | 
|  |    202 | 	{ KPosZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 },		// 6
 | 
|  |    203 | 	{ KNegZeroTReal64, 2.0, KErrNone, KPosZeroTReal64 },		// 7
 | 
|  |    204 | 
 | 
|  |    205 | 	// pow(-1, +/-INF) returns 1
 | 
|  |    206 | 	{ -1.0, KPosInfTReal64, KErrNone, 1.0 },					// 8
 | 
|  |    207 | 	{ -1.0, KNegInfTReal64, KErrNone, 1.0 },					// 9
 | 
|  |    208 | 
 | 
|  |    209 | 	// pow(+1, y) returns 1 for any y, even a NaN
 | 
|  |    210 | 	{ 1.0, 1.0, KErrNone, 1.0 },								// 10
 | 
|  |    211 | 	{ 1.0, 10.0, KErrNone, 1.0 },								// 11
 | 
|  |    212 | 	{ 1.0, -1.0, KErrNone, 1.0 },								// 12
 | 
|  |    213 | 	{ 1.0, -10.0, KErrNone, 1.0 },								// 13
 | 
|  |    214 | 	{ 1.0, 0.5, KErrNone, 1.0 },								// 14
 | 
|  |    215 | 	{ 1.0, -0.5, KErrNone, 1.0 },								// 15
 | 
|  |    216 | 	{ 1.0, KPosInfTReal64, KErrNone, 1.0 },						// 16
 | 
|  |    217 | 	{ 1.0, KNegInfTReal64, KErrNone, 1.0 },						// 17
 | 
|  |    218 | 	{ 1.0, KNaNTReal64, KErrNone, 1.0 },						// 18
 | 
|  |    219 | 
 | 
|  |    220 | 	// pow(x, +/-0) returns 1 for any x, even a NaN
 | 
|  |    221 | 	{  1.0, KPosZeroTReal64, KErrNone, 1.0 },					// 19
 | 
|  |    222 | 	{  1.0, KNegZeroTReal64, KErrNone, 1.0 },					// 20
 | 
|  |    223 | 	{  2.0, KPosZeroTReal64, KErrNone, 1.0 },					// 21
 | 
|  |    224 | 	{  2.0, KNegZeroTReal64, KErrNone, 1.0 },					// 22
 | 
|  |    225 | 	{  0.5, KPosZeroTReal64, KErrNone, 1.0 },					// 23
 | 
|  |    226 | 	{  0.5, KNegZeroTReal64, KErrNone, 1.0 },					// 24
 | 
|  |    227 | 	{ -1.0, KPosZeroTReal64, KErrNone, 1.0 },					// 25
 | 
|  |    228 | 	{ -1.0, KNegZeroTReal64, KErrNone, 1.0 },					// 26
 | 
|  |    229 | 	{ -2.0, KPosZeroTReal64, KErrNone, 1.0 },					// 27
 | 
|  |    230 | 	{ -2.0, KNegZeroTReal64, KErrNone, 1.0 },					// 28
 | 
|  |    231 | 	{ -0.5, KPosZeroTReal64, KErrNone, 1.0 },					// 29
 | 
|  |    232 | 	{ -0.5, KNegZeroTReal64, KErrNone, 1.0 },					// 30
 | 
|  |    233 | 	{ KPosZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 },		// 31
 | 
|  |    234 | 	{ KPosZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 },		// 32
 | 
|  |    235 | 	{ KNegZeroTReal64, KPosZeroTReal64, KErrNone, 1.0 },		// 33
 | 
|  |    236 | 	{ KNegZeroTReal64, KNegZeroTReal64, KErrNone, 1.0 },		// 34
 | 
|  |    237 | 	{ KPosInfTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 35
 | 
|  |    238 | 	{ KPosInfTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 36
 | 
|  |    239 | 	{ KNegInfTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 37
 | 
|  |    240 | 	{ KNegInfTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 38
 | 
|  |    241 | 	{ KNaNTReal64, KPosZeroTReal64, KErrNone, 1.0 },			// 39
 | 
|  |    242 | 	{ KNaNTReal64, KNegZeroTReal64, KErrNone, 1.0 },			// 40
 | 
|  |    243 | 
 | 
|  |    244 | 	// pow(x, y) returns a NaN and raises the ''invalid'' floating-point
 | 
|  |    245 | 	// exception for finite x < 0 and finite non-integer y
 | 
|  |    246 | 	{ -1.0, 1.5, KErrArgument, KNaNTReal64 },					// 41
 | 
|  |    247 | 
 | 
|  |    248 | 	// pow(x, -INF) returns +INF for |x| < 1
 | 
|  |    249 | 	{ 0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 },		// 42
 | 
|  |    250 | 	{ -0.5, KNegInfTReal64, KErrOverflow, KPosInfTReal64 },		// 43
 | 
|  |    251 | 
 | 
|  |    252 | 	// pow(x, -INF) returns +0 for |x| > 1
 | 
|  |    253 | 	{ 2, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 44
 | 
|  |    254 | 	{ -2, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 45
 | 
|  |    255 | 	{ 4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 },			// 46
 | 
|  |    256 | 	{ -4.5, KNegInfTReal64, KErrNone, KPosZeroTReal64 },		// 47
 | 
|  |    257 | 
 | 
|  |    258 | 	// pow(x, +INF) returns +0 for |x| < 1
 | 
|  |    259 | 	{ .5, KPosInfTReal64, KErrNone, KPosZeroTReal64 },			// 48
 | 
|  |    260 | 	{ -.5, KPosInfTReal64, KErrNone, KPosZeroTReal64 },			// 49
 | 
|  |    261 | 
 | 
|  |    262 | 	// pow(x, +INF) returns +INF for |x| > 1
 | 
|  |    263 | 	{ 2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 50
 | 
|  |    264 | 	{ -2, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 51
 | 
|  |    265 | 	{ 4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 52
 | 
|  |    266 | 	{ -4.5, KPosInfTReal64, KErrOverflow, KPosInfTReal64 },		// 53
 | 
|  |    267 | 
 | 
|  |    268 | 	// pow(-INF, y) returns -0 for y an odd integer < 0
 | 
|  |    269 | 	{ KNegInfTReal64, -1, KErrNone, KNegZeroTReal64 },			// 54
 | 
|  |    270 | 	{ KNegInfTReal64, -5, KErrNone, KNegZeroTReal64 },			// 55
 | 
|  |    271 | 
 | 
|  |    272 | 	// pow(-INF, y) returns +0 for y < 0 and not an odd integer
 | 
|  |    273 | 	{ KNegInfTReal64, -2, KErrNone, KPosZeroTReal64 },			// 56
 | 
|  |    274 | 	{ KNegInfTReal64, -5.5, KErrNone, KPosZeroTReal64 },		// 57
 | 
|  |    275 | 
 | 
|  |    276 | 	// pow(-INF, y) returns -INF for y an odd integer > 0
 | 
|  |    277 | 	{ KNegInfTReal64, 1, KErrOverflow, KNegInfTReal64 },		// 58
 | 
|  |    278 | 	{ KNegInfTReal64, 5, KErrOverflow, KNegInfTReal64 },		// 59
 | 
|  |    279 | 
 | 
|  |    280 | 	// pow(-INF, y) returns +INF for y > 0 and not an odd integer
 | 
|  |    281 | 	{ KNegInfTReal64, 2, KErrOverflow, KPosInfTReal64 },		// 60
 | 
|  |    282 | 	{ KNegInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 },		// 61
 | 
|  |    283 | 
 | 
|  |    284 | 	// pow(+INF, y) returns +0 for y < 0
 | 
|  |    285 | 	{ KPosInfTReal64, -1, KErrNone, KPosZeroTReal64 },			// 62
 | 
|  |    286 | 	{ KPosInfTReal64, -2, KErrNone, KPosZeroTReal64 },			// 63
 | 
|  |    287 | 	{ KPosInfTReal64, -5, KErrNone, KPosZeroTReal64 },			// 64
 | 
|  |    288 | 	{ KPosInfTReal64, -5.5, KErrNone, KPosZeroTReal64 },		// 65
 | 
|  |    289 | 
 | 
|  |    290 | 	// pow(+INF, y) returns +INF for y > 0
 | 
|  |    291 | 	{ KPosInfTReal64, 1, KErrOverflow, KPosInfTReal64 },		// 66
 | 
|  |    292 | 	{ KPosInfTReal64, 2, KErrOverflow, KPosInfTReal64 },		// 67
 | 
|  |    293 | 	{ KPosInfTReal64, 5, KErrOverflow, KPosInfTReal64 },		// 68
 | 
|  |    294 | 	{ KPosInfTReal64, 5.5, KErrOverflow, KPosInfTReal64 },		// 69
 | 
|  |    295 | 	};
 | 
|  |    296 | 
 | 
|  |    297 | struct POW10_TEST
 | 
|  |    298 |     {
 | 
|  |    299 |     TInt num; // input number
 | 
|  |    300 |     TReal res; // expected result
 | 
|  |    301 |     };
 | 
|  |    302 | 
 | 
|  |    303 | LOCAL_D POW10_TEST pow10teste[]=
 | 
|  |    304 | 	{
 | 
|  |    305 | 	{300,1.0E300},		
 | 
|  |    306 | 	{-162,1.0E-162},
 | 
|  |    307 | 	{-300,1.0E-300},
 | 
|  |    308 | 	{-99,1.0E-99},
 | 
|  |    309 | //	};
 | 
|  |    310 | 
 | 
|  |    311 | //LOCAL_D POW10_TEST pow10testa[]=
 | 
|  |    312 | //	{
 | 
|  |    313 | 	{99,1.0E99},
 | 
|  |    314 | 	{283,1.0E283},
 | 
|  |    315 | 	{-89,1.0E-89},
 | 
|  |    316 | 	{-200,1.0E-200},
 | 
|  |    317 | 	{-43,1.0E-43},
 | 
|  |    318 | 	{24,1.0E24},
 | 
|  |    319 |  	{-310,K1EMinus310Real64},
 | 
|  |    320 |  	{-323,K1EMinus323Real64}
 | 
|  |    321 | 	};
 | 
|  |    322 | 
 | 
|  |    323 | typedef struct
 | 
|  |    324 |     {
 | 
|  |    325 |     TReal num; // input number
 | 
|  |    326 |     TReal res; // expected result
 | 
|  |    327 |     } TESTSINE;
 | 
|  |    328 | 
 | 
|  |    329 | #pragma warning ( disable : 4204 ) // non-constant aggregate initializer
 | 
|  |    330 | LOCAL_D TESTSINE testsin[]=
 | 
|  |    331 |     {
 | 
|  |    332 | 	{0.5,0.4794255386042029},						// These were found using S3a
 | 
|  |    333 | 	{1.2,0.9320390859672263},
 | 
|  |    334 | 	{1.6,0.9995736030415051},
 | 
|  |    335 | 	{28.6,-0.3199399618841981},
 | 
|  |    336 | 	{-18.3,0.5223085896267315},
 | 
|  |    337 | 	{KPi/4,0.7071067811865474},
 | 
|  |    338 | 	{3*KPi/4,0.7071067811865474},
 | 
|  |    339 | 	{5*KPi/4,-0.7071067811865474},
 | 
|  |    340 | 	{-KPi/4,-0.7071067811865474},
 | 
|  |    341 | 	{KPi/3,0.8660254037844387},
 | 
|  |    342 | 	{-KPi/3,-0.8660254037844387},
 | 
|  |    343 | 	{KPi/6,0.5},
 | 
|  |    344 | 	{-KPi/6,-0.5},
 | 
|  |    345 | 	{150*KDegToRad,0.5},
 | 
|  |    346 | 	{210*KDegToRad,-0.5},
 | 
|  |    347 | //	{KPi+1.0E-15,-7.657143961860984E-16},	// loss of significance will limit accuracy here
 | 
|  |    348 | //	2*(KPi+1.0E-15),1.5314287923721969e-15}
 | 
|  |    349 |     };
 | 
|  |    350 |     
 | 
|  |    351 | typedef struct
 | 
|  |    352 |     {
 | 
|  |    353 |     TReal num; // input number
 | 
|  |    354 |     TReal res; // expected result
 | 
|  |    355 |     } TESTCOSINE;
 | 
|  |    356 | 
 | 
|  |    357 | LOCAL_D TESTCOSINE testcos[]=
 | 
|  |    358 | 	{
 | 
|  |    359 | 	{0.5,0.8775825618903727},			// These were found using S3a
 | 
|  |    360 | 	{1.2,0.3623577544766734},
 | 
|  |    361 | 	{1.6,-0.0291995223012888},
 | 
|  |    362 | 	{28.6,-0.9474378189567576},
 | 
|  |    363 | 	{-18.3,0.8527565521308730},
 | 
|  |    364 | 	{KPi/4,0.7071067811865474},
 | 
|  |    365 | 	{3*KPi/4,-0.7071067811865474},
 | 
|  |    366 | 	{5*KPi/4,-0.7071067811865474},
 | 
|  |    367 | 	{-KPi/4,0.7071067811865474},
 | 
|  |    368 | 	{KPi/6,0.8660254037844387},
 | 
|  |    369 | 	{5*KPi/6,-0.8660254037844387},
 | 
|  |    370 | 	{KPi/3,0.5},
 | 
|  |    371 | 	{4*KPi/3,-0.5},
 | 
|  |    372 | 	{120*KDegToRad,-0.5},
 | 
|  |    373 | 	{300*KDegToRad,0.5},
 | 
|  |    374 | 	{KPi+1.0E-15,-1.0},
 | 
|  |    375 | 	{2*(KPi+1.0E-15),1.0}
 | 
|  |    376 | 	};
 | 
|  |    377 | 
 | 
|  |    378 | typedef struct
 | 
|  |    379 |     {
 | 
|  |    380 |     TReal angle; // angle for which the tangent is to be found
 | 
|  |    381 |     TReal result; // result
 | 
|  |    382 |     } TAN;
 | 
|  |    383 | 
 | 
|  |    384 | LOCAL_D TAN testtan[]=
 | 
|  |    385 |     {
 | 
|  |    386 | 	{KPi/4,1.0},
 | 
|  |    387 | 	{-KPi/4,-1.0},
 | 
|  |    388 | 	{45*KDegToRad,1.0},
 | 
|  |    389 | 	{KPi/3,1.732050807568877},					// Added by AnnW - Calculated on S3a
 | 
|  |    390 | 	{2*KPi/3,-1.732050807568878},				//
 | 
|  |    391 | 	{KPi/6,0.5773502691896257},					//
 | 
|  |    392 | 	{-KPi/6,-0.5773502691896257},				//
 | 
|  |    393 | 	{89*KDegToRad,57.28996163075913},			// these two should be the same!
 | 
|  |    394 | 	{91*KDegToRad,-57.28996163075955},			//
 | 
|  |    395 |     {4E-123,4E-123},								
 | 
|  |    396 |     {-4E-123,-4E-123},	
 | 
|  |    397 |     };
 | 
|  |    398 |     
 | 
|  |    399 | typedef struct
 | 
|  |    400 |     {
 | 
|  |    401 |     TReal num; // input number
 | 
|  |    402 |     TReal res; // expected result
 | 
|  |    403 |     } TESTASC;
 | 
|  |    404 | 
 | 
|  |    405 | LOCAL_D TESTASC testas[]=
 | 
|  |    406 |     {
 | 
|  |    407 |     {.75,.848062078981},
 | 
|  |    408 |     {.82,.961411018764},
 | 
|  |    409 |     {.87,1.055202320549},
 | 
|  |    410 |     {.89,1.097345169523},
 | 
|  |    411 |     {.90,1.119769514999},
 | 
|  |    412 |     {.92,1.168080485214},
 | 
|  |    413 |     {.94,1.222630305522},
 | 
|  |    414 |     {.96,1.287002217587},
 | 
|  |    415 |     {.99,1.429256853470},
 | 
|  |    416 |     {1.0,1.570796326795},
 | 
|  |    417 | 	{0.0,0},
 | 
|  |    418 | 	{-1.0, -90.0*KDegToRad},
 | 
|  |    419 | 	{0.5,30.0*KDegToRad}
 | 
|  |    420 |     };
 | 
|  |    421 | 
 | 
|  |    422 | typedef struct
 | 
|  |    423 |     {
 | 
|  |    424 |     TReal num1; // Divisor
 | 
|  |    425 |     TReal num2; // Divand
 | 
|  |    426 |     TReal res; // expected result
 | 
|  |    427 |     } TESTATAN2;
 | 
|  |    428 | 
 | 
|  |    429 | LOCAL_D TESTATAN2 testat2[]=
 | 
|  |    430 |     {
 | 
|  |    431 |     {5E-49,7E306,0.0}, // underflow, zero returned
 | 
|  |    432 |     {5E49,7E-306,KPiBy2}, // overflow, pi/2 returned
 | 
|  |    433 |     {0.45,0.5,0.732815101787},
 | 
|  |    434 |     {0.12,0.3,0.380506377112},
 | 
|  |    435 |     {0.3,0.0,KPiBy2}, // overflow, pi/2 returned
 | 
|  |    436 |     {-0.3,0.0,-KPiBy2}, // overflow, -pi/2 returned
 | 
|  |    437 |     {0.0,0.3,0.0},
 | 
|  |    438 |     };
 | 
|  |    439 | #pragma warning ( default : 4204 )
 | 
|  |    440 | 
 | 
|  |    441 | typedef struct
 | 
|  |    442 |     {
 | 
|  |    443 |     TReal num; // input number
 | 
|  |    444 |     TReal res; // expected result
 | 
|  |    445 |     } INT_TEST;
 | 
|  |    446 | 
 | 
|  |    447 | LOCAL_D INT_TEST testint1[]=
 | 
|  |    448 |     {
 | 
|  |    449 |     {1.0,1.0},
 | 
|  |    450 |     {1.47934,1.0},
 | 
|  |    451 |     {-72.86345,-72.0},
 | 
|  |    452 |     {-734.9999,-734.0},
 | 
|  |    453 |     {4855.9974,4855.0},
 | 
|  |    454 |     {232478.35,232478.0},
 | 
|  |    455 |     {0.029345,0.0},
 | 
|  |    456 |     {0.9437,0.0},
 | 
|  |    457 |     {-0.2634,0.0},
 | 
|  |    458 |     {-0.98976,0.0},
 | 
|  |    459 |     {32769.36946,32769.0},
 | 
|  |    460 |     {-32774.997937,-32774.0},
 | 
|  |    461 |     {8738465.38749,8738465.0},
 | 
|  |    462 |     {-2348645.34965,-2348645.0},
 | 
|  |    463 |     {2147483655.7565,2147483655.0},
 | 
|  |    464 |     {-2147483657.89453,-2147483657.0},
 | 
|  |    465 |     {2374843546.34E2,2374843546.34E2},
 | 
|  |    466 |     {34780656.37643E12,34780656.37643E12},
 | 
|  |    467 |     {-2374843546.34E2,-2374843546.34E2},
 | 
|  |    468 |     {-34780656.37643E12,-34780656.37643E12},
 | 
|  |    469 |     {468650.3874E47,468650.3874E47},
 | 
|  |    470 |     {-4965.5987636E34,-4965.5987636E34},
 | 
|  |    471 |     };
 | 
|  |    472 | 
 | 
|  |    473 | typedef struct
 | 
|  |    474 |     {
 | 
|  |    475 |     TReal num; // input number
 | 
|  |    476 |     TInt16 res; // expected result
 | 
|  |    477 |     } INTI_TEST;
 | 
|  |    478 | 
 | 
|  |    479 | LOCAL_D INTI_TEST testint2[]=
 | 
|  |    480 |     {
 | 
|  |    481 |     {1.0,1},
 | 
|  |    482 |     {1.47934,1},
 | 
|  |    483 |     {-72.86345,-72},
 | 
|  |    484 |     {-734.9999,-734},
 | 
|  |    485 |     {4855.9974,4855},
 | 
|  |    486 |     {0.029345,0},
 | 
|  |    487 |     {0.9437,0},
 | 
|  |    488 |     {-0.2634,0},
 | 
|  |    489 |     {-0.98976,0},
 | 
|  |    490 |     {3234.56,3234},
 | 
|  |    491 |     {4698.435,4698},
 | 
|  |    492 |     {-32767.47658,-32767},
 | 
|  |    493 |     {32767.9830857,32767},
 | 
|  |    494 |     {-32768.47658,-32767-1}
 | 
|  |    495 |     };
 | 
|  |    496 | 
 | 
|  |    497 | typedef struct
 | 
|  |    498 |     {
 | 
|  |    499 |     TReal num; // input number
 | 
|  |    500 |     TInt32 res; // expected result
 | 
|  |    501 |     } INTL_TEST;
 | 
|  |    502 | 
 | 
|  |    503 | LOCAL_D INTL_TEST testint3[]=
 | 
|  |    504 |     {
 | 
|  |    505 |     {1.0,1l},
 | 
|  |    506 |     {1.47934,1l},
 | 
|  |    507 |     {-72.86345,-72l},
 | 
|  |    508 |     {-734.9999,-734l},
 | 
|  |    509 |     {4855.9974,4855l},
 | 
|  |    510 |     {0.029345,0l},
 | 
|  |    511 |     {0.9437,0l},
 | 
|  |    512 |     {-0.2634,0l},
 | 
|  |    513 |     {-0.98976,0l},
 | 
|  |    514 |     {3234.56,3234l},
 | 
|  |    515 |     {4698.435,4698l},
 | 
|  |    516 |     {-32767.47658,-32767l},
 | 
|  |    517 |     {32767.9830857,32767l},
 | 
|  |    518 |     {32769.36946,32769l},
 | 
|  |    519 |     {-32774.997937,-32774l},
 | 
|  |    520 |     {64835903.74605,64835903l},
 | 
|  |    521 |     {-46652024.393,-46652024l},
 | 
|  |    522 |     {2147483647.34576,2147483647l},
 | 
|  |    523 |     {-2147483647.9501,-2147483647l},
 | 
|  |    524 |     {-2147483648.00,0x80000000l}, 
 | 
|  |    525 |     {-2147483648.6843,0x80000000l}
 | 
|  |    526 |     };
 | 
|  |    527 | 
 | 
|  |    528 | typedef struct
 | 
|  |    529 |     {
 | 
|  |    530 |     TReal num; // input number
 | 
|  |    531 |     TReal res; // expected result
 | 
|  |    532 |     } FRAC_TEST;
 | 
|  |    533 | 
 | 
|  |    534 | LOCAL_D FRAC_TEST testfrac[]=
 | 
|  |    535 |     {
 | 
|  |    536 | 	{0.0,0.0},
 | 
|  |    537 | 	{KNegZeroTReal64,0.0},
 | 
|  |    538 |     {1.0,0.0},
 | 
|  |    539 |     {1.47934,.47934},
 | 
|  |    540 |     {-72.86345,-.86345},
 | 
|  |    541 |     {-734.9999,-.9999},
 | 
|  |    542 |     {4855.9974,.9974},
 | 
|  |    543 |     {232478.35,.35},
 | 
|  |    544 |     {0.029345,.029345},
 | 
|  |    545 |     {0.9437,0.9437},
 | 
|  |    546 |     {-0.2634,-.2634},
 | 
|  |    547 |     {-0.98976,-.98976},
 | 
|  |    548 |     {32769.36946,.36946},
 | 
|  |    549 |     {-32774.997937,-0.997937},
 | 
|  |    550 |     {8738465.38749,0.38749},
 | 
|  |    551 |     {-2348645.34965,-0.34965},
 | 
|  |    552 |     {2147483655.7565,0.7565},
 | 
|  |    553 |     {-2147483657.89453,-.89453},
 | 
|  |    554 |     {2374843546.34E2,0.0},
 | 
|  |    555 |     {34780656.37643E12,0.0},
 | 
|  |    556 |     {-2374843546.34E2,0.0},
 | 
|  |    557 |     {-34780656.37643E12,0.0},
 | 
|  |    558 |     {468650.3874E47,0.0},
 | 
|  |    559 |     {-4965.5987636E34,0.0}
 | 
|  |    560 |     };
 | 
|  |    561 | 
 | 
|  |    562 | typedef struct
 | 
|  |    563 |     {
 | 
|  |    564 |     TReal num; // input number
 | 
|  |    565 |     TReal mod; // modulo
 | 
|  |    566 |     TReal res; // expected result
 | 
|  |    567 |     } MOD_TEST;
 | 
|  |    568 | 
 | 
|  |    569 | LOCAL_D MOD_TEST testmod[]=
 | 
|  |    570 |     {
 | 
|  |    571 |     {4.0,2.0,0.0},
 | 
|  |    572 |     {3.0,2.0,1.0},
 | 
|  |    573 |     {56.847,2.3,1.647},
 | 
|  |    574 |     {-65.6478,.65,-.6478},
 | 
|  |    575 |     {-6858.78432,-87.5323,-31.26492},
 | 
|  |    576 |     {7665.140215,-34.98,4.520215},
 | 
|  |    577 |     {.4645,1.0,0.4645},
 | 
|  |    578 |     {-.246,1.0,-.246},
 | 
|  |    579 | 	{1.0,KPosInfTReal64,1.0},
 | 
|  |    580 | 	{1.0,KNegInfTReal64,1.0},
 | 
|  |    581 | 	{1.0E17,8.0,0.0},
 | 
|  |    582 | 	//
 | 
|  |    583 | 	{1.0,3.0,1.0},				//0
 | 
|  |    584 | 	{2.0,3.0,2.0},
 | 
|  |    585 | 	{4.0,3.0,1.0},
 | 
|  |    586 | 	{8.0,3.0,2.0},
 | 
|  |    587 | 	{16.0,3.0,1.0},
 | 
|  |    588 | 	{32.0,3.0,2.0},
 | 
|  |    589 | 	{64.0,3.0,1.0},
 | 
|  |    590 | 	{128.0,3.0,2.0},
 | 
|  |    591 | 	{256.0,3.0,1.0},
 | 
|  |    592 | 	{512.0,3.0,2.0},
 | 
|  |    593 | 	{1024.0,3.0,1.0},			//10
 | 
|  |    594 | 	{2048.0,3.0,2.0},
 | 
|  |    595 | 	{4096.0,3.0,1.0},
 | 
|  |    596 | 	{8192.0,3.0,2.0},
 | 
|  |    597 | 	{16384.0,3.0,1.0},
 | 
|  |    598 | 	{32768.0,3.0,2.0},
 | 
|  |    599 | 	{65536.0,3.0,1.0},
 | 
|  |    600 | 	{131072.0,3.0,2.0},
 | 
|  |    601 | 	{262144.0,3.0,1.0},
 | 
|  |    602 | 	{524288.0,3.0,2.0},
 | 
|  |    603 | 	{1048576.0,3.0,1.0},		//20
 | 
|  |    604 | 	{2097152.0,3.0,2.0},
 | 
|  |    605 | 	{4194304.0,3.0,1.0},
 | 
|  |    606 | 	{8388608.0,3.0,2.0},
 | 
|  |    607 | 	{16777216.0,3.0,1.0},
 | 
|  |    608 | 	{33554432.0,3.0,2.0},
 | 
|  |    609 | 	{67108864.0,3.0,1.0},
 | 
|  |    610 | 	{134217728.0,3.0,2.0},
 | 
|  |    611 | 	{268435456.0,3.0,1.0},
 | 
|  |    612 | 	{536870912.0,3.0,2.0},
 | 
|  |    613 | 	{1073741824.0,3.0,1.0},		//30
 | 
|  |    614 | 	{2147483648.0,3.0,2.0},
 | 
|  |    615 | 	{4294967296.0,3.0,1.0},
 | 
|  |    616 | 	{8589934592.0,3.0,2.0},
 | 
|  |    617 | 	{17179869184.0,3.0,1.0},
 | 
|  |    618 | 	{34359738368.0,3.0,2.0},
 | 
|  |    619 | 	{68719476736.0,3.0,1.0},
 | 
|  |    620 | 	{137438953472.0,3.0,2.0},
 | 
|  |    621 | 	{274877906944.0,3.0,1.0},
 | 
|  |    622 | 	{549755813888.0,3.0,2.0},
 | 
|  |    623 | 	{1099511627776.0,3.0,1.0},	//40
 | 
|  |    624 | 	{2199023255552.0,3.0,2.0},
 | 
|  |    625 | 	{4398046511104.0,3.0,1.0},
 | 
|  |    626 | 	{8796093022208.0,3.0,2.0},
 | 
|  |    627 | 	{17592186044416.0,3.0,1.0},
 | 
|  |    628 | 	{35184372088832.0,3.0,2.0},
 | 
|  |    629 | 	{70368744177664.0,3.0,1.0},
 | 
|  |    630 | 	{140737488355328.0,3.0,2.0},
 | 
|  |    631 | 	{281474976710656.0,3.0,1.0},
 | 
|  |    632 | 	{562949953421312.0,3.0,2.0},
 | 
|  |    633 | 	{1125899906842624.0,3.0,1.0},	//50
 | 
|  |    634 | 	{2251799813685248.0,3.0,2.0},
 | 
|  |    635 | 	{4503599627370496.0,3.0,1.0},
 | 
|  |    636 | 	{9007199254740992.0,3.0,2.0},
 | 
|  |    637 | 	{18014398509481984.0,3.0,1.0},
 | 
|  |    638 | 	{6.626176E-34,299792458.0,6.626176E-34},
 | 
|  |    639 | 	{-1.6022E-19,6.022045E23,-1.6022E-19},
 | 
|  |    640 | 	{0.0,2.71828182845904524,0.0}
 | 
|  |    641 |     };
 | 
|  |    642 | 
 | 
|  |    643 | // expected result is unused in following - will be zero in all cases
 | 
|  |    644 | LOCAL_D MOD_TEST testmod2[]=
 | 
|  |    645 |     {
 | 
|  |    646 | 	{1.0E17,7.9,0.0},
 | 
|  |    647 | 	{1.0E100,4.0,0.0},
 | 
|  |    648 | 	{KMaxTReal64,5.0,0.0},
 | 
|  |    649 | 	{-KMaxTReal64,5.0,0.0},
 | 
|  |    650 | 	{0.125,1.0E-17,0.0},
 | 
|  |    651 | 	{36028797019963968.0,2.0,0.0},   // 2**55,2**1
 | 
|  |    652 | 	//
 | 
|  |    653 | 	{36028797019963968.0,3.0,0.0},	//55
 | 
|  |    654 | 	{72057594039927936.0,3.0,0.0},
 | 
|  |    655 | 	{144115188079855872.0,3.0,0.0},
 | 
|  |    656 | 	{288230376159711744.0,3.0,0.0},
 | 
|  |    657 | 	};
 | 
|  |    658 | 
 | 
|  |    659 | TInt testApprox(TReal aFound,TReal aExpect,TReal aTol)
 | 
|  |    660 | //
 | 
|  |    661 | // Tests relative error, i.e. whether (aFound-aExpect)/aFound <= aTol
 | 
|  |    662 | //
 | 
|  |    663 | 	{
 | 
|  |    664 | 
 | 
|  |    665 | 	TRealX diff,check,l,r,t;
 | 
|  |    666 | 	l.Set(aFound);
 | 
|  |    667 | 	r.Set(aExpect);
 | 
|  |    668 | 	t.Set(aTol);
 | 
|  |    669 | 	if (l.Mult(check,t)==KErrUnderflow)
 | 
|  |    670 | 		{
 | 
|  |    671 | 		l*=TRealX(1.0E20);
 | 
|  |    672 | 		r*=TRealX(1.0E20);
 | 
|  |    673 | 		}
 | 
|  |    674 | 	diff=l-r;
 | 
|  |    675 | 	if (diff.IsZero())
 | 
|  |    676 | 		return ETrue;
 | 
|  |    677 | 	if (!l.IsZero())
 | 
|  |    678 | 		diff.DivEq(l);
 | 
|  |    679 | 	if (Abs(TReal(diff))<=aTol)
 | 
|  |    680 | 		return ETrue;
 | 
|  |    681 | 	return EFalse;
 | 
|  |    682 | 	}
 | 
|  |    683 | 
 | 
|  |    684 | LOCAL_C void randrng(TReal& pret,TReal& llim,TReal& ulim)
 | 
|  |    685 | /*
 | 
|  |    686 | Returns a random number in the range [llim,ulim]
 | 
|  |    687 | */
 | 
|  |    688 |     {
 | 
|  |    689 | 
 | 
|  |    690 |     pret=Math::FRand(rseed);
 | 
|  |    691 |     pret*=ulim-llim;
 | 
|  |    692 |     pret+=llim;
 | 
|  |    693 |     }
 | 
|  |    694 | 
 | 
|  |    695 | LOCAL_C TReal taylor(TReal x,TInt k)
 | 
|  |    696 | /*
 | 
|  |    697 | Evaluate the Taylor series approximation to arc sine up to terms of order k
 | 
|  |    698 | */
 | 
|  |    699 |     //TReal x; // argument
 | 
|  |    700 |     //TInt k; // Highest order term
 | 
|  |    701 |     {
 | 
|  |    702 | 
 | 
|  |    703 |     TInt i,j;
 | 
|  |    704 |     TReal den,num,res,term,di;
 | 
|  |    705 | 
 | 
|  |    706 |     den=1;
 | 
|  |    707 |     num=1;
 | 
|  |    708 |     term=0;
 | 
|  |    709 |     for (i=1;i<=k;i+=2)
 | 
|  |    710 | 		{
 | 
|  |    711 | 		for (j=2;j<i;j+=2)
 | 
|  |    712 | 			{
 | 
|  |    713 | 			num*=j;
 | 
|  |    714 | 			if (j<(i-1))
 | 
|  |    715 | 			den*=j+1;
 | 
|  |    716 | 			}
 | 
|  |    717 | 		di=(TReal)i;
 | 
|  |    718 | 		Math::Pow(res,x,di);
 | 
|  |    719 | 		term+=(res*den)/(i*num);
 | 
|  |    720 | 		num=1;
 | 
|  |    721 | 		den=1;
 | 
|  |    722 | 		}
 | 
|  |    723 |     return(term);
 | 
|  |    724 |     }
 | 
|  |    725 | 
 | 
|  |    726 | LOCAL_C TReal tayatan(TReal val)
 | 
|  |    727 | /* 
 | 
|  |    728 | Finds the taylor series approximation to the arc tangent function 
 | 
|  |    729 | */
 | 
|  |    730 |     //TReal val;
 | 
|  |    731 |     {
 | 
|  |    732 | 
 | 
|  |    733 |     TInt i;
 | 
|  |    734 |     TReal sgn,s,d,di,term,res;
 | 
|  |    735 |     
 | 
|  |    736 |     term=0.0;
 | 
|  |    737 |     s=(-1.0);
 | 
|  |    738 |     for (i=0;i<8;i++)
 | 
|  |    739 | 		{
 | 
|  |    740 | 		di=(TReal)i;
 | 
|  |    741 | 		d=2.0*di;
 | 
|  |    742 | 		Math::Pow(sgn,s,di);
 | 
|  |    743 | 		Math::Pow(res,val,d);
 | 
|  |    744 | 		term+=(sgn*res)/(2.0*di+1.0);
 | 
|  |    745 | 		}
 | 
|  |    746 |     return(val*term);
 | 
|  |    747 |     }
 | 
|  |    748 | 
 | 
|  |    749 | LOCAL_C void AssortedTests()
 | 
|  |    750 | //
 | 
|  |    751 | // Tests the methods with just a handful of values each 
 | 
|  |    752 | // All tests as accurate as possible - if exact answer given, tests for equality
 | 
|  |    753 | //
 | 
|  |    754 | 	{
 | 
|  |    755 | 
 | 
|  |    756 | 	TReal trg,src;
 | 
|  |    757 | 
 | 
|  |    758 | 	// ASin
 | 
|  |    759 | 	test.Start(_L("Math::ASin()"));
 | 
|  |    760 | 	test(Math::ASin(trg,0.0)==KErrNone);
 | 
|  |    761 | 	test(trg==0.0);
 | 
|  |    762 | 
 | 
|  |    763 | 	test(Math::ASin(trg,1.0)==KErrNone);
 | 
|  |    764 | 	test(testApprox(trg,1.5707963267949,5.0E-15));
 | 
|  |    765 | 
 | 
|  |    766 | 	// ACos
 | 
|  |    767 | 	test.Next(_L("Math::ACos()"));
 | 
|  |    768 | 	test(Math::ACos(trg,0)==KErrNone);
 | 
|  |    769 | 	test(testApprox(trg,1.5707963267949,5.0E-15));
 | 
|  |    770 | 
 | 
|  |    771 | 	test(Math::ACos(trg,1.0)==KErrNone);
 | 
|  |    772 | 	test(trg==0.0);
 | 
|  |    773 | 
 | 
|  |    774 | 	// ATan
 | 
|  |    775 | 	test.Next(_L("Math::ATan()"));
 | 
|  |    776 | 	test(Math::ATan(trg,0.0)==KErrNone);
 | 
|  |    777 | 	test(trg==0.0);
 | 
|  |    778 | 
 | 
|  |    779 | 	test(Math::ATan(trg,1.0)==KErrNone);
 | 
|  |    780 | 	test(testApprox(trg,0.78539816339745,5.0E-15));	
 | 
|  |    781 | 
 | 
|  |    782 | 	test(Math::Tan(trg,KPi/4)==KErrNone);
 | 
|  |    783 | 	test(testApprox(trg,1.0,1.0E-15));
 | 
|  |    784 | 	test(Math::ATan(trg,trg)==KErrNone);
 | 
|  |    785 | 	test(testApprox(trg,KPi/4,1e-15));
 | 
|  |    786 | 
 | 
|  |    787 | 	// Sqrt
 | 
|  |    788 | 	test.Next(_L("Math::Sqrt()"));
 | 
|  |    789 | 	test(Math::Sqrt(trg,0.0)==KErrNone);
 | 
|  |    790 | 	test(trg==0.0);
 | 
|  |    791 | 	
 | 
|  |    792 | 	test(Math::Sqrt(trg,-1.0)==KErrArgument);
 | 
|  |    793 | 
 | 
|  |    794 | 	test(Math::Sqrt(trg,100.0)==KErrNone);
 | 
|  |    795 | 	test(testApprox(trg,10.0,1.0E-15));	
 | 
|  |    796 | 
 | 
|  |    797 | 	test(Math::Sqrt(trg,56.25)==KErrNone);
 | 
|  |    798 | 	test(trg==7.5);
 | 
|  |    799 | 
 | 
|  |    800 | 	// Pow10
 | 
|  |    801 | 	test.Next(_L("Math::Pow10()"));
 | 
|  |    802 | 	test(Math::Pow10(trg,-2)==KErrNone);
 | 
|  |    803 | 	test(trg==0.01);	
 | 
|  |    804 | 
 | 
|  |    805 | 	test(Math::Pow10(trg,-1)==KErrNone);
 | 
|  |    806 | 	test(trg==0.1);
 | 
|  |    807 | 
 | 
|  |    808 | 	test(Math::Pow10(trg,0)==KErrNone);
 | 
|  |    809 | 	test(trg==1.0);
 | 
|  |    810 | 
 | 
|  |    811 | 	test(Math::Pow10(trg,1)==KErrNone);
 | 
|  |    812 | 	test(trg==10.0);
 | 
|  |    813 | 
 | 
|  |    814 | 	test(Math::Pow10(trg,2)==KErrNone);
 | 
|  |    815 | 	test(trg==100.0);
 | 
|  |    816 | 
 | 
|  |    817 | 	// Ln
 | 
|  |    818 | 	test.Next(_L("Math::Ln()"));
 | 
|  |    819 | 	test(Math::Ln(trg,0.0)==KErrOverflow);
 | 
|  |    820 | 	
 | 
|  |    821 | 	test(Math::Ln(trg,1.0)==KErrNone);
 | 
|  |    822 | 	test(trg==0.0);
 | 
|  |    823 | 
 | 
|  |    824 | 	test(Math::Ln(trg,2)==KErrNone);
 | 
|  |    825 | 	test(testApprox(trg,0.69314718055995,1.0E-14));	
 | 
|  |    826 | 
 | 
|  |    827 | 	// Log
 | 
|  |    828 | 	test.Next(_L("Math::Log()"));
 | 
|  |    829 | 	test(Math::Log(trg,0)==KErrOverflow);
 | 
|  |    830 | 
 | 
|  |    831 | 	test(Math::Log(trg,1)==KErrNone);
 | 
|  |    832 | 	test(trg==0);
 | 
|  |    833 | 
 | 
|  |    834 | 	test(Math::Log(trg,10)==KErrNone);
 | 
|  |    835 | 	test(trg==1);
 | 
|  |    836 | 
 | 
|  |    837 | 	test(Math::Log(trg,100000)==KErrNone);
 | 
|  |    838 | 	test(trg==5);
 | 
|  |    839 | 
 | 
|  |    840 | 	// Sin
 | 
|  |    841 | 	test.Next(_L("Math::Sin()"));
 | 
|  |    842 | 	test(Math::Sin(trg,0)==KErrNone);
 | 
|  |    843 | 	test(trg==0);   
 | 
|  |    844 | 
 | 
|  |    845 | 	test(Math::Sin(trg,1)==KErrNone);
 | 
|  |    846 | 	test(testApprox(trg,0.84147098480790,5.0E-15));	
 | 
|  |    847 | 
 | 
|  |    848 | 	test(Math::Sin(trg,KPi)==KErrNone);
 | 
|  |    849 | //    test(trg==0.0);
 | 
|  |    850 | 	test(Abs(trg)<1e-15);
 | 
|  |    851 | 
 | 
|  |    852 | 	test(Math::Sin(trg,KPiBy2)==KErrNone);
 | 
|  |    853 | 	test(testApprox(trg,1.0,1.0E-15));
 | 
|  |    854 | 
 | 
|  |    855 | 	test(Math::Sin(trg,10.0*KPi)==KErrNone);
 | 
|  |    856 | //   test(trg==0.0);
 | 
|  |    857 | 	test(Abs(trg)<2e-15);
 | 
|  |    858 | 
 | 
|  |    859 | 	test(Math::Sin(trg,3)==KErrNone);
 | 
|  |    860 | 	test(trg==0.1411200080598672);
 | 
|  |    861 | 
 | 
|  |    862 | 	test(Math::Sin(trg,4)==KErrNone);
 | 
|  |    863 | 	test(trg==-0.7568024953079282);
 | 
|  |    864 | 
 | 
|  |    865 | 	test(Math::Sin(trg,3.1415)==KErrNone);
 | 
|  |    866 | 	test(testApprox(trg,9.26535896605E-5,2.0E-13));	
 | 
|  |    867 | 
 | 
|  |    868 | 	test(Math::Sin(trg,3.1416)==KErrNone);
 | 
|  |    869 | 	test(testApprox(trg,-7.3464102066435914E-6,1.0E-11));	
 | 
|  |    870 | 
 | 
|  |    871 | 	test(Math::Sin(trg,(10.0*KPi)+0.001)==KErrNone);
 | 
|  |    872 | 	test(testApprox(trg,0.000999999833333,4.0E-13));	
 | 
|  |    873 | 
 | 
|  |    874 | 	// Cos
 | 
|  |    875 | 	test.Next(_L("Math::Cos()"));
 | 
|  |    876 | 	test(Math::Cos(trg,0.0)==KErrNone);
 | 
|  |    877 | 	test(testApprox(trg,1.0,1.0E-15));		
 | 
|  |    878 | 
 | 
|  |    879 | 	test(Math::Cos(trg,1)==KErrNone);
 | 
|  |    880 | 	test(testApprox(trg,0.54030230586814,1.0E-15));		
 | 
|  |    881 | 
 | 
|  |    882 |     test(Math::Cos(trg,KPiBy2)==KErrNone);
 | 
|  |    883 | //    test(trg==0.0);
 | 
|  |    884 | 	test(Abs(trg)<1e-15);
 | 
|  |    885 | 
 | 
|  |    886 | 	test(Math::Cos(trg,KPi)==KErrNone);
 | 
|  |    887 | 	test(trg==-1.0);
 | 
|  |    888 | 
 | 
|  |    889 |     test(Math::Cos(trg,KPiBy2+KPi)==KErrNone);
 | 
|  |    890 | //    test(trg==0.0);
 | 
|  |    891 | 	test(Abs(trg)<1e-15);
 | 
|  |    892 | 	
 | 
|  |    893 | 	test(Math::Cos(trg,89.99999*KDegToRad)==KErrNone);
 | 
|  |    894 | 	test(testApprox(trg,1.745329252E-07,5.0E-10));		
 | 
|  |    895 | 
 | 
|  |    896 | 	test(Math::Cos(trg,90.00001*KDegToRad)==KErrNone);
 | 
|  |    897 | 	test(testApprox(trg,-1.7453292516217e-007,5.0E-10));			
 | 
|  |    898 | 
 | 
|  |    899 | 	// Tan
 | 
|  |    900 | 	test.Next(_L("Math::Tan()"));
 | 
|  |    901 | 	test(Math::Tan(trg,0.0)==KErrNone);
 | 
|  |    902 |     test(trg==0.0);   
 | 
|  |    903 | 
 | 
|  |    904 | 	test(Math::Tan(trg,1)==KErrNone);
 | 
|  |    905 | 	test(testApprox(trg,1.5574077246549,2.0E-15));			
 | 
|  |    906 | 
 | 
|  |    907 | 	// Pow
 | 
|  |    908 | 	test.Next(_L("Math::Pow()"));
 | 
|  |    909 | 	src=10;
 | 
|  |    910 | 	test(Math::Pow(trg,src,-1.0)==KErrNone);
 | 
|  |    911 | 	test(testApprox(trg,0.1,1.0E-15));			
 | 
|  |    912 | 
 | 
|  |    913 | 	test(Math::Pow(trg,src,0.0)==KErrNone);
 | 
|  |    914 | 	test(trg==1.0);
 | 
|  |    915 | 
 | 
|  |    916 | 	test(Math::Pow(trg,src,2.0)==KErrNone);
 | 
|  |    917 | 	test(testApprox(trg,100.0,1.0E-15));			
 | 
|  |    918 | 
 | 
|  |    919 | 	src=1.0;
 | 
|  |    920 | 	test(Math::Pow(trg,src,10000000000000000.0)==KErrNone);
 | 
|  |    921 | 	test(trg==1.0);
 | 
|  |    922 | 
 | 
|  |    923 | 	test.End();
 | 
|  |    924 | 	}       
 | 
|  |    925 | 
 | 
|  |    926 | LOCAL_C void sqrtest1(TReal low,TReal upp)
 | 
|  |    927 | /*
 | 
|  |    928 | Test the identity sqrt(x*x)=x  on the range low<=x<upp
 | 
|  |    929 | */
 | 
|  |    930 |     {
 | 
|  |    931 |     
 | 
|  |    932 | 	TReal x,y,res;
 | 
|  |    933 | 
 | 
|  |    934 |     for (TInt j=0;j<100;j++)
 | 
|  |    935 | 		{
 | 
|  |    936 | 		randrng(x,low,upp);
 | 
|  |    937 | 		y=x*x;
 | 
|  |    938 | 		test(Math::Sqrt(res,y)==KErrNone);
 | 
|  |    939 | 		test(testApprox(res,x,1.0E-15));
 | 
|  |    940 | 		}
 | 
|  |    941 |     }
 | 
|  |    942 | 
 | 
|  |    943 | LOCAL_C void sqrtest2()
 | 
|  |    944 | /*
 | 
|  |    945 | Tests specific numbers
 | 
|  |    946 | */
 | 
|  |    947 |     {
 | 
|  |    948 |     
 | 
|  |    949 | 	TReal root;
 | 
|  |    950 | 
 | 
|  |    951 | 	// test errors
 | 
|  |    952 | 	test(Math::Sqrt(root,KNaNTReal64)==KErrArgument);
 | 
|  |    953 | 	test(Math::IsNaN(root));
 | 
|  |    954 | 	test(Math::Sqrt(root,-1)==KErrArgument);
 | 
|  |    955 | 	test(Math::IsNaN(root));
 | 
|  |    956 | 	test(Math::Sqrt(root,KNegInfTReal64)==KErrArgument);
 | 
|  |    957 | 	test(Math::IsNaN(root));
 | 
|  |    958 | 	test(Math::Sqrt(root,KPosInfTReal64)==KErrOverflow);
 | 
|  |    959 | 	test(root==KPosInfTReal64);
 | 
|  |    960 | 
 | 
|  |    961 |     TInt i=sizeof(testsqrt)/sizeof(SQRT_TEST);
 | 
|  |    962 |     for (TInt j=0;j<i;j++) 
 | 
|  |    963 | 		{
 | 
|  |    964 | 		test(Math::Sqrt(root,testsqrt[j].num)==KErrNone);
 | 
|  |    965 | 		test(testApprox(root,testsqrt[j].res,1.0E-15));
 | 
|  |    966 | 		}
 | 
|  |    967 | 
 | 
|  |    968 | 	// a couple of denormal tests
 | 
|  |    969 | 	test(Math::Sqrt(root,4E-322)==KErrNone);
 | 
|  |    970 | 	test(testApprox(root,2E-161,1.0E-3));
 | 
|  |    971 | 	test(Math::Sqrt(root,1.6E-309)==KErrNone);
 | 
|  |    972 | 	test(testApprox(root,4E-155,1.0E-15));	
 | 
|  |    973 |     }
 | 
|  |    974 | 
 | 
|  |    975 | LOCAL_C void logtest()
 | 
|  |    976 | /*
 | 
|  |    977 | Test numbers in the range sqrt(.1) to .9, using the identity 
 | 
|  |    978 | log(x)=log(11x/10)-log(1.1) 
 | 
|  |    979 | */
 | 
|  |    980 |     {
 | 
|  |    981 | 
 | 
|  |    982 |     TReal res,x;
 | 
|  |    983 |     TReal cnstlog,cnstlogx;
 | 
|  |    984 | 
 | 
|  |    985 |     TReal low=.316227766017;
 | 
|  |    986 |     TReal upp=0.9;
 | 
|  |    987 |     TReal cnst=11.0/10.0;
 | 
|  |    988 |     test(Math::Log(cnstlog,cnst)==KErrNone);
 | 
|  |    989 |     for (TInt j=0;j<10;j++)
 | 
|  |    990 | 		{
 | 
|  |    991 | 		randrng(x,low,upp);
 | 
|  |    992 | 		test(Math::Log(res,x)==KErrNone); 
 | 
|  |    993 | 		TReal num=cnst*x;
 | 
|  |    994 | 		test(Math::Log(cnstlogx,num)==KErrNone);
 | 
|  |    995 | 		test(testApprox(res,(cnstlogx-cnstlog),1.0E-15));
 | 
|  |    996 | 		}
 | 
|  |    997 |     }
 | 
|  |    998 | 
 | 
|  |    999 | LOCAL_C void lntest1()
 | 
|  |   1000 | /* 
 | 
|  |   1001 | Test selected numbers 
 | 
|  |   1002 | */
 | 
|  |   1003 |     {
 | 
|  |   1004 |  
 | 
|  |   1005 |     TReal res;
 | 
|  |   1006 | 
 | 
|  |   1007 | 	// test errors
 | 
|  |   1008 | //	test(Math::Ln(res,KNegZeroTReal64)==KErrArgument);
 | 
|  |   1009 | 	test(Math::Ln(res,KNegZeroTReal64)==KErrOverflow);
 | 
|  |   1010 | 	test(Math::IsInfinite(res));
 | 
|  |   1011 | 	test(Math::Ln(res,-34)==KErrArgument);
 | 
|  |   1012 | 	test(Math::IsNaN(res));
 | 
|  |   1013 | 	test(Math::Ln(res,KNaNTReal64)==KErrArgument);
 | 
|  |   1014 | 	test(Math::IsNaN(res));
 | 
|  |   1015 | 	test(Math::Ln(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   1016 | 	test(Math::IsNaN(res));
 | 
|  |   1017 | 	test(Math::Ln(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1018 | 	test(res==KPosInfTReal64);
 | 
|  |   1019 | 	test(Math::Ln(res,0.0)==KErrOverflow);
 | 
|  |   1020 | 	test(res==KNegInfTReal64);
 | 
|  |   1021 | 	test(Math::Ln(res,2.71828182845904524)==KErrNone);
 | 
|  |   1022 | 	test(testApprox(res,1.0,1e-15));
 | 
|  |   1023 | 	test(Math::Ln(res,7.389056098930650227)==KErrNone);
 | 
|  |   1024 | 	test(testApprox(res,2.0,1e-15));
 | 
|  |   1025 | 
 | 
|  |   1026 |     TInt i=sizeof(testln)/sizeof(TESTLN);
 | 
|  |   1027 |     for (TInt j=0;j<i;j++) 
 | 
|  |   1028 | 		{
 | 
|  |   1029 | 		test(Math::Ln(res,testln[j].num)==KErrNone);
 | 
|  |   1030 | 		test(testApprox(res,testln[j].res,1.0E-14));
 | 
|  |   1031 | 		}
 | 
|  |   1032 | 
 | 
|  |   1033 | 	// test some denormals
 | 
|  |   1034 |  	test(Math::Log(res,K1EMinus322Real64)==KErrNone);
 | 
|  |   1035 | 	test(testApprox(res,-322.0,2.0E-5));
 | 
|  |   1036 |  	test(Math::Log(res,K1EMinus313Real64)==KErrNone);
 | 
|  |   1037 | 	test(testApprox(res,-313.0,1.0E-13));	
 | 
|  |   1038 |     }
 | 
|  |   1039 | 
 | 
|  |   1040 | LOCAL_C void lntest2()
 | 
|  |   1041 | /* 
 | 
|  |   1042 | Test numbers near to one against the Taylor series approximation 
 | 
|  |   1043 | */
 | 
|  |   1044 |     {
 | 
|  |   1045 |     
 | 
|  |   1046 | 	TReal x,res;
 | 
|  |   1047 |     
 | 
|  |   1048 |     TReal low=.999999989463;
 | 
|  |   1049 |     TReal upp=1.00000001054;
 | 
|  |   1050 |     for (TInt k=0;k<10;k++)
 | 
|  |   1051 | 		{
 | 
|  |   1052 | 		randrng(x,low,upp);
 | 
|  |   1053 | 		TRealX tot=0.0;
 | 
|  |   1054 | 		TRealX xx(x-1);
 | 
|  |   1055 | 		TInt sign=-1;
 | 
|  |   1056 | 		for (TInt i=4;i>0;i--)
 | 
|  |   1057 | 			{
 | 
|  |   1058 | 			tot+=TRealX(sign)/TRealX(i);
 | 
|  |   1059 | 			tot*=xx;
 | 
|  |   1060 | 			sign=-sign;
 | 
|  |   1061 | 			}
 | 
|  |   1062 | 		TReal tot2=(TReal)tot;
 | 
|  |   1063 | 		test(Math::Ln(res,x)==KErrNone);
 | 
|  |   1064 | 		test(testApprox(res,tot2,1.0E-15));
 | 
|  |   1065 | 		}
 | 
|  |   1066 |     }
 | 
|  |   1067 | 
 | 
|  |   1068 | LOCAL_C void lntest3()
 | 
|  |   1069 | /* 
 | 
|  |   1070 | Test numbers in the range sqrt(.5) to 15/16, using the identity 
 | 
|  |   1071 | ln(x)=ln(17x/16)-ln(17/16) 
 | 
|  |   1072 | */
 | 
|  |   1073 |     {
 | 
|  |   1074 | 
 | 
|  |   1075 |     TReal x,cnstln,cnstlnx,res;
 | 
|  |   1076 | 
 | 
|  |   1077 | 	TReal low=KSqhf;
 | 
|  |   1078 |     TReal upp=15.0/16.0;
 | 
|  |   1079 |     TReal cnst=17.0/16.0;
 | 
|  |   1080 |     test(Math::Ln(cnstln,cnst)==KErrNone);
 | 
|  |   1081 | 	for (TInt j=0;j<10;j++)
 | 
|  |   1082 | 		{
 | 
|  |   1083 | 		randrng(x,low,upp);
 | 
|  |   1084 | 		test(Math::Ln(res,x)==KErrNone);
 | 
|  |   1085 | 		TReal num=cnst*x;
 | 
|  |   1086 | 		test(Math::Ln(cnstlnx,num)==KErrNone);
 | 
|  |   1087 | 		test(testApprox(res,(cnstlnx-cnstln),1.0E-15));
 | 
|  |   1088 | 		}
 | 
|  |   1089 |     }
 | 
|  |   1090 | 
 | 
|  |   1091 | LOCAL_C void lntest4()
 | 
|  |   1092 | /* 
 | 
|  |   1093 | Test numbers in the range 16 to 240 using the identity ln(x*x)=2ln(x) 
 | 
|  |   1094 | */
 | 
|  |   1095 |     {
 | 
|  |   1096 | 
 | 
|  |   1097 |     TReal cnstlnx,res;
 | 
|  |   1098 | 
 | 
|  |   1099 |     TReal low=16.0;
 | 
|  |   1100 |     TReal upp=240.0;
 | 
|  |   1101 |     TReal x=16.0;
 | 
|  |   1102 | 	test(Math::Ln(res,-1)==KErrArgument);
 | 
|  |   1103 |     for (TInt j=0;j<10;j++)
 | 
|  |   1104 | 		{
 | 
|  |   1105 | 		randrng(x,low,upp);
 | 
|  |   1106 | 		TReal num=x*x;
 | 
|  |   1107 | 		test(Math::Ln(res,num)==KErrNone);
 | 
|  |   1108 | 		test(Math::Ln(cnstlnx,x)==KErrNone);
 | 
|  |   1109 | 		test(testApprox(res,2*cnstlnx,1.0E-15));
 | 
|  |   1110 | 		}
 | 
|  |   1111 |     }
 | 
|  |   1112 | 
 | 
|  |   1113 | LOCAL_C void exptest1()
 | 
|  |   1114 | /* 
 | 
|  |   1115 | To test exponent for specific values 
 | 
|  |   1116 | */
 | 
|  |   1117 |     {
 | 
|  |   1118 | 
 | 
|  |   1119 |     TReal res;
 | 
|  |   1120 | 
 | 
|  |   1121 | 	// test errors
 | 
|  |   1122 | 	test(Math::Exp(res,KNaNTReal64)==KErrArgument);
 | 
|  |   1123 | 	test(Math::IsNaN(res));
 | 
|  |   1124 | 	test(Math::Exp(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1125 | 	test(res==KPosInfTReal64);
 | 
|  |   1126 | 	test(Math::Exp(res,709.8)==KErrOverflow);
 | 
|  |   1127 | 	test(res==KPosInfTReal64);
 | 
|  |   1128 | 	test(Math::Exp(res,KNegInfTReal64)==KErrUnderflow);
 | 
|  |   1129 | 	test(Math::IsZero(res));
 | 
|  |   1130 | 	test(Math::Exp(res,-745.2)==KErrUnderflow);
 | 
|  |   1131 | 	test(Math::IsZero(res));
 | 
|  |   1132 | 
 | 
|  |   1133 |     TInt i=sizeof(testexp)/sizeof(EXP);
 | 
|  |   1134 |     for (TInt j=0;j<i;j++)
 | 
|  |   1135 | 		{
 | 
|  |   1136 | 		test(Math::Exp(res,testexp[j].val)==KErrNone);
 | 
|  |   1137 | 		test(testApprox(res,testexp[j].result,0));	// NB only tests values with results of 1
 | 
|  |   1138 | 		}
 | 
|  |   1139 | 
 | 
|  |   1140 | 	// test some denormals
 | 
|  |   1141 | 	test(Math::Exp(res,5E-324)==KErrNone);
 | 
|  |   1142 | 	test(testApprox(res,1.0,0));
 | 
|  |   1143 | 	test(Math::Exp(res,-6E-318)==KErrNone);
 | 
|  |   1144 | 	test(testApprox(res,1.0,0));	
 | 
|  |   1145 | 	}
 | 
|  |   1146 | 
 | 
|  |   1147 | LOCAL_C void exptest2(TReal cnst,TReal ll,TReal ul)
 | 
|  |   1148 | /*
 | 
|  |   1149 | Test the identity exp(x-cnst)=exp(x)*exp(-cnst) for x in the range [ul,ll]
 | 
|  |   1150 | */
 | 
|  |   1151 |     //TReal cnst; // constant used in the identity
 | 
|  |   1152 |     //TReal ll; // Lower limit of the range
 | 
|  |   1153 |     //TReal ul; // Upper limit of the range
 | 
|  |   1154 |     {
 | 
|  |   1155 | 
 | 
|  |   1156 |     TReal cnstexp,cnstexpx,x,res;
 | 
|  |   1157 | 
 | 
|  |   1158 |     test(Math::Exp(cnstexp,cnst)==KErrNone);
 | 
|  |   1159 |     for (TInt j=0;j<10;j++)
 | 
|  |   1160 | 		{
 | 
|  |   1161 | 		randrng(x,ll,ul);
 | 
|  |   1162 | 		test(Math::Exp(res,x)==KErrNone);
 | 
|  |   1163 | 		TReal num=x+cnst;
 | 
|  |   1164 | 		test(Math::Exp(cnstexpx,num)==KErrNone);
 | 
|  |   1165 | 		test(testApprox(cnstexpx,(res*cnstexp),1.0E-15));
 | 
|  |   1166 | 		}
 | 
|  |   1167 |     }
 | 
|  |   1168 | 
 | 
|  |   1169 | LOCAL_C void exptest3()
 | 
|  |   1170 | /* 
 | 
|  |   1171 | Test for systematic error 
 | 
|  |   1172 | */
 | 
|  |   1173 |     {
 | 
|  |   1174 |     
 | 
|  |   1175 | 	TReal step,ul,v;
 | 
|  |   1176 | 
 | 
|  |   1177 |     TReal x=1.0123;
 | 
|  |   1178 |     TReal y=x/2;
 | 
|  |   1179 |     test(Math::Exp(v,y)==KErrNone);
 | 
|  |   1180 |     test(Math::Exp(step,x)==KErrNone);
 | 
|  |   1181 |     test(Math::Sqrt(ul,step)==KErrNone);
 | 
|  |   1182 | 	test(testApprox(ul,v,1.0E-15));
 | 
|  |   1183 |     }
 | 
|  |   1184 | 
 | 
|  |   1185 | LOCAL_C void powtest1()
 | 
|  |   1186 | /*
 | 
|  |   1187 | Test selected numbers
 | 
|  |   1188 | */
 | 
|  |   1189 |     {
 | 
|  |   1190 |     
 | 
|  |   1191 | 	TReal res;
 | 
|  |   1192 | 	
 | 
|  |   1193 | 	// test errors
 | 
|  |   1194 | 	test(Math::Pow(res,10,-1E8)==KErrUnderflow);
 | 
|  |   1195 | 	test(res==0.0);
 | 
|  |   1196 | 	test(Math::Pow(res,10,-KMaxTReal64)==KErrUnderflow);
 | 
|  |   1197 | 	test(res==0.0);
 | 
|  |   1198 | 	test(Math::Pow(res,10,-5.5E307)==KErrUnderflow);
 | 
|  |   1199 | 	test(res==0.0);
 | 
|  |   1200 | 	test(Math::Pow(res,10,-5.4E307)==KErrUnderflow);
 | 
|  |   1201 | 	test(res==0.0);
 | 
|  |   1202 | 	test(Math::Pow(res,10,-1E300)==KErrUnderflow);
 | 
|  |   1203 | 	test(res==0.0);
 | 
|  |   1204 | 	test(Math::Pow(res,10,-1E10)==KErrUnderflow);
 | 
|  |   1205 | 	test(res==0.0);
 | 
|  |   1206 | 	
 | 
|  |   1207 | 	test(Math::Pow(res,10,5.5E307)==KErrOverflow);
 | 
|  |   1208 | 	test(res==KPosInfTReal64);
 | 
|  |   1209 | 	test(Math::Pow(res,10,5.4E307)==KErrOverflow);
 | 
|  |   1210 | 	test(res==KPosInfTReal64);
 | 
|  |   1211 | 	test(Math::Pow(res,10,1E308)==KErrOverflow);
 | 
|  |   1212 | 	test(res==KPosInfTReal64);
 | 
|  |   1213 | 	test(Math::Pow(res,10,1.7E308)==KErrOverflow);
 | 
|  |   1214 | 	test(res==KPosInfTReal64);
 | 
|  |   1215 | 	test(Math::Pow(res,10,KMaxTReal64)==KErrOverflow);
 | 
|  |   1216 | 	test(res==KPosInfTReal64);
 | 
|  |   1217 | 	
 | 
|  |   1218 | 	test(Math::Pow(res,1.0,KNaNTReal64)==KErrNone);
 | 
|  |   1219 | 	test(res==1.0);
 | 
|  |   1220 | 	test(Math::Pow(res,KNaNTReal64,1.0)==KErrArgument);
 | 
|  |   1221 | 	test(Math::IsNaN(res));
 | 
|  |   1222 | 	test(Math::Pow(res,0.0,KNaNTReal64)==KErrArgument);
 | 
|  |   1223 | 	test(Math::IsNaN(res));
 | 
|  |   1224 | 	test(Math::Pow(res,KNaNTReal64,0.0)==KErrNone);
 | 
|  |   1225 | 	test(res==1.0);
 | 
|  |   1226 | 	test(Math::Pow(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
 | 
|  |   1227 | 	test(Math::IsNaN(res));
 | 
|  |   1228 | 	test(Math::Pow(res,KPosInfTReal64,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1229 | 	test(res==KPosInfTReal64);
 | 
|  |   1230 | //	test(Math::Pow(res,KNegInfTReal64,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1231 | //	test(res==KPosInfTReal64);
 | 
|  |   1232 | 	test(Math::Pow(res,KNegInfTReal64,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1233 | 	test(res==KPosInfTReal64);
 | 
|  |   1234 | 	test(Math::Pow(res,2.0,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1235 | 	test(res==KPosInfTReal64);
 | 
|  |   1236 | //	test(Math::Pow(res,-2.0,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1237 | //	test(res==KPosInfTReal64);
 | 
|  |   1238 | 	test(Math::Pow(res,-2.0,KPosInfTReal64)==KErrOverflow);
 | 
|  |   1239 | 	test(res==KPosInfTReal64);
 | 
|  |   1240 | 	test(Math::Pow(res,0.5,KNegInfTReal64)==KErrOverflow);
 | 
|  |   1241 | 	test(res==KPosInfTReal64);
 | 
|  |   1242 | //	test(Math::Pow(res,-0.5,KNegInfTReal64)==KErrOverflow);
 | 
|  |   1243 | //	test(res==KPosInfTReal64);
 | 
|  |   1244 | 	test(Math::Pow(res,-0.5,KNegInfTReal64)==KErrOverflow);
 | 
|  |   1245 | 	test(res==KPosInfTReal64);
 | 
|  |   1246 | //	test(Math::Pow(res,1.0,KPosInfTReal64)==KErrArgument);
 | 
|  |   1247 | //	test(Math::IsNaN(res));
 | 
|  |   1248 | 	test(Math::Pow(res,1.0,KPosInfTReal64)==KErrNone);
 | 
|  |   1249 | 	test(res==1.0);
 | 
|  |   1250 | 	test(Math::Pow(res,-1.0,KPosInfTReal64)==KErrNone);
 | 
|  |   1251 | 	test(res==1.0);
 | 
|  |   1252 | //	test(Math::Pow(res,1.0,KNegInfTReal64)==KErrArgument);
 | 
|  |   1253 | //	test(Math::IsNaN(res));
 | 
|  |   1254 | 	test(Math::Pow(res,1.0,KNegInfTReal64)==KErrNone);
 | 
|  |   1255 | 	test(res==1.0);
 | 
|  |   1256 | 	test(Math::Pow(res,-1.0,KNegInfTReal64)==KErrNone);
 | 
|  |   1257 | 	test(res==1.0);
 | 
|  |   1258 | 	test(Math::Pow(res,0.0,0.0)==KErrNone);
 | 
|  |   1259 | 	test(res==1.0);
 | 
|  |   1260 | 	test(Math::Pow(res,KNegZeroTReal64,KNegZeroTReal64)==KErrNone);
 | 
|  |   1261 | 	test(res==1.0);
 | 
|  |   1262 | 	test(Math::Pow(res,0.0,KNegZeroTReal64)==KErrNone);
 | 
|  |   1263 | 	test(res==1.0);
 | 
|  |   1264 | 	test(Math::Pow(res,KNegZeroTReal64,0.0)==KErrNone);
 | 
|  |   1265 | 	test(res==1.0);
 | 
|  |   1266 | 	test(Math::Pow(res,KPosInfTReal64,2.0)==KErrOverflow);
 | 
|  |   1267 | 	test(res==KPosInfTReal64);
 | 
|  |   1268 | 	test(Math::Pow(res,0.0,-2.0)==KErrOverflow);
 | 
|  |   1269 | 	test(res==KPosInfTReal64);
 | 
|  |   1270 | 	test(Math::Pow(res,-2.0,-2.6)==KErrArgument);
 | 
|  |   1271 | 	test(Math::IsNaN(res));
 | 
|  |   1272 | 	test(Math::Pow(res,-2.0,4.8)==KErrArgument);
 | 
|  |   1273 | 	test(Math::IsNaN(res));
 | 
|  |   1274 | 	test(Math::Pow(res,KNegZeroTReal64,-5)==KErrOverflow);
 | 
|  |   1275 | 	test(res==KNegInfTReal64);
 | 
|  |   1276 | 	test(Math::Pow(res,KNegZeroTReal64,-6)==KErrOverflow);
 | 
|  |   1277 | 	test(res==KPosInfTReal64);
 | 
|  |   1278 | 	test(Math::Pow(res,30,999999)==KErrOverflow);	// checking bug fixed
 | 
|  |   1279 | 	test(res==KPosInfTReal64);
 | 
|  |   1280 | 	test(Math::Pow(res,200,200)==KErrOverflow);
 | 
|  |   1281 | 	test(res==KPosInfTReal64);
 | 
|  |   1282 | 	test(Math::Pow(res,200,2000)==KErrOverflow);	// checking bug fixed
 | 
|  |   1283 | 	test(res==KPosInfTReal64);
 | 
|  |   1284 | 	test(Math::Pow(res,1000,1000)==KErrOverflow);
 | 
|  |   1285 | 	test(res==KPosInfTReal64);
 | 
|  |   1286 | 	test(Math::Pow(res,1000,100)==KErrNone);
 | 
|  |   1287 | 	test(testApprox(res,1E+300,3.0E-15));
 | 
|  |   1288 | 	test(Math::Pow(res,1000,-1000)==KErrUnderflow);
 | 
|  |   1289 | 	test(Math::IsZero(res));
 | 
|  |   1290 | 	test(Math::Pow(res,1000,-100)==KErrNone);
 | 
|  |   1291 | 	test(testApprox(res,1E-300,4.0E-15));
 | 
|  |   1292 | 	
 | 
|  |   1293 | 	TInt j;
 | 
|  |   1294 |     TInt i=sizeof(testpow)/sizeof(POWER);
 | 
|  |   1295 |     for (j=0;j<i;j++)
 | 
|  |   1296 | 		{
 | 
|  |   1297 | 		test(Math::Pow(res,testpow[j].number,testpow[j].power)==KErrNone);
 | 
|  |   1298 | 		test(testApprox(res,testpow[j].result,1.0E-15));
 | 
|  |   1299 | 		}
 | 
|  |   1300 | 
 | 
|  |   1301 | 	// Added by AnnW, October 1996
 | 
|  |   1302 | 	TInt size = sizeof(testpowexact)/sizeof(POWER);
 | 
|  |   1303 | 	for (j=0; j<size; j++)
 | 
|  |   1304 | 		{
 | 
|  |   1305 | 		test(Math::Pow(res,testpowexact[j].number,testpowexact[j].power)==KErrNone);
 | 
|  |   1306 | 		test(res==testpowexact[j].result);
 | 
|  |   1307 | 		}
 | 
|  |   1308 | 
 | 
|  |   1309 | 	// denormals (base only - do not know results for denormal power)
 | 
|  |   1310 |  	test(Math::Pow(res,K5EMinus324Real64,1.0)==KErrNone);
 | 
|  |   1311 |  	test(res==K5EMinus324Real64);
 | 
|  |   1312 |  	test(Math::Pow(res,K5EMinus324Real64,0.0)==KErrNone);
 | 
|  |   1313 | 	test(res==1.0);
 | 
|  |   1314 | 	test(Math::Pow(res,2E-160,2.0)==KErrNone);
 | 
|  |   1315 | 	test(testApprox(res,K4EMinus320Real64,1.0E-4));		
 | 
|  |   1316 | 
 | 
|  |   1317 | 	// This test is to check that reduce() is working properly
 | 
|  |   1318 | 	// This is only a very approximate test due to loss of significance for such nos
 | 
|  |   1319 | 	TReal base,power;
 | 
|  |   1320 | 	for (TReal powerOfTwo=16.0; powerOfTwo<=54.0; powerOfTwo++)
 | 
|  |   1321 | 		{
 | 
|  |   1322 | 		Math::Pow(power,2.0,powerOfTwo);
 | 
|  |   1323 | 		power+=0.7;
 | 
|  |   1324 |  		Math::Pow(base,2.0,1/power);
 | 
|  |   1325 | 		test(Math::Pow(res,base,power)==KErrNone);
 | 
|  |   1326 | 		test((2.0-res)<=1.0);
 | 
|  |   1327 | 		}
 | 
|  |   1328 |     }
 | 
|  |   1329 | 
 | 
|  |   1330 | LOCAL_C void powtest2(TReal low,TReal upp)
 | 
|  |   1331 | /*
 | 
|  |   1332 | Test the identity (x**2)**1.5=x**3  on the range low<=x<upp
 | 
|  |   1333 | */
 | 
|  |   1334 |     //TReal low; // lower limit of range to test
 | 
|  |   1335 |     //TReal upp; // upper limit of range to test 
 | 
|  |   1336 |     {
 | 
|  |   1337 |     
 | 
|  |   1338 | 	TReal res,rres,x;
 | 
|  |   1339 | 
 | 
|  |   1340 | 	for (TInt j=0;j<10;j++)
 | 
|  |   1341 | 		{
 | 
|  |   1342 | 		randrng(x,low,upp);
 | 
|  |   1343 | 		TReal y=2;
 | 
|  |   1344 | 		test(Math::Pow(res,x,y)==KErrNone);
 | 
|  |   1345 | 		TReal xr=res;
 | 
|  |   1346 | 		y=1.5;
 | 
|  |   1347 | 		test(Math::Pow(res,xr,y)==KErrNone);
 | 
|  |   1348 | 		TReal yr=3;
 | 
|  |   1349 | 		test(Math::Pow(rres,x,yr)==KErrNone);    
 | 
|  |   1350 | 		test(testApprox(rres,res,1.0E-14));
 | 
|  |   1351 | 		}
 | 
|  |   1352 |     }
 | 
|  |   1353 | 
 | 
|  |   1354 | LOCAL_C void powtest3()
 | 
|  |   1355 | /* 
 | 
|  |   1356 | Test the identity x**1=x 
 | 
|  |   1357 | */
 | 
|  |   1358 |     {
 | 
|  |   1359 |     
 | 
|  |   1360 | 	TReal x,res;
 | 
|  |   1361 |  
 | 
|  |   1362 |     TReal low=.5;
 | 
|  |   1363 |     TReal upp=1.0;
 | 
|  |   1364 |     for (TInt j=0;j<10;j++)
 | 
|  |   1365 | 		{
 | 
|  |   1366 | 		randrng(x,low,upp);
 | 
|  |   1367 | 		TReal y=1.0;
 | 
|  |   1368 | 		test(Math::Pow(res,x,y)==KErrNone);
 | 
|  |   1369 | 		test(testApprox(res,x,1.0E-15));
 | 
|  |   1370 | 		}
 | 
|  |   1371 |     }
 | 
|  |   1372 | 
 | 
|  |   1373 | LOCAL_C void powtest4()
 | 
|  |   1374 | /* 
 | 
|  |   1375 | Test the identity (x**2)**(y/2)=x**y 
 | 
|  |   1376 | */
 | 
|  |   1377 |     {
 | 
|  |   1378 |     
 | 
|  |   1379 | 	TReal res,xr,rres,x,y;
 | 
|  |   1380 |     
 | 
|  |   1381 |     TReal low=.01;
 | 
|  |   1382 |     TReal upp=10.0;
 | 
|  |   1383 |     TReal lowy=-98; // range for y
 | 
|  |   1384 |     TReal uppy=98;
 | 
|  |   1385 |     for (TInt j=0;j<10;j++)
 | 
|  |   1386 | 		{
 | 
|  |   1387 | 		randrng(x,low,upp);
 | 
|  |   1388 | 		randrng(y,lowy,uppy);
 | 
|  |   1389 | 		test(Math::Pow(res,x,y)==KErrNone);
 | 
|  |   1390 | 		TReal yr=2;
 | 
|  |   1391 | 		test(Math::Pow(xr,x,yr)==KErrNone);
 | 
|  |   1392 | 		y/=2;
 | 
|  |   1393 | 		test(Math::Pow(rres,xr,y)==KErrNone);
 | 
|  |   1394 | 		test(testApprox(res,rres,5.0E-14));
 | 
|  |   1395 | 		}
 | 
|  |   1396 |     }
 | 
|  |   1397 | 
 | 
|  |   1398 | LOCAL_C void powtest5()
 | 
|  |   1399 | /* 
 | 
|  |   1400 | Test the identity x**y=1/(x**(-y)) 
 | 
|  |   1401 | */
 | 
|  |   1402 |     {
 | 
|  |   1403 |     
 | 
|  |   1404 | 	TReal x,y;
 | 
|  |   1405 |     TReal res,rres;
 | 
|  |   1406 |     
 | 
|  |   1407 | 	test(Math::Pow(res,-2,-3.765)==KErrArgument);
 | 
|  |   1408 |     TReal low=0.5;
 | 
|  |   1409 |     TReal upp=1.0;
 | 
|  |   1410 |     for (TInt j=0;j<10;j++)
 | 
|  |   1411 | 		{
 | 
|  |   1412 | 		randrng(x,low,upp);
 | 
|  |   1413 | 		randrng(y,low,upp);
 | 
|  |   1414 | 		test(Math::Pow(res,x,y)==KErrNone);
 | 
|  |   1415 | 		y*=(-1);
 | 
|  |   1416 | 		test(Math::Pow(rres,x,y)==KErrNone);
 | 
|  |   1417 | 		rres=1/rres;
 | 
|  |   1418 | 		test(testApprox(res,rres,5.0E-15));
 | 
|  |   1419 | 		}
 | 
|  |   1420 |     }
 | 
|  |   1421 | 
 | 
|  |   1422 | LOCAL_C void powtest6()
 | 
|  |   1423 | /* 
 | 
|  |   1424 | Test specific ISO requirements on Pow()
 | 
|  |   1425 | */
 | 
|  |   1426 | 	{
 | 
|  |   1427 | 	TInt i;
 | 
|  |   1428 | 	TInt n = sizeof(testpow_iso) / sizeof(POWERISO);
 | 
|  |   1429 | 	for (i = 0; i < n; i++)
 | 
|  |   1430 | 		{
 | 
|  |   1431 | 		TReal ans;
 | 
|  |   1432 | 		TInt rc;
 | 
|  |   1433 | 
 | 
|  |   1434 | 		// If one of these tests fails, convert the "failed check xx" number
 | 
|  |   1435 | 		// to an index in testpow_iso[] by subtracting 1 and then dividing by 2.
 | 
|  |   1436 | 		// If the original number was odd, the first test (rc == xxx) failed.
 | 
|  |   1437 | 		// If the original number was even, the second test (.result) failed.
 | 
|  |   1438 | 		rc = Math::Pow(ans, testpow_iso[i].number, testpow_iso[i].power);
 | 
|  |   1439 | 		test(rc == testpow_iso[i].rc);
 | 
|  |   1440 | 		test((rc == KErrArgument) || (ans == testpow_iso[i].result));
 | 
|  |   1441 | 		}
 | 
|  |   1442 | 	}
 | 
|  |   1443 | 
 | 
|  |   1444 | LOCAL_C void pow10test()
 | 
|  |   1445 | //
 | 
|  |   1446 | // Test Pow10() for various selected values - results should indicate which string to 
 | 
|  |   1447 | // binary conversions would NOT be expected to be exact - see t_float
 | 
|  |   1448 | //
 | 
|  |   1449 | 	{
 | 
|  |   1450 | 
 | 
|  |   1451 | 	TReal res;
 | 
|  |   1452 | 
 | 
|  |   1453 | 	// test errors
 | 
|  |   1454 | 	test(Math::Pow10(res,-324)==KErrUnderflow);
 | 
|  |   1455 | 	test(res==0.0);
 | 
|  |   1456 | 	test(Math::Pow10(res,-400)==KErrUnderflow);
 | 
|  |   1457 | 	test(res==0.0);
 | 
|  |   1458 | 	test(Math::Pow10(res,309)==KErrOverflow);
 | 
|  |   1459 | 	test(res==KPosInfTReal64);
 | 
|  |   1460 | 	test(Math::Pow10(res,400)==KErrOverflow);
 | 
|  |   1461 | 	test(res==KPosInfTReal64);
 | 
|  |   1462 | 
 | 
|  |   1463 | 	TInt j;
 | 
|  |   1464 | 	TInt i=sizeof(pow10teste)/sizeof(POW10_TEST);
 | 
|  |   1465 | 
 | 
|  |   1466 | 	for (j=0; j<i; j++)
 | 
|  |   1467 | 		{
 | 
|  |   1468 | 		test(Math::Pow10(res,pow10teste[j].num)==KErrNone);
 | 
|  |   1469 | 		test(res==pow10teste[j].res);
 | 
|  |   1470 | 		}
 | 
|  |   1471 | 
 | 
|  |   1472 | /*	i=sizeof(pow10testa)/sizeof(POW10_TEST);
 | 
|  |   1473 | 	
 | 
|  |   1474 | 	for (j=0; j<i; j++)
 | 
|  |   1475 | 		{
 | 
|  |   1476 | 		test(Math::Pow10(res,pow10testa[j].num)==KErrNone);
 | 
|  |   1477 | 		test(testApprox(res,pow10testa[j].res,1.0E-15));
 | 
|  |   1478 | 		}
 | 
|  |   1479 | */	}
 | 
|  |   1480 | 
 | 
|  |   1481 | LOCAL_C void sintest1(TReal low,TReal upp)
 | 
|  |   1482 | /*
 | 
|  |   1483 | Test the identity sin(x)=sin(x/3)[3-4*(sin(x/3))**2] on the range low<=x<upp
 | 
|  |   1484 | */
 | 
|  |   1485 |     //TReal low; // lower limit of range to test
 | 
|  |   1486 |     //TReal upp; // upper limit of range to test 
 | 
|  |   1487 |     {
 | 
|  |   1488 |     
 | 
|  |   1489 | 	TReal x,res,rres;
 | 
|  |   1490 | 
 | 
|  |   1491 |     for (TInt j=0;j<100;j++)
 | 
|  |   1492 | 		{
 | 
|  |   1493 | 		randrng(x,low,upp);
 | 
|  |   1494 | 		test(Math::Sin(res,x)==KErrNone);
 | 
|  |   1495 | 		x/=3;
 | 
|  |   1496 | 		test(Math::Sin(rres,x)==KErrNone);
 | 
|  |   1497 | 		TReal err=rres*rres;
 | 
|  |   1498 | 		err*=4;
 | 
|  |   1499 | 		err=3-err;
 | 
|  |   1500 | 		err*=rres;
 | 
|  |   1501 | 		test(testApprox(res,err,1.0E-12));
 | 
|  |   1502 | 		}
 | 
|  |   1503 |     }
 | 
|  |   1504 | 
 | 
|  |   1505 | LOCAL_C void sintest2()
 | 
|  |   1506 | /* 
 | 
|  |   1507 | Test selected values (which may not give exact results) 
 | 
|  |   1508 | */
 | 
|  |   1509 |     {
 | 
|  |   1510 |     
 | 
|  |   1511 | 	TReal res;
 | 
|  |   1512 | 	
 | 
|  |   1513 | 	// test errors
 | 
|  |   1514 | 	test(Math::Sin(res,KNaNTReal64)==KErrArgument);
 | 
|  |   1515 | 	test(Math::IsNaN(res));
 | 
|  |   1516 | 	test(Math::Sin(res,KPosInfTReal64)==KErrArgument);
 | 
|  |   1517 | 	test(Math::IsNaN(res));
 | 
|  |   1518 | 	test(Math::Sin(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   1519 | 	test(Math::IsNaN(res));
 | 
|  |   1520 | 	test(Math::Sin(res,2147483648.0*KPi)==KErrArgument);
 | 
|  |   1521 | 	test(Math::IsNaN(res));
 | 
|  |   1522 | 	test(Math::Sin(res,-1E+10)==KErrArgument);
 | 
|  |   1523 | 	test(Math::IsNaN(res));
 | 
|  |   1524 | 
 | 
|  |   1525 | 	TInt i=sizeof(testsin)/sizeof(TESTSINE);
 | 
|  |   1526 |     TInt j;
 | 
|  |   1527 |     
 | 
|  |   1528 | 	for (j=0;j<i;j++)
 | 
|  |   1529 | 		{
 | 
|  |   1530 | 		TReal x=testsin[j].num;
 | 
|  |   1531 | 		TReal y=testsin[j].res;
 | 
|  |   1532 | 		test(Math::Sin(res,x)==KErrNone);
 | 
|  |   1533 |    		test(testApprox(res,y,1.0E-15));
 | 
|  |   1534 | 		}
 | 
|  |   1535 | 
 | 
|  |   1536 | 	//Added by AnnW, October 1996
 | 
|  |   1537 | 	TInt mult=101;
 | 
|  |   1538 | 	for (j=-(mult-1); j<mult; j++)
 | 
|  |   1539 | 		{
 | 
|  |   1540 | 		test(Math::Sin(res, (4*j+1)*KPiBy2)==KErrNone);
 | 
|  |   1541 | 		test(testApprox(res,1.0,1.0E-15));
 | 
|  |   1542 | 
 | 
|  |   1543 | 		test(Math::Sin(res, (4*j+3)*KPiBy2)==KErrNone);
 | 
|  |   1544 | 		test(testApprox(res,-1.0,1.0E-15));
 | 
|  |   1545 | 
 | 
|  |   1546 | 		test(Math::Sin(res, ((4*j+1)*90)*KDegToRad)==KErrNone);
 | 
|  |   1547 | 		test(testApprox(res,1.0,1.0E-15));
 | 
|  |   1548 | 
 | 
|  |   1549 | 		test(Math::Sin(res, ((4*j+3)*90)*KDegToRad)==KErrNone);
 | 
|  |   1550 | 		test(testApprox(res,-1.0,1.0E-15));
 | 
|  |   1551 | 		}
 | 
|  |   1552 | 	//
 | 
|  |   1553 |     }
 | 
|  |   1554 | 
 | 
|  |   1555 | LOCAL_C void sintest3()
 | 
|  |   1556 | /* 
 | 
|  |   1557 | To test the identity sin(-x)=-sin(x) on the range [0,10*pi] 
 | 
|  |   1558 | */        
 | 
|  |   1559 |     {
 | 
|  |   1560 |     
 | 
|  |   1561 | 	TReal x,res,rres;
 | 
|  |   1562 | 
 | 
|  |   1563 |     TReal low=0.0;
 | 
|  |   1564 |     TReal upp=10*KPi;
 | 
|  |   1565 |     for (TInt j=0;j<10;j++)
 | 
|  |   1566 | 		{
 | 
|  |   1567 | 		randrng(x,low,upp);
 | 
|  |   1568 | 		test(Math::Sin(res,x)==KErrNone);
 | 
|  |   1569 | 		x*=(-1);
 | 
|  |   1570 | 		test(Math::Sin(rres,x)==KErrNone);
 | 
|  |   1571 | 		test(testApprox(rres,-res,1.0E-15));
 | 
|  |   1572 | 		}
 | 
|  |   1573 |     }
 | 
|  |   1574 | 
 | 
|  |   1575 | LOCAL_C void sintest4()
 | 
|  |   1576 | /* 
 | 
|  |   1577 | To test the identity sin(x)=x for x<<1 
 | 
|  |   1578 | */        
 | 
|  |   1579 |     {
 | 
|  |   1580 |     
 | 
|  |   1581 | 	TReal res,x;
 | 
|  |   1582 |     TReal low=1E-90;
 | 
|  |   1583 |     TReal upp=1E-10;
 | 
|  |   1584 | 
 | 
|  |   1585 |     for (TInt j=0;j<10;j++)
 | 
|  |   1586 | 		{
 | 
|  |   1587 | 		randrng(x,low,upp);
 | 
|  |   1588 | 		test(Math::Sin(res,x)==KErrNone);
 | 
|  |   1589 | 		test(testApprox(res,x,1.0E-15));
 | 
|  |   1590 | 		}
 | 
|  |   1591 | 
 | 
|  |   1592 | 	// test some denormals
 | 
|  |   1593 | 	test(Math::Sin(res,5E-324)==KErrNone);
 | 
|  |   1594 | 	test(testApprox(res,5E-324,1.0E-15));
 | 
|  |   1595 | 	test(Math::Sin(res,7E-317)==KErrNone);
 | 
|  |   1596 | 	test(testApprox(res,7E-317,1.0E-15));		
 | 
|  |   1597 |     }
 | 
|  |   1598 | /*
 | 
|  |   1599 | LOCAL_C void sintest5()
 | 
|  |   1600 | //
 | 
|  |   1601 | // To test that exact results are given for multiples of pi and
 | 
|  |   1602 | // values sufficiently close to them 
 | 
|  |   1603 | // Added by AnnW, October 1996
 | 
|  |   1604 | //
 | 
|  |   1605 | 	{
 | 
|  |   1606 | 	
 | 
|  |   1607 | 	TReal res;
 | 
|  |   1608 | 	TInt j;
 | 
|  |   1609 | 	TInt mult=101; // can use up to 32768
 | 
|  |   1610 | 
 | 
|  |   1611 |     test(Math::Sin(res,KNegZeroTReal64)==KErrNone);
 | 
|  |   1612 | 	test(res==0.0);
 | 
|  |   1613 | 
 | 
|  |   1614 |     for (j=-(mult-1); j<mult; j++)
 | 
|  |   1615 | 		{
 | 
|  |   1616 | 		test(Math::Sin(res, j*KPi)==KErrNone);
 | 
|  |   1617 | 		test(res==0.0);
 | 
|  |   1618 | 		test(Math::Sin(res, j*(KPi+1.224E-16))==KErrNone);
 | 
|  |   1619 | 		test(res==0.0);
 | 
|  |   1620 | 		test(Math::Sin(res, (j*180)*KDegToRad)==KErrNone);
 | 
|  |   1621 | 		test(res==0.0);
 | 
|  |   1622 | 		if (j!=0)
 | 
|  |   1623 | 			{
 | 
|  |   1624 | 			test(Math::Sin(res, j*(KPi+1.0E-14))==KErrNone);
 | 
|  |   1625 | 			test(res!=0.0);
 | 
|  |   1626 | 			}		
 | 
|  |   1627 | 		}
 | 
|  |   1628 | 	}
 | 
|  |   1629 | */
 | 
|  |   1630 | LOCAL_C void costest1()
 | 
|  |   1631 | /* 
 | 
|  |   1632 | To test the identity cos(x)=cos(x/3)[4*(cos(x/3)**2)-3] on the interval 
 | 
|  |   1633 | [7*pi,7.5*pi] 
 | 
|  |   1634 | Added by AnnW, October 1996
 | 
|  |   1635 | */
 | 
|  |   1636 |     {
 | 
|  |   1637 | 
 | 
|  |   1638 |     TReal x,res,rres;
 | 
|  |   1639 | 
 | 
|  |   1640 |     TReal low=7*KPi;
 | 
|  |   1641 |     TReal upp=7.5*KPi;
 | 
|  |   1642 |     for (TInt j=0;j<100;j++)
 | 
|  |   1643 | 		{
 | 
|  |   1644 | 		randrng(x,low,upp);
 | 
|  |   1645 | 		test(Math::Cos(res,x)==KErrNone);
 | 
|  |   1646 | 		x/=3;
 | 
|  |   1647 | 		test(Math::Cos(rres,x)==KErrNone);
 | 
|  |   1648 | 		test(testApprox(res,rres*(4*(rres*rres)-3),5.0E-13));
 | 
|  |   1649 | 		}
 | 
|  |   1650 |     }
 | 
|  |   1651 | 
 | 
|  |   1652 | LOCAL_C void costest2()
 | 
|  |   1653 | /*
 | 
|  |   1654 | Test selected values (which may not give exact results) 
 | 
|  |   1655 | Added by AnnW, October 1996
 | 
|  |   1656 | */
 | 
|  |   1657 |     {
 | 
|  |   1658 |     
 | 
|  |   1659 | 	TReal res;
 | 
|  |   1660 | 
 | 
|  |   1661 | 	// test errors
 | 
|  |   1662 | 	test(Math::Cos(res,KNaNTReal64)==KErrArgument);
 | 
|  |   1663 | 	test(Math::IsNaN(res));
 | 
|  |   1664 | 	test(Math::Cos(res,KPosInfTReal64)==KErrArgument);
 | 
|  |   1665 | 	test(Math::IsNaN(res));
 | 
|  |   1666 | 	test(Math::Cos(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   1667 | 	test(Math::IsNaN(res));
 | 
|  |   1668 | 	test(Math::Cos(res,(2147483648.0*KPi))==KErrArgument);
 | 
|  |   1669 | 	test(Math::IsNaN(res));
 | 
|  |   1670 | 	test(Math::Sin(res,-1E+10)==KErrArgument);
 | 
|  |   1671 | 	test(Math::IsNaN(res));
 | 
|  |   1672 | 
 | 
|  |   1673 | 	TInt j;
 | 
|  |   1674 | 	TInt mult=101;
 | 
|  |   1675 | 	TInt i=sizeof(testcos)/sizeof(TESTCOSINE);
 | 
|  |   1676 | 
 | 
|  |   1677 |     for (j=0; j<i; j++)
 | 
|  |   1678 | 		{
 | 
|  |   1679 | 		test(Math::Cos(res,testcos[j].num)==KErrNone);
 | 
|  |   1680 | 		test(testApprox(res,testcos[j].res,1.0E-15));		
 | 
|  |   1681 | 		}
 | 
|  |   1682 | 
 | 
|  |   1683 | 	test(Math::Cos(res,KNegZeroTReal64)==KErrNone);
 | 
|  |   1684 | 	test(testApprox(res,1.0,1E-15));
 | 
|  |   1685 | 
 | 
|  |   1686 |     for (j=-(mult-1); j<mult; j++)
 | 
|  |   1687 | 		{
 | 
|  |   1688 | 		test(Math::Cos(res, (2*j)*KPi)==KErrNone);
 | 
|  |   1689 | 		test(testApprox(res,1.0,1.0E-15));		
 | 
|  |   1690 | 
 | 
|  |   1691 | 		test(Math::Cos(res, (2*j+1)*KPi)==KErrNone);
 | 
|  |   1692 | 		test(testApprox(res,-1.0,1.0E-15));		
 | 
|  |   1693 | 
 | 
|  |   1694 | 		test(Math::Cos(res, (2*j)*(KPi+1.224E-16))==KErrNone);
 | 
|  |   1695 | 		test(testApprox(res,1.0,1.0E-15));		
 | 
|  |   1696 | 
 | 
|  |   1697 | 		test(Math::Cos(res, (2*j+1)*(KPi+1.224E-16))==KErrNone);
 | 
|  |   1698 | 		test(testApprox(res,-1.0,1.0E-15));		
 | 
|  |   1699 | 
 | 
|  |   1700 | 		test(Math::Cos(res, ((2*j)*180)*KDegToRad)==KErrNone);
 | 
|  |   1701 | 		test(testApprox(res,1.0,1.0E-15));		
 | 
|  |   1702 | 
 | 
|  |   1703 | 		test(Math::Cos(res, ((2*j+1)*180)*KDegToRad)==KErrNone);
 | 
|  |   1704 | 		test(testApprox(res,-1.0,1.0E-15));		
 | 
|  |   1705 | 		}
 | 
|  |   1706 |     }
 | 
|  |   1707 | 
 | 
|  |   1708 | LOCAL_C void costest3()
 | 
|  |   1709 | /* 
 | 
|  |   1710 | To test the identity cos(-x)=cos(x) on the range [0,10*pi]
 | 
|  |   1711 | Added by AnnW, October 1996 
 | 
|  |   1712 | */        
 | 
|  |   1713 |     {
 | 
|  |   1714 | 
 | 
|  |   1715 |     TReal x,res,rres;
 | 
|  |   1716 | 
 | 
|  |   1717 |     TReal low=0.0;
 | 
|  |   1718 |     TReal upp=10*KPi;
 | 
|  |   1719 |     for (TInt j=0;j<10;j++)
 | 
|  |   1720 | 		{
 | 
|  |   1721 | 		randrng(x,low,upp);
 | 
|  |   1722 | 		test(Math::Cos(res,x)==KErrNone);
 | 
|  |   1723 | 		x*=(-1);
 | 
|  |   1724 | 		test(Math::Cos(rres,x)==KErrNone);
 | 
|  |   1725 | 		test(testApprox(rres,res,1.0E-15));		
 | 
|  |   1726 | 		}
 | 
|  |   1727 |     }
 | 
|  |   1728 | 
 | 
|  |   1729 | LOCAL_C void costest4()
 | 
|  |   1730 | /* 
 | 
|  |   1731 | To test the identity cos(x)=1 for x<<1 
 | 
|  |   1732 | Added by Annw, October 1996
 | 
|  |   1733 | */        
 | 
|  |   1734 |     {
 | 
|  |   1735 | 
 | 
|  |   1736 |     TReal res,x;
 | 
|  |   1737 |     TReal low=1E-90;
 | 
|  |   1738 |     TReal upp=1E-10;
 | 
|  |   1739 | 
 | 
|  |   1740 |     for (TInt j=0;j<10;j++)
 | 
|  |   1741 | 		{
 | 
|  |   1742 | 		randrng(x,low,upp);
 | 
|  |   1743 | 		test(Math::Cos(res,x)==KErrNone);
 | 
|  |   1744 | 		test(testApprox(res,1.0,1.0E-15));
 | 
|  |   1745 | 		}
 | 
|  |   1746 | 
 | 
|  |   1747 | 	// test some denormals
 | 
|  |   1748 | 	test(Math::Cos(res,5E-324)==KErrNone);
 | 
|  |   1749 | 	test(testApprox(res,1.0,1.0E-15));
 | 
|  |   1750 | 	test(Math::Cos(res,1.34E-315)==KErrNone);
 | 
|  |   1751 | 	test(testApprox(res,1.0,1.0E-15));			
 | 
|  |   1752 |     }
 | 
|  |   1753 | /*
 | 
|  |   1754 | LOCAL_C void costest5()
 | 
|  |   1755 | //
 | 
|  |   1756 | // To test that exact results are given for multiples of KPi and
 | 
|  |   1757 | // values sufficiently close to them 
 | 
|  |   1758 | // Added by AnnW, October 1996
 | 
|  |   1759 | //
 | 
|  |   1760 | 	{
 | 
|  |   1761 | 
 | 
|  |   1762 | 	TReal res;
 | 
|  |   1763 | 	TInt mult=101;	// can use up to 32768
 | 
|  |   1764 | 	TInt j;
 | 
|  |   1765 |     
 | 
|  |   1766 |     for (j=-(mult-1); j<mult; j++)
 | 
|  |   1767 | 		{
 | 
|  |   1768 | 		test(Math::Cos(res, (2*j+1)*KPiBy2)==KErrNone);
 | 
|  |   1769 | 		test(res==0.0);
 | 
|  |   1770 | 		test(Math::Cos(res, (2*j+1)*KPiBy2+(j+1)*1.224E-16)==KErrNone);
 | 
|  |   1771 | 		test(res==0.0);
 | 
|  |   1772 | 		test(Math::Cos(res, (2*j+1)*90*KDegToRad)==KErrNone);
 | 
|  |   1773 | 		test(res==0.0);
 | 
|  |   1774 | 		if (j!=0)
 | 
|  |   1775 | 			{
 | 
|  |   1776 | 			test(Math::Sin(res, (2*j+1)*(KPiBy2+1.0E-14))==KErrNone);
 | 
|  |   1777 | 			test(res!=0.0);
 | 
|  |   1778 | 			}
 | 
|  |   1779 | 		}
 | 
|  |   1780 | 	}
 | 
|  |   1781 | */
 | 
|  |   1782 | LOCAL_C void tantest1(TReal low,TReal upp)
 | 
|  |   1783 | /*
 | 
|  |   1784 | Test the identity tan(x)=(2*tan(x/2))/(1-tan(x/2)**2) on the range low<=x<upp
 | 
|  |   1785 | */
 | 
|  |   1786 |     //TReal low; // lower limit of range to test
 | 
|  |   1787 |     //TReal upp; // upper limit of range to test 
 | 
|  |   1788 |     {
 | 
|  |   1789 | 
 | 
|  |   1790 |     TReal x,res,rres;
 | 
|  |   1791 | 
 | 
|  |   1792 |     for (TInt j=0;j<100;j++)
 | 
|  |   1793 | 		{
 | 
|  |   1794 | 		if (j==90)
 | 
|  |   1795 | 			{
 | 
|  |   1796 | 			test(1);
 | 
|  |   1797 | 			}
 | 
|  |   1798 | 		randrng(x,low,upp);
 | 
|  |   1799 | 		test(Math::Tan(res,x)==KErrNone);
 | 
|  |   1800 | 		x/=2;
 | 
|  |   1801 | 		test(Math::Tan(rres,x)==KErrNone);
 | 
|  |   1802 | 		TReal ex=(2*rres)/(1-rres*rres);
 | 
|  |   1803 | 		test(testApprox(res,ex,1.0E-15));		
 | 
|  |   1804 | 		}
 | 
|  |   1805 |     }
 | 
|  |   1806 | 
 | 
|  |   1807 | LOCAL_C void tantest2()
 | 
|  |   1808 | /* 
 | 
|  |   1809 | To test tangent for specific  arguments 
 | 
|  |   1810 | */
 | 
|  |   1811 |     {
 | 
|  |   1812 | 
 | 
|  |   1813 |     TReal res;
 | 
|  |   1814 | 
 | 
|  |   1815 | 	// test errors
 | 
|  |   1816 | 	test(Math::Tan(res,KNaNTReal64)==KErrArgument);
 | 
|  |   1817 | 	test(Math::IsNaN(res));
 | 
|  |   1818 | 	test(Math::Tan(res,KPosInfTReal64)==KErrArgument);
 | 
|  |   1819 | 	test(Math::IsNaN(res));
 | 
|  |   1820 | 	test(Math::Tan(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   1821 | 	test(Math::IsNaN(res));
 | 
|  |   1822 | 	test(Math::Tan(res, 1073741824.0*KPi)==KErrArgument);
 | 
|  |   1823 | 	test(Math::IsNaN(res));
 | 
|  |   1824 | 	test(Math::Tan(res, 4.0E+102)==KErrArgument);
 | 
|  |   1825 | 	test(Math::IsNaN(res));
 | 
|  |   1826 | 	test(Math::Tan(res, -4.0E+102)==KErrArgument);
 | 
|  |   1827 | 	test(Math::IsNaN(res));
 | 
|  |   1828 |     
 | 
|  |   1829 | 	TInt j;
 | 
|  |   1830 | 	TInt mult=101;	// can use up to 32768
 | 
|  |   1831 |     TInt i=sizeof(testtan)/sizeof(TAN);
 | 
|  |   1832 |     for (j=0;j<i;j++)
 | 
|  |   1833 | 		{
 | 
|  |   1834 | 		test(Math::Tan(res,testtan[j].angle)==KErrNone);
 | 
|  |   1835 | 		test(testApprox(res,testtan[j].result,1.0E-15));		
 | 
|  |   1836 | 		}
 | 
|  |   1837 | 
 | 
|  |   1838 | 	//Added by AnnW, October 1996
 | 
|  |   1839 | 	for (j=-(mult-1); j<mult; j++)
 | 
|  |   1840 | 		{
 | 
|  |   1841 | //		test(Math::Tan(res, (2*j+1)*KPiBy2)==KErrOverflow);
 | 
|  |   1842 | //		test(Math::IsInfinite(res));	// this test is no longer valid
 | 
|  |   1843 | 		test(Math::Tan(res, (2*j+1)*(KPiBy2+1.0E-15))!=KErrOverflow);
 | 
|  |   1844 | 		test(Math::IsFinite(res));
 | 
|  |   1845 | 		}
 | 
|  |   1846 | 	
 | 
|  |   1847 | 	// Check that signs are correct
 | 
|  |   1848 | 	test(Math::Tan(res,KPiBy2+5E-16)==KErrNone);
 | 
|  |   1849 | 	test(res<0);
 | 
|  |   1850 | 	test(Math::Tan(res,KPiBy2-5E-16)==KErrNone);
 | 
|  |   1851 | 	test(res>0);
 | 
|  |   1852 | 	}
 | 
|  |   1853 | 
 | 
|  |   1854 | LOCAL_C void tantest3()
 | 
|  |   1855 | /* 
 | 
|  |   1856 | To test the identity tan(-x)=-tan(x) on the range [-1.5,1.5] 
 | 
|  |   1857 | */        
 | 
|  |   1858 |     {
 | 
|  |   1859 | 
 | 
|  |   1860 |     TReal x,res,rres;
 | 
|  |   1861 | 
 | 
|  |   1862 |     TReal low=(-1.5);
 | 
|  |   1863 |     TReal upp=1.5;
 | 
|  |   1864 |     for (TInt j=0;j<10;j++)
 | 
|  |   1865 | 		{
 | 
|  |   1866 | 		randrng(x,low,upp);
 | 
|  |   1867 | 		test(Math::Tan(res,x)==KErrNone);
 | 
|  |   1868 | 		x*=(-1);
 | 
|  |   1869 | 		test(Math::Tan(rres,x)==KErrNone);
 | 
|  |   1870 | 		test(testApprox(rres,-res,1.0E-15));		
 | 
|  |   1871 | 		}
 | 
|  |   1872 |     }
 | 
|  |   1873 | 
 | 
|  |   1874 | LOCAL_C void tantest4()
 | 
|  |   1875 | /* 
 | 
|  |   1876 | To test the identity tan(x)=x for x<<1 
 | 
|  |   1877 | */        
 | 
|  |   1878 |     {
 | 
|  |   1879 | 
 | 
|  |   1880 |     TReal x,res;
 | 
|  |   1881 | 
 | 
|  |   1882 |     TReal low=1E-90;
 | 
|  |   1883 |     TReal upp=1E-10;
 | 
|  |   1884 |     for (TInt j=0;j<10;j++)
 | 
|  |   1885 | 		{
 | 
|  |   1886 | 		randrng(x,low,upp);
 | 
|  |   1887 | 		test(Math::Tan(res,x)==KErrNone);
 | 
|  |   1888 | 		test(testApprox(res,x,1.0E-15));		
 | 
|  |   1889 | 		}
 | 
|  |   1890 | 
 | 
|  |   1891 | 	// Check some denormals
 | 
|  |   1892 | 	test(Math::Tan(res,5E-324)==KErrNone);
 | 
|  |   1893 | 	test(res==5E-324);
 | 
|  |   1894 | 	test(Math::Tan(res,-1.234567891234E-315)==KErrNone);
 | 
|  |   1895 | 	test(res==-1.234567891234E-315);	
 | 
|  |   1896 |     }
 | 
|  |   1897 | /*
 | 
|  |   1898 | LOCAL_C void tantest5()
 | 
|  |   1899 | 
 | 
|  |   1900 | // To test that exact results are given for multiples of KPi
 | 
|  |   1901 | // Added by AnnW, October 1996
 | 
|  |   1902 | 
 | 
|  |   1903 | 	{
 | 
|  |   1904 | 
 | 
|  |   1905 |     TReal res;
 | 
|  |   1906 | 	TInt j;
 | 
|  |   1907 | 	TInt mult=101;	// can use up to 32768
 | 
|  |   1908 | 
 | 
|  |   1909 | 	test(Math::Tan(res,KNegZeroTReal64)==KErrNone);
 | 
|  |   1910 | 	test(res==KNegZeroTReal64);
 | 
|  |   1911 |     
 | 
|  |   1912 |     for (j=-(mult-1); j<mult; j++)
 | 
|  |   1913 | 		{
 | 
|  |   1914 | 		test(Math::Tan(res, j*KPi)==KErrNone);
 | 
|  |   1915 | 		test(res==0.0);
 | 
|  |   1916 | 		test(Math::Tan(res, j*(KPi+1.224E-16))==KErrNone);
 | 
|  |   1917 | 		test(res==0.0);
 | 
|  |   1918 | 		test(Math::Tan(res, (j*180)*KDegToRad)==KErrNone);
 | 
|  |   1919 | 		test(res==0.0);
 | 
|  |   1920 | 		if (j!=0)
 | 
|  |   1921 | 			{
 | 
|  |   1922 | 			test(Math::Sin(res, j*(KPi+1.0E-14))==KErrNone);
 | 
|  |   1923 | 			test(res!=0.0);
 | 
|  |   1924 | 			}
 | 
|  |   1925 | 		}
 | 
|  |   1926 | 	}
 | 
|  |   1927 | */
 | 
|  |   1928 | LOCAL_C void astest1(TReal low,TReal upp,TInt k,TInt cosflg)
 | 
|  |   1929 | /*
 | 
|  |   1930 | Tests random numbers in the range [low,upp] using the Taylor approximation 
 | 
|  |   1931 | */
 | 
|  |   1932 |     //TReal low; // lower limit of range to test
 | 
|  |   1933 |     //TReal upp; // upper limit of range to test 
 | 
|  |   1934 |     //TInt k; // Highest order term to be used in the taylor approximation
 | 
|  |   1935 |     //TInt cosflg; // Flag for arc cos
 | 
|  |   1936 |     {
 | 
|  |   1937 | 
 | 
|  |   1938 |     TReal res,x;
 | 
|  |   1939 | 
 | 
|  |   1940 |     for (TInt j=0;j<100;j++)
 | 
|  |   1941 | 		{
 | 
|  |   1942 | 		randrng(x,low,upp);
 | 
|  |   1943 | 		if (cosflg)
 | 
|  |   1944 | 			test(Math::ACos(res,x)==KErrNone);
 | 
|  |   1945 | 		else
 | 
|  |   1946 | 			test(Math::ASin(res,x)==KErrNone);
 | 
|  |   1947 | 		TReal tres=taylor(x,k);
 | 
|  |   1948 | 		if (cosflg)
 | 
|  |   1949 | 			tres=KPiBy2-tres;
 | 
|  |   1950 | 		test(testApprox(tres,res,5.0E-15));		
 | 
|  |   1951 | 		}
 | 
|  |   1952 |     }
 | 
|  |   1953 | 
 | 
|  |   1954 | LOCAL_C void astest2()
 | 
|  |   1955 | /* 
 | 
|  |   1956 | To test the identity arc sin(x)=x for x<<1 
 | 
|  |   1957 | */        
 | 
|  |   1958 |     {
 | 
|  |   1959 | 
 | 
|  |   1960 |     TReal x,res;
 | 
|  |   1961 | 
 | 
|  |   1962 |     TReal low=1E-90;
 | 
|  |   1963 |     TReal upp=1E-10;
 | 
|  |   1964 |     for (TInt j=0;j<100;j++)
 | 
|  |   1965 | 		{
 | 
|  |   1966 | 		randrng(x,low,upp);
 | 
|  |   1967 | 		test(Math::ASin(res,x)==KErrNone);
 | 
|  |   1968 | 		test(testApprox(res,x,1.0E-15));		
 | 
|  |   1969 | 		}
 | 
|  |   1970 | 
 | 
|  |   1971 | 	// Check some denormals
 | 
|  |   1972 | 	test(Math::ASin(res,5E-324)==KErrNone);
 | 
|  |   1973 | 	test(res==5E-324);		
 | 
|  |   1974 | 	test(Math::ASin(res,-8.912345678E-318)==KErrNone);
 | 
|  |   1975 | 	test(res==-8.912345678E-318);		
 | 
|  |   1976 |     }
 | 
|  |   1977 | 
 | 
|  |   1978 | LOCAL_C void astest3()
 | 
|  |   1979 | /* 
 | 
|  |   1980 | To test the identity arc sin(-x)=-arc sin(x) 
 | 
|  |   1981 | */        
 | 
|  |   1982 |     {
 | 
|  |   1983 | 
 | 
|  |   1984 |     TReal res,rres,x;
 | 
|  |   1985 | 
 | 
|  |   1986 |     TReal low=0.0;
 | 
|  |   1987 |     TReal upp=1.0;
 | 
|  |   1988 |     for (TInt j=0;j<100;j++)
 | 
|  |   1989 | 		{
 | 
|  |   1990 | 		randrng(x,low,upp);
 | 
|  |   1991 | 		test(Math::ASin(res,x)==KErrNone);
 | 
|  |   1992 | 		TReal y=(-x);
 | 
|  |   1993 | 		test(Math::ASin(rres,y)==KErrNone);
 | 
|  |   1994 | 		test(testApprox(rres,-res,1.0E-15));		
 | 
|  |   1995 | 		}
 | 
|  |   1996 |     }
 | 
|  |   1997 | 
 | 
|  |   1998 | LOCAL_C void astest4(TInt k,TInt sgn)
 | 
|  |   1999 | /* 
 | 
|  |   2000 | Test selected numbers 
 | 
|  |   2001 | */
 | 
|  |   2002 |     //TInt k; // arc cosine flag
 | 
|  |   2003 |     //TInt sgn; // sign flag for range    
 | 
|  |   2004 |     {
 | 
|  |   2005 | 
 | 
|  |   2006 |     TReal res;
 | 
|  |   2007 | 
 | 
|  |   2008 | 	// test errors
 | 
|  |   2009 | 	test(Math::ASin(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2010 | 	test(Math::IsNaN(res));
 | 
|  |   2011 | 	test(Math::ASin(res,KPosInfTReal64)==KErrArgument);
 | 
|  |   2012 | 	test(Math::IsNaN(res));
 | 
|  |   2013 | 	test(Math::ASin(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   2014 | 	test(Math::IsNaN(res));
 | 
|  |   2015 | 	test(Math::ASin(res,1.0000000000001)==KErrArgument);
 | 
|  |   2016 | 	test(Math::IsNaN(res));
 | 
|  |   2017 | 	test(Math::ASin(res,-1.0000000000001)==KErrArgument);
 | 
|  |   2018 | 	test(Math::IsNaN(res));
 | 
|  |   2019 | 	test(Math::ACos(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2020 | 	test(Math::IsNaN(res));
 | 
|  |   2021 | 	test(Math::ACos(res,KPosInfTReal64)==KErrArgument);
 | 
|  |   2022 | 	test(Math::IsNaN(res));
 | 
|  |   2023 | 	test(Math::ACos(res,KNegInfTReal64)==KErrArgument);
 | 
|  |   2024 | 	test(Math::IsNaN(res));
 | 
|  |   2025 | 	test(Math::ACos(res,1.0000000000001)==KErrArgument);
 | 
|  |   2026 | 	test(Math::IsNaN(res));
 | 
|  |   2027 | 	test(Math::ACos(res,-1.0000000000001)==KErrArgument);
 | 
|  |   2028 | 	test(Math::IsNaN(res));
 | 
|  |   2029 | 
 | 
|  |   2030 | 	test(Math::ASin(res,0.0)==KErrNone);
 | 
|  |   2031 | 	test(res==0.0);
 | 
|  |   2032 | 	test(Math::ASin(res,KNegZeroTReal64)==KErrNone);
 | 
|  |   2033 | 	test(res==0.0);
 | 
|  |   2034 | 
 | 
|  |   2035 |     TInt i=sizeof(testas)/sizeof(TESTASC);
 | 
|  |   2036 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2037 | 		{
 | 
|  |   2038 | 		// NB Results for comparison only given to 12 or 13 decimal places, so can't expect 
 | 
|  |   2039 | 		// better accuracy
 | 
|  |   2040 | 		if (k)
 | 
|  |   2041 | 			{
 | 
|  |   2042 | 			testas[j].num*=sgn;
 | 
|  |   2043 | 			testas[j].res*=sgn;
 | 
|  |   2044 | 			test(Math::ACos(res,testas[j].num)==KErrNone);
 | 
|  |   2045 | 			test(testApprox(res,(KPiBy2-testas[j].res),1.0E-11));	
 | 
|  |   2046 | 			}
 | 
|  |   2047 | 		else
 | 
|  |   2048 | 			{
 | 
|  |   2049 | 			test(Math::ASin(res,testas[j].num)==KErrNone);
 | 
|  |   2050 | 			test(testApprox(res,testas[j].res,1.0E-12));	
 | 
|  |   2051 | 			}
 | 
|  |   2052 | 		}
 | 
|  |   2053 | 
 | 
|  |   2054 | 	// Check some denormals for ACos()
 | 
|  |   2055 | 	test(Math::ACos(res,5E-324)==KErrNone);
 | 
|  |   2056 | 	test(res==KPiBy2);	
 | 
|  |   2057 | 	test(Math::ACos(res,-9.87654E-320)==KErrNone);
 | 
|  |   2058 | 	test(res==KPiBy2);						
 | 
|  |   2059 |     }
 | 
|  |   2060 | 
 | 
|  |   2061 | LOCAL_C void attest1()
 | 
|  |   2062 | /* 
 | 
|  |   2063 | Random argument tests for x in the primary range, comparing the result with a 
 | 
|  |   2064 | Taylor series approximation
 | 
|  |   2065 | */
 | 
|  |   2066 |     {
 | 
|  |   2067 | 
 | 
|  |   2068 |     TReal res,x;
 | 
|  |   2069 | 
 | 
|  |   2070 |     TReal low=(-0.0625);
 | 
|  |   2071 |     TReal upp=0.0625;
 | 
|  |   2072 |     for (TInt i=0;i<10;i++)
 | 
|  |   2073 | 		{
 | 
|  |   2074 | 		randrng(x,low,upp);
 | 
|  |   2075 | 		test(Math::ATan(res,x)==KErrNone);
 | 
|  |   2076 | 		TReal tres=tayatan(x);
 | 
|  |   2077 | 		test(testApprox(res,tres,1.0E-15));		
 | 
|  |   2078 | 		}
 | 
|  |   2079 |     }
 | 
|  |   2080 | 
 | 
|  |   2081 | LOCAL_C void attest2()
 | 
|  |   2082 | /* 
 | 
|  |   2083 | Random argument tests for x outside the primary range, using the identity
 | 
|  |   2084 | arctan(u)=arctan(v)+arctan[(u-v)/(1+uv)]
 | 
|  |   2085 | */
 | 
|  |   2086 |     {
 | 
|  |   2087 | 
 | 
|  |   2088 |     TReal x,res,rres,atcnst;
 | 
|  |   2089 | 
 | 
|  |   2090 |     TReal low=0.0625;
 | 
|  |   2091 |     TReal upp=2.0-KSqt3;
 | 
|  |   2092 |     TReal cnst=0.0625;
 | 
|  |   2093 |     test(Math::ATan(atcnst,cnst)==KErrNone);
 | 
|  |   2094 |     for (TInt i=0;i<10;i++)
 | 
|  |   2095 | 		{
 | 
|  |   2096 | 		randrng(x,low,upp);
 | 
|  |   2097 | 		test(Math::ATan(res,x)==KErrNone);
 | 
|  |   2098 | 		TReal y=(x-cnst)/(1+x*cnst);
 | 
|  |   2099 | 		test(Math::ATan(rres,y)==KErrNone);
 | 
|  |   2100 | 		test(testApprox(res,(atcnst+rres),1.0E-15));		
 | 
|  |   2101 | 		}
 | 
|  |   2102 |     }                   
 | 
|  |   2103 | 
 | 
|  |   2104 | LOCAL_C void attest3()
 | 
|  |   2105 | /*
 | 
|  |   2106 | Check that the identity arctan(-x)=-arctan(x) holds
 | 
|  |   2107 | */
 | 
|  |   2108 |     {
 | 
|  |   2109 | 
 | 
|  |   2110 |     TReal res,rres,x;
 | 
|  |   2111 |     TReal low=0.0;
 | 
|  |   2112 |     TReal upp=1.0;
 | 
|  |   2113 |     for (TInt i=0;i<10;i++)
 | 
|  |   2114 | 		{
 | 
|  |   2115 | 		randrng(x,upp,low);
 | 
|  |   2116 | 		test(Math::ATan(res,x)==KErrNone);
 | 
|  |   2117 | 		x=(-x);
 | 
|  |   2118 | 		test(Math::ATan(rres,x)==KErrNone);
 | 
|  |   2119 | 		test(testApprox(res,-rres,1.0E-15));		
 | 
|  |   2120 | 		}
 | 
|  |   2121 |     }           
 | 
|  |   2122 | 
 | 
|  |   2123 | LOCAL_C void attest4()
 | 
|  |   2124 | /* 
 | 
|  |   2125 | Check that the identity arctan(x)=x for Abs(x)<1 holds
 | 
|  |   2126 | */
 | 
|  |   2127 |     {
 | 
|  |   2128 | 
 | 
|  |   2129 |     TReal x,res;
 | 
|  |   2130 | 
 | 
|  |   2131 |     TReal low=1E-90;
 | 
|  |   2132 |     TReal upp=1E-20;
 | 
|  |   2133 |     for (TInt i=0;i<10;i++)
 | 
|  |   2134 | 		{
 | 
|  |   2135 | 		randrng(x,low,upp);
 | 
|  |   2136 | 		test(Math::ATan(res,x)==KErrNone);
 | 
|  |   2137 | 		test(testApprox(res,x,1.0E-15));		
 | 
|  |   2138 | 		}
 | 
|  |   2139 | 
 | 
|  |   2140 | 	// Check some denormals
 | 
|  |   2141 | 	test(Math::ATan(res,-5E-324)==KErrNone);
 | 
|  |   2142 | 	test(res==-5E-324);		
 | 
|  |   2143 | 	test(Math::ATan(res,7.123E-322)==KErrNone);
 | 
|  |   2144 | 	test(res==7.123E-322);			
 | 
|  |   2145 |     }
 | 
|  |   2146 | 
 | 
|  |   2147 | LOCAL_C void attest5()
 | 
|  |   2148 | /*
 | 
|  |   2149 | Tests selected values
 | 
|  |   2150 | */
 | 
|  |   2151 |     {
 | 
|  |   2152 | 
 | 
|  |   2153 |     TReal res;
 | 
|  |   2154 | 
 | 
|  |   2155 | 	// test errors, special cases
 | 
|  |   2156 | 	test(Math::ATan(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2157 | 	test(Math::IsNaN(res));
 | 
|  |   2158 | 	test(Math::ATan(res,0.0)==KErrNone);
 | 
|  |   2159 | 	test(res==0.0);
 | 
|  |   2160 | 	test(Math::ATan(res,KNegZeroTReal64)==KErrNone);
 | 
|  |   2161 | 	test(res==0.0);
 | 
|  |   2162 | 	test(Math::ATan(res,KPosInfTReal64)==KErrNone);
 | 
|  |   2163 | 	test(res==KPiBy2);
 | 
|  |   2164 | 	test(Math::ATan(res,KNegInfTReal64)==KErrNone);
 | 
|  |   2165 | 	test(res==-KPiBy2);
 | 
|  |   2166 | 
 | 
|  |   2167 | 	test(Math::ATan(res,KNaNTReal64,1.0)==KErrArgument);
 | 
|  |   2168 | 	test(Math::IsNaN(res));
 | 
|  |   2169 | 	test(Math::ATan(res,1.0,KNaNTReal64)==KErrArgument);
 | 
|  |   2170 | 	test(Math::IsNaN(res));
 | 
|  |   2171 | 	test(Math::ATan(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
 | 
|  |   2172 | 	test(Math::IsNaN(res));
 | 
|  |   2173 | 	test(Math::ATan(res,0.0,KNegZeroTReal64)==KErrArgument);
 | 
|  |   2174 | 	test(Math::IsNaN(res));
 | 
|  |   2175 | 	test(Math::ATan(res,KNegZeroTReal64,KNegZeroTReal64)==KErrArgument);
 | 
|  |   2176 | 	test(Math::IsNaN(res));	
 | 
|  |   2177 | 	test(Math::ATan(res,0.0,0.0)==KErrArgument);
 | 
|  |   2178 | 	test(Math::IsNaN(res));	
 | 
|  |   2179 | 	test(Math::ATan(res,KNegZeroTReal64,KNegZeroTReal64)==KErrArgument);
 | 
|  |   2180 | 	test(Math::IsNaN(res));	
 | 
|  |   2181 | 	test(Math::ATan(res,KPosInfTReal64,KNegInfTReal64)==KErrNone);
 | 
|  |   2182 | 	test(res==3.0*(KPiBy2/2.0));
 | 
|  |   2183 | 	test(Math::ATan(res,KPosInfTReal64,KPosInfTReal64)==KErrNone);
 | 
|  |   2184 | 	test(res==KPiBy2/2.0);
 | 
|  |   2185 | 	test(Math::ATan(res,KNegInfTReal64,KPosInfTReal64)==KErrNone);
 | 
|  |   2186 | 	test(res==-(KPiBy2/2.0));
 | 
|  |   2187 | 	test(Math::ATan(res,KNegInfTReal64,KNegInfTReal64)==KErrNone);
 | 
|  |   2188 | 	test(res==-3.0*(KPiBy2/2.0));
 | 
|  |   2189 | 	test(Math::ATan(res,KNegZeroTReal64,1.0)==KErrNone);
 | 
|  |   2190 | 	test(res==0.0);
 | 
|  |   2191 | 	test(Math::ATan(res,0.0,1.0)==KErrNone);
 | 
|  |   2192 | 	test(res==0.0);	
 | 
|  |   2193 | 	test(Math::ATan(res,0.0,-1.0)==KErrNone);
 | 
|  |   2194 | 	test(res==KPi);	
 | 
|  |   2195 | 	test(Math::ATan(res,1.0,KPosInfTReal64)==KErrNone);
 | 
|  |   2196 | 	test(res==0.0);
 | 
|  |   2197 | 	test(Math::ATan(res,1.0,KNegInfTReal64)==KErrNone);
 | 
|  |   2198 | 	test(res==KPi);
 | 
|  |   2199 | 	test(Math::ATan(res,0.0,KPosInfTReal64)==KErrNone);	
 | 
|  |   2200 | 	test(res==0.0);
 | 
|  |   2201 | 	test(Math::ATan(res,KPosInfTReal64,1.0)==KErrNone);	
 | 
|  |   2202 | 	test(res==KPiBy2);
 | 
|  |   2203 | 	test(Math::ATan(res,KNegInfTReal64,1.0)==KErrNone);	
 | 
|  |   2204 | 	test(res==-KPiBy2);
 | 
|  |   2205 | 	test(Math::ATan(res,1.0,0.0)==KErrNone);	
 | 
|  |   2206 | 	test(res==KPiBy2);
 | 
|  |   2207 | 	test(Math::ATan(res,1.0,KNegZeroTReal64)==KErrNone);	
 | 
|  |   2208 | 	test(res==KPiBy2);
 | 
|  |   2209 | 	test(Math::ATan(res,KPosInfTReal64,-1.0)==KErrNone);	
 | 
|  |   2210 | 	test(res==KPiBy2);
 | 
|  |   2211 | 	test(Math::ATan(res,KNegInfTReal64,-1.0)==KErrNone);	
 | 
|  |   2212 | 	test(res==-KPiBy2);
 | 
|  |   2213 | 	test(Math::ATan(res,-1.0,0.0)==KErrNone);	
 | 
|  |   2214 | 	test(res==-KPiBy2);
 | 
|  |   2215 | 	test(Math::ATan(res,-1.0,KNegZeroTReal64)==KErrNone);	
 | 
|  |   2216 | 	test(res==-KPiBy2);
 | 
|  |   2217 | 	test(Math::ATan(res,5E-324,10)==KErrNone);	
 | 
|  |   2218 | 	test(res==0.0);
 | 
|  |   2219 | 	test(Math::ATan(res,1E+308,0.1)==KErrNone);	
 | 
|  |   2220 | 	test(res==KPiBy2);
 | 
|  |   2221 | 
 | 
|  |   2222 |     TInt i=sizeof(testat2)/sizeof(TESTATAN2);
 | 
|  |   2223 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2224 | 		{
 | 
|  |   2225 | 		// NB Some results only given to 12 dp so cannot expect better accuracy
 | 
|  |   2226 | 		test(Math::ATan(res,testat2[j].num1,testat2[j].num2)==KErrNone);
 | 
|  |   2227 | 		test(testApprox(res,testat2[j].res,1.0E-12));		
 | 
|  |   2228 | 		}	
 | 
|  |   2229 |     }
 | 
|  |   2230 | 
 | 
|  |   2231 | LOCAL_C void inttest1()
 | 
|  |   2232 | /*
 | 
|  |   2233 | Tests specific numbers
 | 
|  |   2234 | */
 | 
|  |   2235 |     {
 | 
|  |   2236 | 
 | 
|  |   2237 |     TReal res;
 | 
|  |   2238 | 
 | 
|  |   2239 | 	// Specials
 | 
|  |   2240 | 	test(Math::Int(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2241 | 	test(Math::IsNaN(res));
 | 
|  |   2242 | 	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   2243 | 	test(res==KPosInfTReal64);
 | 
|  |   2244 | 	test(Math::Int(res,KNegInfTReal64)==KErrOverflow);
 | 
|  |   2245 | 	test(res==KNegInfTReal64);
 | 
|  |   2246 | 
 | 
|  |   2247 |     TInt i=sizeof(testint1)/sizeof(INT_TEST);
 | 
|  |   2248 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2249 | 		{
 | 
|  |   2250 | 		test(Math::Int(res,testint1[j].num)==KErrNone);
 | 
|  |   2251 | 		test(res==testint1[j].res);
 | 
|  |   2252 | 		}
 | 
|  |   2253 | 
 | 
|  |   2254 | 	// Check some denormals
 | 
|  |   2255 | 	test(Math::Int(res,5E-324)==KErrNone);
 | 
|  |   2256 | 	test(res==0.0);
 | 
|  |   2257 | 	test(Math::Int(res,1.45E-309)==KErrNone);
 | 
|  |   2258 | 	test(res==0.0);
 | 
|  |   2259 |     }
 | 
|  |   2260 | 
 | 
|  |   2261 | LOCAL_C void inttest2()
 | 
|  |   2262 | /*
 | 
|  |   2263 | Tests specific numbers
 | 
|  |   2264 | */
 | 
|  |   2265 |     {
 | 
|  |   2266 | 
 | 
|  |   2267 |     TInt16 res;
 | 
|  |   2268 | 
 | 
|  |   2269 | 	// test errors
 | 
|  |   2270 | 	test(Math::Int(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2271 | 	test(res==0);
 | 
|  |   2272 | 	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   2273 | 	test(res==TInt16(KMaxTInt16));	
 | 
|  |   2274 | 	test(Math::Int(res,32768.9830857)==KErrOverflow);
 | 
|  |   2275 | 	test(res==TInt16(KMaxTInt16));
 | 
|  |   2276 | 	test(Math::Int(res,32769.36946)==KErrOverflow);
 | 
|  |   2277 | 	test(res==TInt16(KMaxTInt16));
 | 
|  |   2278 | 	test(Math::Int(res,KNegInfTReal64)==KErrUnderflow);
 | 
|  |   2279 |     test(res==TInt16(KMinTInt16));
 | 
|  |   2280 | 	test(Math::Int(res,-32774.997937)==KErrUnderflow);
 | 
|  |   2281 |     test(res==TInt16(KMinTInt16));
 | 
|  |   2282 | 
 | 
|  |   2283 |     TInt i=sizeof(testint2)/sizeof(INTI_TEST);
 | 
|  |   2284 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2285 | 		{
 | 
|  |   2286 | 		test(Math::Int(res,testint2[j].num)==KErrNone);
 | 
|  |   2287 | 		test(res==testint2[j].res);		
 | 
|  |   2288 | 		}
 | 
|  |   2289 | 
 | 
|  |   2290 | 	// Check some denormals
 | 
|  |   2291 | 	test(Math::Int(res,5E-324)==KErrNone);
 | 
|  |   2292 | 	test(res==0.0);
 | 
|  |   2293 | 	test(Math::Int(res,1.45E-309)==KErrNone);
 | 
|  |   2294 | 	test(res==0.0);
 | 
|  |   2295 | 	}
 | 
|  |   2296 | 
 | 
|  |   2297 | LOCAL_C void inttest3()
 | 
|  |   2298 | /*
 | 
|  |   2299 | Tests specific numbers
 | 
|  |   2300 | */
 | 
|  |   2301 |     {
 | 
|  |   2302 | 
 | 
|  |   2303 |     TInt32 res;
 | 
|  |   2304 | 
 | 
|  |   2305 |     // test errors
 | 
|  |   2306 | 	test(Math::Int(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2307 | 	test(res==0);
 | 
|  |   2308 | 	test(Math::Int(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   2309 | 	test(res==KMaxTInt32);
 | 
|  |   2310 | 	test(Math::Int(res,2147483648.34576)==KErrOverflow);
 | 
|  |   2311 | 	test(res==KMaxTInt32);
 | 
|  |   2312 |     test(Math::Int(res,2147553576.8794365)==KErrOverflow);
 | 
|  |   2313 | 	test(res==KMaxTInt32);
 | 
|  |   2314 |     test(Math::Int(res,KNegInfTReal64)==KErrUnderflow);
 | 
|  |   2315 | 	test(res==KMinTInt32);
 | 
|  |   2316 | 	test(Math::Int(res,-2147496757.583)==KErrUnderflow);
 | 
|  |   2317 | 	test(res==KMinTInt32);
 | 
|  |   2318 |     
 | 
|  |   2319 | 	TInt i=sizeof(testint3)/sizeof(INTL_TEST);
 | 
|  |   2320 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2321 | 		{
 | 
|  |   2322 | 		test(Math::Int(res,testint3[j].num)==KErrNone);
 | 
|  |   2323 | 		test(res==testint3[j].res);
 | 
|  |   2324 | 		}
 | 
|  |   2325 | 
 | 
|  |   2326 | 	// Check some denormals
 | 
|  |   2327 | 	test(Math::Int(res,5E-324)==KErrNone);
 | 
|  |   2328 | 	test(res==0.0);
 | 
|  |   2329 | 	test(Math::Int(res,1.45E-309)==KErrNone);
 | 
|  |   2330 | 	test(res==0.0);
 | 
|  |   2331 | 	}
 | 
|  |   2332 | 
 | 
|  |   2333 | LOCAL_C void inttest4()
 | 
|  |   2334 | 	{
 | 
|  |   2335 | 	// tests Int()
 | 
|  |   2336 | 	TInt16 tint16;
 | 
|  |   2337 | 	TInt32 tint32;
 | 
|  |   2338 | 	TReal trg,src=100.0;
 | 
|  |   2339 | 
 | 
|  |   2340 | 	test.Start(_L("Math::Int()"));
 | 
|  |   2341 | 	src=0.0;
 | 
|  |   2342 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2343 | 	test(trg==0.0);
 | 
|  |   2344 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2345 | 	test(tint16==0);
 | 
|  |   2346 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2347 | 	test(tint32==0);
 | 
|  |   2348 | 
 | 
|  |   2349 |     src=0.1233456789;
 | 
|  |   2350 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2351 | 	test(trg==0.0);
 | 
|  |   2352 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2353 | 	test(tint16==0);
 | 
|  |   2354 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2355 | 	test(tint32==0);
 | 
|  |   2356 | 
 | 
|  |   2357 | 	src=-0.5;
 | 
|  |   2358 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2359 | 	test(trg==0.0);
 | 
|  |   2360 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2361 | 	test(tint16==0);
 | 
|  |   2362 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2363 | 	test(tint32==0);
 | 
|  |   2364 | 
 | 
|  |   2365 | 	src=1.123456789;
 | 
|  |   2366 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2367 | 	test(trg==1.0);
 | 
|  |   2368 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2369 | 	test(tint16==1);
 | 
|  |   2370 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2371 | 	test(tint32==1);
 | 
|  |   2372 | 
 | 
|  |   2373 | 	src=-1.12345678;
 | 
|  |   2374 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2375 | 	test(trg==-1.0);
 | 
|  |   2376 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2377 | 	test(tint16==-1);
 | 
|  |   2378 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2379 | 	test(tint32==-1);
 | 
|  |   2380 | 
 | 
|  |   2381 | 	src=KMaxTInt16-0.1; 
 | 
|  |   2382 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2383 | 	test(trg==KMaxTInt16-1);
 | 
|  |   2384 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2385 | 	test(tint16==KMaxTInt16-1);
 | 
|  |   2386 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2387 | 	test(tint32==KMaxTInt16-1);
 | 
|  |   2388 | 
 | 
|  |   2389 | 	src=KMaxTInt16+0.5; 
 | 
|  |   2390 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2391 | 	test(trg==KMaxTInt16);
 | 
|  |   2392 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2393 | 	test(tint16==KMaxTInt16);
 | 
|  |   2394 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2395 | 	test(tint32==KMaxTInt16);
 | 
|  |   2396 | 
 | 
|  |   2397 | 	src=KMaxTInt16+1; 
 | 
|  |   2398 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2399 | 	test(trg==KMaxTInt16+1);
 | 
|  |   2400 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2401 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2402 | 	test(tint32==KMaxTInt16+1);
 | 
|  |   2403 | 
 | 
|  |   2404 | 	src=KMinTInt16-0.1; 
 | 
|  |   2405 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2406 | 	test(trg==KMinTInt16);
 | 
|  |   2407 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2408 | 	test(tint16==KMinTInt16);
 | 
|  |   2409 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2410 | 	test(tint32==KMinTInt16);
 | 
|  |   2411 | 
 | 
|  |   2412 | 	src=KMinTInt16; 
 | 
|  |   2413 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2414 | 	test(trg==KMinTInt16);
 | 
|  |   2415 | 	test(Math::Int(tint16,src)==KErrNone);
 | 
|  |   2416 | 	test(tint16==KMinTInt16);
 | 
|  |   2417 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2418 | 	test(tint32==KMinTInt16);
 | 
|  |   2419 | 
 | 
|  |   2420 | 	src=KMinTInt16-1; 
 | 
|  |   2421 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2422 | 	test(trg==KMinTInt16-1);
 | 
|  |   2423 | 	test(Math::Int(tint16,src)==KErrUnderflow);
 | 
|  |   2424 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2425 | 	test(tint32==KMinTInt16-1);
 | 
|  |   2426 | 
 | 
|  |   2427 | 	src=KMaxTInt32-0.1; 
 | 
|  |   2428 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2429 | 	test(trg==KMaxTInt32-1);
 | 
|  |   2430 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2431 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2432 | 	test(tint32==KMaxTInt32-1);
 | 
|  |   2433 | 
 | 
|  |   2434 | 	src=KMaxTInt32+0.5; 
 | 
|  |   2435 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2436 | 	test(trg==KMaxTInt32);
 | 
|  |   2437 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2438 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2439 | 	test(tint32==KMaxTInt32);
 | 
|  |   2440 | 
 | 
|  |   2441 | 	src=KMaxTInt32; 
 | 
|  |   2442 | 	src+=1;
 | 
|  |   2443 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2444 | 	test(trg==(TUint32)KMaxTInt32+1);
 | 
|  |   2445 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2446 | 	test(Math::Int(tint32,src)==KErrOverflow);
 | 
|  |   2447 | 
 | 
|  |   2448 | 	src=KMinTInt32+0.1; 
 | 
|  |   2449 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2450 | 	test(trg==KMinTInt32+1);
 | 
|  |   2451 | 	test(Math::Int(tint16,src)==KErrUnderflow);
 | 
|  |   2452 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2453 | 	test(tint32==KMinTInt32+1);
 | 
|  |   2454 | 
 | 
|  |   2455 | 	src=KMinTInt32; 
 | 
|  |   2456 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2457 | 	test(trg==KMinTInt32);
 | 
|  |   2458 | 	test(Math::Int(tint16,src)==KErrUnderflow);
 | 
|  |   2459 | 	test(Math::Int(tint32,src)==KErrNone);
 | 
|  |   2460 | 	test(tint32==KMinTInt32);
 | 
|  |   2461 | 
 | 
|  |   2462 | 	src=KMinTInt32;
 | 
|  |   2463 | 	src-=1; 
 | 
|  |   2464 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2465 | 	test((trg+1)==KMinTInt32);
 | 
|  |   2466 | 	test(Math::Int(tint16,src)==KErrUnderflow);
 | 
|  |   2467 | 	test(Math::Int(tint32,src)==KErrUnderflow);
 | 
|  |   2468 | 
 | 
|  |   2469 | 	src=KMaxTUint32-0.1;
 | 
|  |   2470 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2471 | 	test(trg==KMaxTUint32-1);
 | 
|  |   2472 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2473 | 	test(Math::Int(tint32,src)==KErrOverflow);
 | 
|  |   2474 | 
 | 
|  |   2475 | 	src=KMaxTUint32;
 | 
|  |   2476 | 	test(Math::Int(trg,src)==KErrNone);  
 | 
|  |   2477 | 	test(trg==KMaxTUint32);
 | 
|  |   2478 | 	test(Math::Int(tint16,src)==KErrOverflow);
 | 
|  |   2479 | 	test(Math::Int(tint32,src)==KErrOverflow);
 | 
|  |   2480 | 
 | 
|  |   2481 | 	test.End();
 | 
|  |   2482 | 	}
 | 
|  |   2483 | 
 | 
|  |   2484 | LOCAL_C void fractest1()
 | 
|  |   2485 | /*
 | 
|  |   2486 | Tests specific numbers
 | 
|  |   2487 | */
 | 
|  |   2488 |     {
 | 
|  |   2489 | 
 | 
|  |   2490 |     TReal res;
 | 
|  |   2491 | 
 | 
|  |   2492 | 	// test errors
 | 
|  |   2493 | 	test(Math::Frac(res,KNaNTReal64)==KErrArgument);
 | 
|  |   2494 | 	test(Math::IsNaN(res));
 | 
|  |   2495 | 	test(Math::Frac(res,KPosInfTReal64)==KErrOverflow);
 | 
|  |   2496 | 	test(res==0.0);
 | 
|  |   2497 | 	test(Math::Frac(res,KNegInfTReal64)==KErrOverflow);
 | 
|  |   2498 | 	test(res==0.0);
 | 
|  |   2499 | 
 | 
|  |   2500 |     TInt i=sizeof(testfrac)/sizeof(FRAC_TEST);
 | 
|  |   2501 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2502 | 		{
 | 
|  |   2503 | 		test(Math::Frac(res,testfrac[j].num)==KErrNone);
 | 
|  |   2504 | 		TReal err=(res-testfrac[j].res);
 | 
|  |   2505 | 		if (res)
 | 
|  |   2506 | 			err/=testfrac[j].num;	// NB num not res
 | 
|  |   2507 | 		test(Abs(err)<1.0E-15);
 | 
|  |   2508 | 		}
 | 
|  |   2509 | 
 | 
|  |   2510 | 	// Check some denormals
 | 
|  |   2511 | 	test(Math::Frac(res,5E-324)==KErrNone);
 | 
|  |   2512 | 	test(res==5E-324);
 | 
|  |   2513 | 	test(Math::Frac(res,1.23456789E-314)==KErrNone);
 | 
|  |   2514 | 	test(res==1.23456789E-314);
 | 
|  |   2515 |     }
 | 
|  |   2516 | 
 | 
|  |   2517 | LOCAL_C void fractest2()
 | 
|  |   2518 | 	{
 | 
|  |   2519 | 	// tests Frac() 
 | 
|  |   2520 | 	test.Start(_L("Math::Frac()"));
 | 
|  |   2521 | 	TReal trg,src;
 | 
|  |   2522 | 
 | 
|  |   2523 | 	src=0.0;
 | 
|  |   2524 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2525 | 	test(trg==0.0);
 | 
|  |   2526 | 
 | 
|  |   2527 | 	src=0.1;
 | 
|  |   2528 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2529 | 	test(trg==0.1);
 | 
|  |   2530 | 
 | 
|  |   2531 | 	src=-0.1;
 | 
|  |   2532 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2533 | 	test(trg==-0.1);
 | 
|  |   2534 | 
 | 
|  |   2535 | 	src=7.5;
 | 
|  |   2536 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2537 | 	test(trg==0.5);
 | 
|  |   2538 | 
 | 
|  |   2539 | 	src=-7.5;
 | 
|  |   2540 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2541 | 	test(trg==-0.5);
 | 
|  |   2542 | 
 | 
|  |   2543 | 	src=5.998046875;
 | 
|  |   2544 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2545 | 	test(trg==0.998046875);
 | 
|  |   2546 | 
 | 
|  |   2547 | 	src=-5.998046875;
 | 
|  |   2548 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2549 | 	test(trg==-0.998046875);
 | 
|  |   2550 | 
 | 
|  |   2551 | 	src=-0.00000000001;
 | 
|  |   2552 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2553 | 	test(trg==-0.00000000001);
 | 
|  |   2554 | 
 | 
|  |   2555 | 	src=1000000000000.5;
 | 
|  |   2556 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2557 | 	test(trg==0.5);
 | 
|  |   2558 | 
 | 
|  |   2559 | 	src=1099511627776.0;
 | 
|  |   2560 | 	src+=0.000244140625;
 | 
|  |   2561 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2562 | 	test(trg==0.000244140625);
 | 
|  |   2563 | 
 | 
|  |   2564 | 	src=-KMaxTInt32;
 | 
|  |   2565 | 	src+=0.5;
 | 
|  |   2566 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2567 | 	test(trg==-0.5);
 | 
|  |   2568 | 
 | 
|  |   2569 | 	src=KMaxTUint32;
 | 
|  |   2570 | 	src+=0.5;
 | 
|  |   2571 | 	test(Math::Frac(trg,src)==KErrNone);
 | 
|  |   2572 | 	test(trg==0.5);
 | 
|  |   2573 | 
 | 
|  |   2574 | 	test.End();
 | 
|  |   2575 | 	}
 | 
|  |   2576 | 
 | 
|  |   2577 | LOCAL_C void modtest1()
 | 
|  |   2578 | /*
 | 
|  |   2579 | Test modulo function using specified values
 | 
|  |   2580 | */
 | 
|  |   2581 |     {
 | 
|  |   2582 | 
 | 
|  |   2583 |     TReal res;
 | 
|  |   2584 | 
 | 
|  |   2585 | 	// test errors
 | 
|  |   2586 | 	test(Math::Mod(res,KNaNTReal64,1.0)==KErrArgument);
 | 
|  |   2587 | 	test(Math::IsNaN(res));
 | 
|  |   2588 | 	test(Math::Mod(res,1.0,KNaNTReal64)==KErrArgument);
 | 
|  |   2589 | 	test(Math::IsNaN(res));
 | 
|  |   2590 | 	test(Math::Mod(res,KNaNTReal64,KNaNTReal64)==KErrArgument);
 | 
|  |   2591 | 	test(Math::IsNaN(res));
 | 
|  |   2592 | 	test(Math::Mod(res,KPosInfTReal64,2.0)==KErrArgument);
 | 
|  |   2593 | 	test(Math::IsNaN(res));
 | 
|  |   2594 | 	test(Math::Mod(res,KNegInfTReal64,2.0)==KErrArgument);
 | 
|  |   2595 | 	test(Math::IsNaN(res));
 | 
|  |   2596 | 	test(Math::Mod(res,2.0,KNegZeroTReal64)==KErrArgument);
 | 
|  |   2597 | 	test(Math::IsNaN(res));
 | 
|  |   2598 | 	test(Math::Mod(res,1.0,0.0)==KErrArgument);
 | 
|  |   2599 | 	test(Math::IsNaN(res));
 | 
|  |   2600 | 
 | 
|  |   2601 |     TInt i=sizeof(testmod)/sizeof(MOD_TEST);
 | 
|  |   2602 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2603 | 		{
 | 
|  |   2604 | 		test(Math::Mod(res,testmod[j].num,testmod[j].mod)==KErrNone);
 | 
|  |   2605 | 		test(testApprox(res,testmod[j].res,5.0E-13));		
 | 
|  |   2606 | 		}
 | 
|  |   2607 | 
 | 
|  |   2608 | 	// Check some denormals
 | 
|  |   2609 |  	test(Math::Mod(res,K1Point2EMinus320Real64,K5EMinus321Real64)==KErrNone);
 | 
|  |   2610 |  	test(res==K2EMinus321Real64);		
 | 
|  |   2611 |  	test(Math::Mod(res,K1Point234EMinus316Real64,K1Point234EMinus316Real64)==KErrNone);
 | 
|  |   2612 | 	test(res==0.0);		
 | 
|  |   2613 |     }
 | 
|  |   2614 | 
 | 
|  |   2615 | LOCAL_C void modtest2()
 | 
|  |   2616 | /*
 | 
|  |   2617 | Test modulo function for values which will be incorrect so return KErrTotalLossOfPrecision
 | 
|  |   2618 | */
 | 
|  |   2619 |     {
 | 
|  |   2620 | 
 | 
|  |   2621 |     TReal res;
 | 
|  |   2622 | 
 | 
|  |   2623 | 	TInt i=sizeof(testmod2)/sizeof(MOD_TEST);
 | 
|  |   2624 |     for (TInt j=0;j<i;j++) 
 | 
|  |   2625 | 		{
 | 
|  |   2626 | 		test(Math::Mod(res,testmod2[j].num,testmod2[j].mod)==KErrTotalLossOfPrecision);
 | 
|  |   2627 | 		test(Math::IsZero(res));
 | 
|  |   2628 | 		}
 | 
|  |   2629 | 	}
 | 
|  |   2630 | 
 | 
|  |   2631 | LOCAL_C void DuplicateTest()
 | 
|  |   2632 | //
 | 
|  |   2633 | // Tests that you can use the same variable for both operands in some Math functions
 | 
|  |   2634 | // NB results only given to 12 or 13 significant figures so cannot expect better accuracy
 | 
|  |   2635 | //
 | 
|  |   2636 | 	{
 | 
|  |   2637 | 
 | 
|  |   2638 | 	TReal inOut;
 | 
|  |   2639 | 	test.Start(_L("ACos"));
 | 
|  |   2640 | 	inOut=-0.5;
 | 
|  |   2641 | 	test(Math::ACos(inOut,inOut)==KErrNone);
 | 
|  |   2642 | 	test(testApprox(inOut,2.094395102393,1.0E-13));			
 | 
|  |   2643 | 
 | 
|  |   2644 | 	test.Next(_L("ASin"));
 | 
|  |   2645 | 	inOut=-0.5;
 | 
|  |   2646 | 	test(Math::ASin(inOut,inOut)==KErrNone);
 | 
|  |   2647 | 	test(testApprox(inOut,-0.523598775598,6.0E-13));			
 | 
|  |   2648 | 
 | 
|  |   2649 | 	test.Next(_L("ATan"));
 | 
|  |   2650 | 	inOut=0.5;
 | 
|  |   2651 | 	test(Math::ATan(inOut,inOut)==KErrNone);
 | 
|  |   2652 | 	test(testApprox(inOut,0.463647609001,5.0E-13));			
 | 
|  |   2653 | 	inOut=-0.25;
 | 
|  |   2654 | 	TReal another=-0.5;
 | 
|  |   2655 | 	test(Math::ATan(inOut,inOut,another)==KErrNone);
 | 
|  |   2656 | 	test(testApprox(inOut,-2.677945044589,5.0E-15));			
 | 
|  |   2657 | 	inOut=-0.5;
 | 
|  |   2658 | 	another=0.25;
 | 
|  |   2659 | 	test(Math::ATan(inOut,another,inOut)==KErrNone);
 | 
|  |   2660 | 	test(testApprox(inOut,2.677945044589,5.0E-15));			
 | 
|  |   2661 | 
 | 
|  |   2662 | 	test.Next(_L("Cos"));
 | 
|  |   2663 | 	inOut=1;
 | 
|  |   2664 | 	test(Math::Cos(inOut,inOut)==KErrNone);
 | 
|  |   2665 | 	test(testApprox(inOut,0.540302305868,3.0E-13));			
 | 
|  |   2666 | 
 | 
|  |   2667 | 	test.Next(_L("Exp"));
 | 
|  |   2668 | 	inOut=0.5;
 | 
|  |   2669 | 	test(Math::Exp(inOut,inOut)==KErrNone);
 | 
|  |   2670 | 	test(testApprox(inOut,1.648721270700,1.0E-13));			
 | 
|  |   2671 | 
 | 
|  |   2672 | 	test.Next(_L("Frac"));
 | 
|  |   2673 | 	inOut=56.123456789;
 | 
|  |   2674 | 	test(Math::Frac(inOut,inOut)==KErrNone);
 | 
|  |   2675 | 	test(testApprox(inOut,0.123456789,2.0E-14));
 | 
|  |   2676 | 
 | 
|  |   2677 | 	test.Next(_L("Int"));
 | 
|  |   2678 | 	inOut=56.123456789;
 | 
|  |   2679 | 	test(Math::Int(inOut,inOut)==KErrNone);
 | 
|  |   2680 | 	test(inOut==56);
 | 
|  |   2681 | 	
 | 
|  |   2682 | 	test.Next(_L("Log"));
 | 
|  |   2683 | 	inOut=0.5;
 | 
|  |   2684 | 	test(Math::Log(inOut,inOut)==KErrNone);
 | 
|  |   2685 | 	test(testApprox(inOut,-0.301029995664,7.0E-14));				
 | 
|  |   2686 | 
 | 
|  |   2687 | 	test.Next(_L("Ln"));
 | 
|  |   2688 | 	inOut=0.5;
 | 
|  |   2689 | 	test(Math::Ln(inOut,inOut)==KErrNone);
 | 
|  |   2690 | 	test(testApprox(inOut,-0.693147180560,8.0E-14));				
 | 
|  |   2691 | 
 | 
|  |   2692 | 	test.Next(_L("Mod"));
 | 
|  |   2693 | 	inOut=53;
 | 
|  |   2694 | 	another=17;
 | 
|  |   2695 | 	test(Math::Mod(inOut,inOut,another)==KErrNone);
 | 
|  |   2696 | 	test(inOut==2);
 | 
|  |   2697 | 	inOut=17;
 | 
|  |   2698 | 	another=53;
 | 
|  |   2699 | 	test(Math::Mod(inOut,another,inOut)==KErrNone);
 | 
|  |   2700 | 	test(inOut==2);
 | 
|  |   2701 | 
 | 
|  |   2702 | 	test.Next(_L("Pow"));
 | 
|  |   2703 | 	inOut=-5;
 | 
|  |   2704 | 	another=3;
 | 
|  |   2705 | 	test(Math::Pow(inOut,inOut,another)==KErrNone);
 | 
|  |   2706 | 	test(inOut==-125.0);
 | 
|  |   2707 | 	another=-5;
 | 
|  |   2708 | 	inOut=3;
 | 
|  |   2709 | 	test(Math::Pow(inOut,another,inOut)==KErrNone);
 | 
|  |   2710 | 	test(inOut==-125.0);
 | 
|  |   2711 | 
 | 
|  |   2712 | 	test.Next(_L("Sin"));
 | 
|  |   2713 | 	inOut=1;
 | 
|  |   2714 | 	test(Math::Sin(inOut,inOut)==KErrNone);
 | 
|  |   2715 | 	test(testApprox(inOut,0.84147098480790,5.0E-15));				
 | 
|  |   2716 | 
 | 
|  |   2717 | 	test.Next(_L("Round"));
 | 
|  |   2718 | 	inOut=123.4567;
 | 
|  |   2719 | 	test(Math::Round(inOut,inOut,2)==KErrNone);
 | 
|  |   2720 | 	test(testApprox(inOut,123.46,1.0E-15));				
 | 
|  |   2721 | 
 | 
|  |   2722 | 	test.Next(_L("Sqrt"));
 | 
|  |   2723 | 	inOut=53;
 | 
|  |   2724 | 	test(Math::Sqrt(inOut,inOut)==KErrNone);
 | 
|  |   2725 | 	test(testApprox(inOut,7.280109889281,7.0E-14));				
 | 
|  |   2726 | 
 | 
|  |   2727 | 	test.Next(_L("Tan"));
 | 
|  |   2728 | 	inOut=1;
 | 
|  |   2729 | 	test(Math::Tan(inOut,inOut)==KErrNone);
 | 
|  |   2730 | 	test(testApprox(inOut,1.557407724655,7.0E-14));				
 | 
|  |   2731 | 
 | 
|  |   2732 | 	test.End();
 | 
|  |   2733 | 	}
 | 
|  |   2734 | 
 | 
|  |   2735 | LOCAL_C void specialtest()
 | 
|  |   2736 | //
 | 
|  |   2737 | // Tests functions which test for specials
 | 
|  |   2738 | // 
 | 
|  |   2739 | 	{
 | 
|  |   2740 | 
 | 
|  |   2741 | 	test(Math::IsZero(0.0));
 | 
|  |   2742 | 	test(Math::IsZero(KNegZeroTReal64));
 | 
|  |   2743 | 	test(Math::IsZero(0.0));
 | 
|  |   2744 | 	test(!Math::IsZero(1.0));
 | 
|  |   2745 | 	test(!Math::IsZero(KPosInfTReal64));
 | 
|  |   2746 | 	test(!Math::IsZero(KNaNTReal64));
 | 
|  |   2747 |  	test(!Math::IsZero(K5EMinus324Real64));
 | 
|  |   2748 | 
 | 
|  |   2749 | 	test(Math::IsNaN(KNaNTReal64));
 | 
|  |   2750 | 	test(!Math::IsNaN(KPosInfTReal64));
 | 
|  |   2751 | 	test(!Math::IsNaN(KNegInfTReal64));
 | 
|  |   2752 | 	test(!Math::IsNaN(0.0));
 | 
|  |   2753 | 	test(!Math::IsNaN(1.0));
 | 
|  |   2754 | 
 | 
|  |   2755 | 	test(Math::IsInfinite(KPosInfTReal64));
 | 
|  |   2756 | 	test(Math::IsInfinite(KNegInfTReal64));
 | 
|  |   2757 | 	test(!Math::IsInfinite(KNaNTReal64));
 | 
|  |   2758 | 	test(!Math::IsInfinite(0.0));
 | 
|  |   2759 | 	test(!Math::IsInfinite(KMaxTReal64));
 | 
|  |   2760 | 
 | 
|  |   2761 | 	test(!Math::IsFinite(KPosInfTReal64));
 | 
|  |   2762 | 	test(!Math::IsFinite(KNegInfTReal64));
 | 
|  |   2763 | 	test(!Math::IsFinite(KNaNTReal64));
 | 
|  |   2764 | 	test(Math::IsFinite(0.0));
 | 
|  |   2765 | 	test(Math::IsFinite(KMaxTReal64));
 | 
|  |   2766 | 	test(Math::IsFinite(5E-324));	
 | 
|  |   2767 | 	test(Math::IsFinite(1.0));
 | 
|  |   2768 | 	}
 | 
|  |   2769 | 
 | 
|  |   2770 | void _matherr(TExcType aType)
 | 
|  |   2771 | //
 | 
|  |   2772 | // Dummy function to handle exceptions
 | 
|  |   2773 | //
 | 
|  |   2774 | 	{
 | 
|  |   2775 | 
 | 
|  |   2776 | 	test.Printf(_L("_matherr: Exception type %u handled\n"),TUint(aType));
 | 
|  |   2777 | 	}
 | 
|  |   2778 | 
 | 
|  |   2779 | #ifdef __GCC32__
 | 
|  |   2780 | #define FSTCW(x) asm("mov eax, %0\nfstcw [eax]": : "i"(&x))
 | 
|  |   2781 | #define FLDCW(x) asm("mov eax, %0\nfldcw [eax]": : "i"(&x))
 | 
|  |   2782 | #else
 | 
|  |   2783 | #define FSTCW(x) _asm fstcw x
 | 
|  |   2784 | #define FLDCW(x) _asm fldcw x
 | 
|  |   2785 | #endif
 | 
|  |   2786 | TInt16 cw=0; // must be global or GCC/GAS can't get the address!
 | 
|  |   2787 | 
 | 
|  |   2788 | GLDEF_C TInt E32Main()
 | 
|  |   2789 |     {     
 | 
|  |   2790 | 
 | 
|  |   2791 | #if defined (__X86__)
 | 
|  |   2792 | 	FSTCW(cw);
 | 
|  |   2793 | 	test.Printf(_L("control word = 0x%x\n"),cw);
 | 
|  |   2794 | 	cw=0x27f;	// WINS value
 | 
|  |   2795 | 	FLDCW(cw);
 | 
|  |   2796 | #endif
 | 
|  |   2797 | 
 | 
|  |   2798 | 	test.Title();
 | 
|  |   2799 | 
 | 
|  |   2800 | 	test.Start(_L("Assorted tests"));
 | 
|  |   2801 | 	AssortedTests();
 | 
|  |   2802 | 
 | 
|  |   2803 | 	test.Next(_L("sqrtest1(KSqhf,1.0)"));
 | 
|  |   2804 |     sqrtest1(KSqhf,1.0);
 | 
|  |   2805 | 	test.Next(_L("sqrtest1(1.0,1.41421356238)"));
 | 
|  |   2806 |     sqrtest1(1.0,1.41421356238);
 | 
|  |   2807 | 	test.Next(_L("sqrtest2"));
 | 
|  |   2808 |     sqrtest2();                  
 | 
|  |   2809 | 
 | 
|  |   2810 | 	test.Next(_L("logtest"));
 | 
|  |   2811 |     logtest();
 | 
|  |   2812 | 	test.Next(_L("lntest1"));
 | 
|  |   2813 |     lntest1();
 | 
|  |   2814 | 	test.Next(_L("lntest2"));
 | 
|  |   2815 |     lntest2();
 | 
|  |   2816 | 	test.Next(_L("lntest3"));
 | 
|  |   2817 |     lntest3();
 | 
|  |   2818 | 	test.Next(_L("lntest4"));
 | 
|  |   2819 |     lntest4();
 | 
|  |   2820 | 
 | 
|  |   2821 | 	test.Next(_L("exptest1"));
 | 
|  |   2822 |     exptest1();
 | 
|  |   2823 | 	test.Next(_L("exptest2(-0.0625,-.9375,1.0625)"));
 | 
|  |   2824 |     exptest2(-0.0625,-0.9375,1.0625);
 | 
|  |   2825 | 	test.Next(_L("exptest2(-29.0/16.0),1.0,88.0)"));
 | 
|  |   2826 |     exptest2((-29.0/16.0),1.0,88.0);
 | 
|  |   2827 | 	test.Next(_L("exptest2(-29.0/16.0),-1.0,-88.0)"));
 | 
|  |   2828 |     exptest2((-29.0/16.0),-1.0,-88.0);
 | 
|  |   2829 | 	test.Next(_L("exptest3"));
 | 
|  |   2830 |     exptest3();
 | 
|  |   2831 | 
 | 
|  |   2832 | 	test.Next(_L("powtest1"));
 | 
|  |   2833 |     powtest1();
 | 
|  |   2834 | 	test.Next(_L("powtest2(.5,1.0)"));
 | 
|  |   2835 |     powtest2(.5,1.0);
 | 
|  |   2836 | 	test.Next(_L("powtest2(1.0,1.0E33)"));
 | 
|  |   2837 |     powtest2(1.0,1.0E33);
 | 
|  |   2838 | 	test.Next(_L("powtest3"));
 | 
|  |   2839 |     powtest3();
 | 
|  |   2840 | 	test.Next(_L("powtest4"));
 | 
|  |   2841 |     powtest4();
 | 
|  |   2842 | 	test.Next(_L("powtest5"));
 | 
|  |   2843 |     powtest5();
 | 
|  |   2844 | 	test.Next(_L("powtest6"));
 | 
|  |   2845 |     powtest6();
 | 
|  |   2846 | 	
 | 
|  |   2847 | 	test.Next(_L("pow10test"));
 | 
|  |   2848 | 	pow10test();
 | 
|  |   2849 | 														
 | 
|  |   2850 | 	test.Next(_L("sintest1(3*KPi,3.5*KPi)"));
 | 
|  |   2851 |     sintest1(3*KPi,3.5*KPi);
 | 
|  |   2852 | 	test.Next(_L("sintest1(3*KPi,3.5*KPi)"));
 | 
|  |   2853 |     sintest1(6*KPi,6.5*KPi);
 | 
|  |   2854 | 	test.Next(_L("sintest2"));
 | 
|  |   2855 |     sintest2();
 | 
|  |   2856 | 	test.Next(_L("sintest3"));    
 | 
|  |   2857 | 	sintest3();
 | 
|  |   2858 | 	test.Next(_L("sintest4"));
 | 
|  |   2859 |     sintest4();
 | 
|  |   2860 | //	test.Next(_L("sintest5"));		// this test is no longer valid
 | 
|  |   2861 | //	sintest5();
 | 
|  |   2862 | 
 | 
|  |   2863 | 	test.Next(_L("costest1"));
 | 
|  |   2864 | 	costest1();
 | 
|  |   2865 | 	test.Next(_L("costest2"));
 | 
|  |   2866 | 	costest2();
 | 
|  |   2867 | 	test.Next(_L("costest3"));
 | 
|  |   2868 | 	costest3();
 | 
|  |   2869 | 	test.Next(_L("costest4"));
 | 
|  |   2870 | 	costest4();
 | 
|  |   2871 | //	test.Next(_L("costest5"));		// this test is no longer valid
 | 
|  |   2872 | //	costest5();
 | 
|  |   2873 | 
 | 
|  |   2874 | 	test.Next(_L("tantest1(-.25*KPi,.25*KPi)"));                                            
 | 
|  |   2875 |     tantest1(-.25*KPi,.25*KPi);
 | 
|  |   2876 | 	test.Next(_L("tantest1(.875*KPi,1.125*KPi)"));
 | 
|  |   2877 |     tantest1(.875*KPi,1.125*KPi);
 | 
|  |   2878 | 	test.Next(_L("tantest1(6*KPi,6.25*KPi)"));
 | 
|  |   2879 |     tantest1(6*KPi,6.25*KPi);
 | 
|  |   2880 | 	test.Next(_L("tantest2"));
 | 
|  |   2881 |     tantest2();   
 | 
|  |   2882 | 	test.Next(_L("tantest3"));
 | 
|  |   2883 |     tantest3();
 | 
|  |   2884 | 	test.Next(_L("tantest4"));
 | 
|  |   2885 |     tantest4();
 | 
|  |   2886 | //	test.Next(_L("tantest5"));		// this test is no longer valid
 | 
|  |   2887 | //	tantest5();
 | 
|  |   2888 | 
 | 
|  |   2889 | 	test.Next(_L("astest1(-.125,0.125,15,0)"));
 | 
|  |   2890 |     astest1(-.125,0.125,15,0);
 | 
|  |   2891 | 	test.Next(_L("astest1(-.125,0.125,15,1)"));
 | 
|  |   2892 |     astest1(-.125,0.125,15,1);
 | 
|  |   2893 | 	test.Next(_L("astest2"));
 | 
|  |   2894 |     astest2();
 | 
|  |   2895 | 	test.Next(_L("astest3"));
 | 
|  |   2896 |     astest3();
 | 
|  |   2897 | 	test.Next(_L("astest4(0,1)"));
 | 
|  |   2898 |     astest4(0,1);
 | 
|  |   2899 | 	test.Next(_L("astest4(1,1)"));
 | 
|  |   2900 |     astest4(1,1);
 | 
|  |   2901 | 	test.Next(_L("astest4(1,-1)"));
 | 
|  |   2902 |     astest4(1,-1);
 | 
|  |   2903 | 		  
 | 
|  |   2904 | 	test.Next(_L("attest1"));
 | 
|  |   2905 |     attest1();
 | 
|  |   2906 | 	test.Next(_L("attest2"));
 | 
|  |   2907 |     attest2();
 | 
|  |   2908 | 	test.Next(_L("attest3"));
 | 
|  |   2909 |     attest3();
 | 
|  |   2910 | 	test.Next(_L("attest4"));
 | 
|  |   2911 |     attest4();
 | 
|  |   2912 | 	test.Next(_L("attest5"));
 | 
|  |   2913 |     attest5();
 | 
|  |   2914 | 
 | 
|  |   2915 |     test.Next(_L("inttest1"));
 | 
|  |   2916 |     inttest1();	
 | 
|  |   2917 | 	test.Next(_L("intitest2"));
 | 
|  |   2918 |     inttest2();	
 | 
|  |   2919 | 	test.Next(_L("inttest3"));
 | 
|  |   2920 |     inttest3();	
 | 
|  |   2921 | 	test.Next(_L("inttest4"));
 | 
|  |   2922 | 	inttest4();	
 | 
|  |   2923 | 
 | 
|  |   2924 | 	test.Next(_L("fractest1"));
 | 
|  |   2925 |     fractest1();	
 | 
|  |   2926 | 	test.Next(_L("fractest2"));
 | 
|  |   2927 | 	fractest2();
 | 
|  |   2928 | 
 | 
|  |   2929 | 	test.Next(_L("modtest1"));
 | 
|  |   2930 |     modtest1();
 | 
|  |   2931 | 	test.Next(_L("modtest2"));
 | 
|  |   2932 |     modtest2();
 | 
|  |   2933 | 
 | 
|  |   2934 | 	test.Next(_L("Test duplicate parameters"));
 | 
|  |   2935 | 	DuplicateTest();
 | 
|  |   2936 | 
 | 
|  |   2937 | 	test.Next(_L("Test Math::Is...() functions"));
 | 
|  |   2938 | 	specialtest();
 | 
|  |   2939 | 
 | 
|  |   2940 | 	test.End();
 | 
|  |   2941 | 	return(KErrNone);
 | 
|  |   2942 |     }
 | 
|  |   2943 | 
 |