genericopenlibs/cstdlib/LMATH/LMATH.CPP
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
--- /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 <e32math.h>
+#include "FDLIBM.H"
+#include <errno.h>
+
+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"
+
+
+