diff -r e20de85af2ee -r ce057bb09d0b genericopenlibs/cstdlib/LMATH/LMATH.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/genericopenlibs/cstdlib/LMATH/LMATH.CPP Fri Jun 04 16:20:51 2010 +0100 @@ -0,0 +1,335 @@ +// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// LMATH.CPP - Wrappers for Epoc32 Math functions +// +// + + +#include +#include "FDLIBM.H" +#include + +extern "C" { + +/** + * Map the Symbian error value to the standard error number and put it into errno. + * @internalComponent + * @param aSymbianReturnValue the standard return value returned from the Symbian function. + * @param aNan the result of Math::Nan + */ +void MapSymbianErrorCodeToErrno(int aSymbianReturnValue, int aNan) +{ + + switch(aSymbianReturnValue) + { + case (KErrNone): + { + //errno does not get set to 0 according to the standard. + //The user must initialize it before calling the function. + break; + } + case (KErrArgument): + { + if (aNan) + errno = EDOM; + else + errno = EINVAL; + break; + } + case (KErrOverflow): + case (KErrUnderflow): + case (KErrTotalLossOfPrecision): + { + errno = ERANGE; + break; + } + } + +} + +/** +Calculate arctangent. +Performs the trigonometric arctangent operation on x and returns an angle in the range from -PI/2 to PI/2 expressed in radians. +@return Arctangent of arg1. +@param arg1 Value whose arctangent has to be calculated. +*/ +EXPORT_C double atan (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::ATan(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate cosine. +Performs the trigonometric cosine operation on x returning a value between -1 and 1. +@return Cosine of arg1. +@param arg1 Angle expressed in radians (180 degrees = PI radians). +*/ +EXPORT_C double cos (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Cos(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate sine. +Performs the trigonometric sine operation on x returning a value between -1 and 1. +@return Sine of arg1. +@param arg1 Angle expressed in radians (180 degrees = PI radians). +*/ +EXPORT_C double sin (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Sin(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate tangent. +Performs the trigonometric tangent operation on arg1. +@return Tangent of arg1. +@param arg1 Angle expressed in radians (180 degrees = PI radians). +*/ +EXPORT_C double tan (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Tan(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate arccosine. +Performs the trigonometric arc cosine operation on x and returns an angle in the range from 0 to PI expressed in radians. +@return Arc cosine of arg1. +@param arg1 Value between -1 and 1 whose arc cosine has to be calculated. +*/ +EXPORT_C double acos (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::ACos(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate arcsine. +Performs the trigonometric arc sine operation on x and returns an angle in the range from -PI/2 to PI/2 expressed in radians. +@return Arc sine of arg1 +@param arg1 Value between -1 and 1 whose arc sine has to be calculated. +*/ +EXPORT_C double asin (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::ASin(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate exponential. +Returns the exponential value of parameter arg1. +@return Exponential of arg1 +@param arg1 Floating point value. +*/ +EXPORT_C double exp (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Exp(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate natural logarithm. +Returns the natural logarithm of parameter arg1 +@return Logarithm of arg1. +@param arg1 Floating point value. +*/ +EXPORT_C double log (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Ln(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate logarithm base 10. +Returns the logarithm base 10 of parameter arg1 +@return Logarithm base 10 of arg1 +@param arg1 Floating point value. +*/ +EXPORT_C double log10 (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Log(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate square root. +Returns the square root of parameter arg1. +@return Square root of arg1 +@param arg1 Non-negative floating point value. +*/ +EXPORT_C double sqrt (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Sqrt(result, arg1); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate arctangent, 2 parameters. +Performs the trigonometric arctangent operation on y/x and returns an angle in the range from -PI to PI expressed in radians, using the signs of the parameters to determine the quadrant. +The result is valid even if arg2 is 0 (angle is PI/2 or -PI/2). +In fact this function returns the angle of bidimensional vector (arg2,arg1). +@return Arctangent of arg1/arg2. +@param arg1 and arg2.Values from whose division has to be calculated the arctangent.i.e.: Coordinates for the vector whose angle is to be calculated. +*/ +EXPORT_C double atan2 (double arg1, double arg2) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::ATan(result, arg1, arg2); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Calculate numeric power. +Returns arg1 raised to the power of arg2. +@return arg1 raised to the power of arg2. +@param arg1 - Base value. +@param arg2 - Exponent value. +*/ +EXPORT_C double pow (double arg1, double arg2) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Pow(result, arg1, arg2); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Return remainder of floating point division. +Performs division arg1/arg2 and returns the remainder of the operation. +@return Remainder of arg1/arg2. +@param arg1 and arg2 - Floating point values +*/ +EXPORT_C double fmod (double arg1, double arg2) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Mod(result, arg1, arg2); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +Round to integral value in floating-point format +@return the integral value (represented as a double precision number) nearest to arg1 according to the prevailing rounding mode. +@param arg1 floating point value to round. +*/ +EXPORT_C double rint (double arg1) __SOFTFP + { + double result; + int returnValue; + + returnValue = Math::Round(result, arg1, 0); + MapSymbianErrorCodeToErrno(returnValue, Math::IsNaN(result)); + + return result; + } + +/** +tests whether d is NaN +@return non-zero if d is NaN. Otherwise, 0 is returned. +@param d floating point value. +*/ +EXPORT_C int isnan (double d) __SOFTFP + { + return Math::IsNaN(d); + } + +/** +test for infinity or not-a-number +@return 1 if the number d is Infinity, otherwise 0. +@param d floating point value to test. +*/ +EXPORT_C int isinf (double d) __SOFTFP + { + return Math::IsInfinite(d); + } + +/** +Test for finity. +@return a nonzero value if the x parameter is a finite number; +that is, if d is not +-, INF, NaNQ, or NaNS. +@param d floating point value to test. +*/ +EXPORT_C int finite (double d) __SOFTFP + { + return Math::IsFinite(d); + } + +} // end of extern "C" + + +