summaryrefslogtreecommitdiff
path: root/src/elementaryFunctions/asin
diff options
context:
space:
mode:
authorjofret2008-04-21 15:09:53 +0000
committerjofret2008-04-21 15:09:53 +0000
commit7425dfa5ac9f8f06bea91974960b8af6474fd878 (patch)
tree880ab806e9bbd094eed9faf2655bd9c0a32bd297 /src/elementaryFunctions/asin
parent9bee1f2a458843199b0541eaf28a7f4d5bbbfa34 (diff)
downloadscilab2c-7425dfa5ac9f8f06bea91974960b8af6474fd878.tar.gz
scilab2c-7425dfa5ac9f8f06bea91974960b8af6474fd878.tar.bz2
scilab2c-7425dfa5ac9f8f06bea91974960b8af6474fd878.zip
Double vs Float better management. Enable psycho warnings.
Diffstat (limited to 'src/elementaryFunctions/asin')
-rw-r--r--src/elementaryFunctions/asin/Makefile.am28
-rw-r--r--src/elementaryFunctions/asin/Makefile.in93
-rw-r--r--src/elementaryFunctions/asin/casins.c150
-rw-r--r--src/elementaryFunctions/asin/sasins.c22
-rw-r--r--src/elementaryFunctions/asin/testAsin.c154
-rw-r--r--src/elementaryFunctions/asin/testDoubleAsin.c101
-rw-r--r--src/elementaryFunctions/asin/testFloatAsin.c87
-rw-r--r--src/elementaryFunctions/asin/zasins.c14
8 files changed, 420 insertions, 229 deletions
diff --git a/src/elementaryFunctions/asin/Makefile.am b/src/elementaryFunctions/asin/Makefile.am
index d38f5d46..33f1f2cd 100644
--- a/src/elementaryFunctions/asin/Makefile.am
+++ b/src/elementaryFunctions/asin/Makefile.am
@@ -40,16 +40,7 @@ check_INCLUDES = -I $(top_builddir)/elementaryFunctions/includes \
-I $(top_builddir)/auxiliaryFunctions/includes \
-I $(top_builddir)/type
-check_PROGRAMS = testAsin
-
-TESTS = testAsin
-
-#
-# -*- ArcSine Tests -*-
-#
-testAsin_SOURCES = testAsin.c
-testAsin_CFLAGS = $(check_INCLUDES)
-testAsin_LDADD = $(top_builddir)/type/libDoubleComplex.la \
+check_LDADD = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/type/libFloatComplex.la \
$(top_builddir)/lib/lapack/libscilapack.la \
$(top_builddir)/lib/blas/libsciblas.la \
@@ -59,4 +50,19 @@ testAsin_LDADD = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/elementaryFunctions/log/libLog.la \
$(top_builddir)/elementaryFunctions/log1p/libLog1p.la \
$(top_builddir)/elementaryFunctions/atan/libAtan.la \
- @LIBMATH@ \ No newline at end of file
+ @LIBMATH@
+
+check_PROGRAMS = testFloatAsin testDoubleAsin
+
+TESTS = testFloatAsin testDoubleAsin
+
+#
+# -*- ArcSine Tests -*-
+#
+testFloatAsin_SOURCES = testFloatAsin.c
+testFloatAsin_CFLAGS = $(check_INCLUDES)
+testFloatAsin_LDADD = $(check_LDADD)
+
+testDoubleAsin_SOURCES = testDoubleAsin.c
+testDoubleAsin_CFLAGS = $(check_INCLUDES)
+testDoubleAsin_LDADD = $(check_LDADD) \ No newline at end of file
diff --git a/src/elementaryFunctions/asin/Makefile.in b/src/elementaryFunctions/asin/Makefile.in
index e7ff4771..6f2fefdc 100644
--- a/src/elementaryFunctions/asin/Makefile.in
+++ b/src/elementaryFunctions/asin/Makefile.in
@@ -32,8 +32,8 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-check_PROGRAMS = testAsin$(EXEEXT)
-TESTS = testAsin$(EXEEXT)
+check_PROGRAMS = testFloatAsin$(EXEEXT) testDoubleAsin$(EXEEXT)
+TESTS = testFloatAsin$(EXEEXT) testDoubleAsin$(EXEEXT)
subdir = elementaryFunctions/asin
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -62,9 +62,9 @@ libAsin_la_OBJECTS = $(am_libAsin_la_OBJECTS)
libAsin_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libAsin_la_CFLAGS) \
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-am_testAsin_OBJECTS = testAsin-testAsin.$(OBJEXT)
-testAsin_OBJECTS = $(am_testAsin_OBJECTS)
-testAsin_DEPENDENCIES = $(top_builddir)/type/libDoubleComplex.la \
+am_testDoubleAsin_OBJECTS = testDoubleAsin-testDoubleAsin.$(OBJEXT)
+testDoubleAsin_OBJECTS = $(am_testDoubleAsin_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/type/libFloatComplex.la \
$(top_builddir)/lib/lapack/libscilapack.la \
$(top_builddir)/lib/blas/libsciblas.la \
@@ -74,9 +74,16 @@ testAsin_DEPENDENCIES = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/elementaryFunctions/log/libLog.la \
$(top_builddir)/elementaryFunctions/log1p/libLog1p.la \
$(top_builddir)/elementaryFunctions/atan/libAtan.la
-testAsin_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
- --mode=link $(CCLD) $(testAsin_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
- $(LDFLAGS) -o $@
+testDoubleAsin_DEPENDENCIES = $(am__DEPENDENCIES_1)
+testDoubleAsin_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(testDoubleAsin_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am_testFloatAsin_OBJECTS = testFloatAsin-testFloatAsin.$(OBJEXT)
+testFloatAsin_OBJECTS = $(am_testFloatAsin_OBJECTS)
+testFloatAsin_DEPENDENCIES = $(am__DEPENDENCIES_1)
+testFloatAsin_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(testFloatAsin_CFLAGS) \
+ $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I. -I$(top_builddir)/includes@am__isrc@
depcomp = $(SHELL) $(top_srcdir)/config/depcomp
am__depfiles_maybe = depfiles
@@ -89,8 +96,10 @@ CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
$(LDFLAGS) -o $@
-SOURCES = $(libAsin_la_SOURCES) $(testAsin_SOURCES)
-DIST_SOURCES = $(libAsin_la_SOURCES) $(testAsin_SOURCES)
+SOURCES = $(libAsin_la_SOURCES) $(testDoubleAsin_SOURCES) \
+ $(testFloatAsin_SOURCES)
+DIST_SOURCES = $(libAsin_la_SOURCES) $(testDoubleAsin_SOURCES) \
+ $(testFloatAsin_SOURCES)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
@@ -227,13 +236,7 @@ check_INCLUDES = -I $(top_builddir)/elementaryFunctions/includes \
-I $(top_builddir)/auxiliaryFunctions/includes \
-I $(top_builddir)/type
-
-#
-# -*- ArcSine Tests -*-
-#
-testAsin_SOURCES = testAsin.c
-testAsin_CFLAGS = $(check_INCLUDES)
-testAsin_LDADD = $(top_builddir)/type/libDoubleComplex.la \
+check_LDADD = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/type/libFloatComplex.la \
$(top_builddir)/lib/lapack/libscilapack.la \
$(top_builddir)/lib/blas/libsciblas.la \
@@ -245,6 +248,16 @@ testAsin_LDADD = $(top_builddir)/type/libDoubleComplex.la \
$(top_builddir)/elementaryFunctions/atan/libAtan.la \
@LIBMATH@
+
+#
+# -*- ArcSine Tests -*-
+#
+testFloatAsin_SOURCES = testFloatAsin.c
+testFloatAsin_CFLAGS = $(check_INCLUDES)
+testFloatAsin_LDADD = $(check_LDADD)
+testDoubleAsin_SOURCES = testDoubleAsin.c
+testDoubleAsin_CFLAGS = $(check_INCLUDES)
+testDoubleAsin_LDADD = $(check_LDADD)
all: all-am
.SUFFIXES:
@@ -314,9 +327,12 @@ clean-checkPROGRAMS:
echo " rm -f $$p $$f"; \
rm -f $$p $$f ; \
done
-testAsin$(EXEEXT): $(testAsin_OBJECTS) $(testAsin_DEPENDENCIES)
- @rm -f testAsin$(EXEEXT)
- $(testAsin_LINK) $(testAsin_OBJECTS) $(testAsin_LDADD) $(LIBS)
+testDoubleAsin$(EXEEXT): $(testDoubleAsin_OBJECTS) $(testDoubleAsin_DEPENDENCIES)
+ @rm -f testDoubleAsin$(EXEEXT)
+ $(testDoubleAsin_LINK) $(testDoubleAsin_OBJECTS) $(testDoubleAsin_LDADD) $(LIBS)
+testFloatAsin$(EXEEXT): $(testFloatAsin_OBJECTS) $(testFloatAsin_DEPENDENCIES)
+ @rm -f testFloatAsin$(EXEEXT)
+ $(testFloatAsin_LINK) $(testFloatAsin_OBJECTS) $(testFloatAsin_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -332,7 +348,8 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAsin_la-sasins.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAsin_la-zasina.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libAsin_la-zasins.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testAsin-testAsin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testDoubleAsin-testDoubleAsin.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testFloatAsin-testFloatAsin.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -411,19 +428,33 @@ libAsin_la-zasina.lo: zasina.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libAsin_la_CFLAGS) $(CFLAGS) -c -o libAsin_la-zasina.lo `test -f 'zasina.c' || echo '$(srcdir)/'`zasina.c
-testAsin-testAsin.o: testAsin.c
-@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testAsin_CFLAGS) $(CFLAGS) -MT testAsin-testAsin.o -MD -MP -MF $(DEPDIR)/testAsin-testAsin.Tpo -c -o testAsin-testAsin.o `test -f 'testAsin.c' || echo '$(srcdir)/'`testAsin.c
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testAsin-testAsin.Tpo $(DEPDIR)/testAsin-testAsin.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testAsin.c' object='testAsin-testAsin.o' libtool=no @AMDEPBACKSLASH@
+testDoubleAsin-testDoubleAsin.o: testDoubleAsin.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testDoubleAsin_CFLAGS) $(CFLAGS) -MT testDoubleAsin-testDoubleAsin.o -MD -MP -MF $(DEPDIR)/testDoubleAsin-testDoubleAsin.Tpo -c -o testDoubleAsin-testDoubleAsin.o `test -f 'testDoubleAsin.c' || echo '$(srcdir)/'`testDoubleAsin.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testDoubleAsin-testDoubleAsin.Tpo $(DEPDIR)/testDoubleAsin-testDoubleAsin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testDoubleAsin.c' object='testDoubleAsin-testDoubleAsin.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testDoubleAsin_CFLAGS) $(CFLAGS) -c -o testDoubleAsin-testDoubleAsin.o `test -f 'testDoubleAsin.c' || echo '$(srcdir)/'`testDoubleAsin.c
+
+testDoubleAsin-testDoubleAsin.obj: testDoubleAsin.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testDoubleAsin_CFLAGS) $(CFLAGS) -MT testDoubleAsin-testDoubleAsin.obj -MD -MP -MF $(DEPDIR)/testDoubleAsin-testDoubleAsin.Tpo -c -o testDoubleAsin-testDoubleAsin.obj `if test -f 'testDoubleAsin.c'; then $(CYGPATH_W) 'testDoubleAsin.c'; else $(CYGPATH_W) '$(srcdir)/testDoubleAsin.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testDoubleAsin-testDoubleAsin.Tpo $(DEPDIR)/testDoubleAsin-testDoubleAsin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testDoubleAsin.c' object='testDoubleAsin-testDoubleAsin.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testDoubleAsin_CFLAGS) $(CFLAGS) -c -o testDoubleAsin-testDoubleAsin.obj `if test -f 'testDoubleAsin.c'; then $(CYGPATH_W) 'testDoubleAsin.c'; else $(CYGPATH_W) '$(srcdir)/testDoubleAsin.c'; fi`
+
+testFloatAsin-testFloatAsin.o: testFloatAsin.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testFloatAsin_CFLAGS) $(CFLAGS) -MT testFloatAsin-testFloatAsin.o -MD -MP -MF $(DEPDIR)/testFloatAsin-testFloatAsin.Tpo -c -o testFloatAsin-testFloatAsin.o `test -f 'testFloatAsin.c' || echo '$(srcdir)/'`testFloatAsin.c
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testFloatAsin-testFloatAsin.Tpo $(DEPDIR)/testFloatAsin-testFloatAsin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testFloatAsin.c' object='testFloatAsin-testFloatAsin.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testAsin_CFLAGS) $(CFLAGS) -c -o testAsin-testAsin.o `test -f 'testAsin.c' || echo '$(srcdir)/'`testAsin.c
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testFloatAsin_CFLAGS) $(CFLAGS) -c -o testFloatAsin-testFloatAsin.o `test -f 'testFloatAsin.c' || echo '$(srcdir)/'`testFloatAsin.c
-testAsin-testAsin.obj: testAsin.c
-@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testAsin_CFLAGS) $(CFLAGS) -MT testAsin-testAsin.obj -MD -MP -MF $(DEPDIR)/testAsin-testAsin.Tpo -c -o testAsin-testAsin.obj `if test -f 'testAsin.c'; then $(CYGPATH_W) 'testAsin.c'; else $(CYGPATH_W) '$(srcdir)/testAsin.c'; fi`
-@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testAsin-testAsin.Tpo $(DEPDIR)/testAsin-testAsin.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testAsin.c' object='testAsin-testAsin.obj' libtool=no @AMDEPBACKSLASH@
+testFloatAsin-testFloatAsin.obj: testFloatAsin.c
+@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testFloatAsin_CFLAGS) $(CFLAGS) -MT testFloatAsin-testFloatAsin.obj -MD -MP -MF $(DEPDIR)/testFloatAsin-testFloatAsin.Tpo -c -o testFloatAsin-testFloatAsin.obj `if test -f 'testFloatAsin.c'; then $(CYGPATH_W) 'testFloatAsin.c'; else $(CYGPATH_W) '$(srcdir)/testFloatAsin.c'; fi`
+@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/testFloatAsin-testFloatAsin.Tpo $(DEPDIR)/testFloatAsin-testFloatAsin.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='testFloatAsin.c' object='testFloatAsin-testFloatAsin.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testAsin_CFLAGS) $(CFLAGS) -c -o testAsin-testAsin.obj `if test -f 'testAsin.c'; then $(CYGPATH_W) 'testAsin.c'; else $(CYGPATH_W) '$(srcdir)/testAsin.c'; fi`
+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testFloatAsin_CFLAGS) $(CFLAGS) -c -o testFloatAsin-testFloatAsin.obj `if test -f 'testFloatAsin.c'; then $(CYGPATH_W) 'testFloatAsin.c'; else $(CYGPATH_W) '$(srcdir)/testFloatAsin.c'; fi`
mostlyclean-libtool:
-rm -f *.lo
diff --git a/src/elementaryFunctions/asin/casins.c b/src/elementaryFunctions/asin/casins.c
index 4b6e0700..957dd8b4 100644
--- a/src/elementaryFunctions/asin/casins.c
+++ b/src/elementaryFunctions/asin/casins.c
@@ -1,18 +1,144 @@
/*
-** -*- C -*-
-**
-** casins.c
-** Made by Bruno JOFRET <bruno.jofret@inria.fr>
-**
-** Started on Fri Jan 5 11:29:45 2007 jofret
-** Last update Fri Feb 23 16:40:05 2007 jofret
-**
-** Copyright INRIA 2007
-*/
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+/*
+ * REFERENCE
+ * This is a Fortran-77 translation of an algorithm by
+ * T.E. Hull, T. F. Fairgrieve and P.T.P. Tang which
+ * appears in their article :
+ * "Implementing the Complex Arcsine and Arccosine
+ * Functions Using Exception Handling", ACM, TOMS,
+ * Vol 23, No. 3, Sept 1997, p. 299-335
+ */
+
+#include "lapack.h"
#include "asin.h"
+#include "atan.h"
+#include "sqrt.h"
+#include "abs.h"
+#include "log.h"
+#include "log1p.h"
+#include "min.h"
+#include "max.h"
floatComplex casins(floatComplex z) {
- /* FIXME: Dummy... */
- return z;
+ static float sdblPi_2 = 1.5707963267948966192313216f;
+ static float sdblLn2 = 0.6931471805599453094172321f;
+ static float sdblAcross = 1.5f;
+ static float sdblBcross = 0.6417f;
+
+ float dblLsup = ssqrts((float) getOverflowThreshold())/ 8.0f;
+ float dblLinf = 4.0f * ssqrts((float) getUnderflowThreshold());
+ float dblEpsm = ssqrts((float) getRelativeMachinePrecision());
+
+ float _dblReal = creals(z);
+ float _dblImg = cimags(z);
+
+ float dblAbsReal = sabss(_dblReal);
+ float dblAbsImg = sabss(_dblImg);
+ float iSignReal = _dblReal < 0 ? -1.0f : 1.0f;
+ float iSignImg = _dblImg < 0 ? -1.0f : 1.0f;
+
+ float dblR = 0, dblS = 0, dblA = 0, dblB = 0;
+
+ float dblTemp = 0;
+
+ float _pdblReal = 0;
+ float _pdblImg = 0;
+
+ if( min(dblAbsReal, dblAbsImg) > dblLinf && max(dblAbsReal, dblAbsImg) <= dblLsup)
+ {
+ /* we are in the safe region */
+ dblR = ssqrts( (dblAbsReal + 1) * (dblAbsReal + 1) + dblAbsImg * dblAbsImg);
+ dblS = ssqrts( (dblAbsReal - 1) * (dblAbsReal - 1) + dblAbsImg * dblAbsImg);
+ dblA = (float) 0.5 * ( dblR + dblS );
+ dblB = dblAbsReal / dblA;
+
+
+ /* compute the real part */
+ if(dblB <= sdblBcross)
+ _pdblReal = sasins(dblB);
+ else if( dblAbsReal <= 1)
+ _pdblReal = satans(dblAbsReal / ssqrts( 0.5f * (dblA + dblAbsReal) * ( (dblAbsImg * dblAbsImg) / (dblR + (dblAbsReal + 1)) + (dblS + (1 - dblAbsReal)))));
+ else
+ _pdblReal = satans(dblAbsReal / (dblAbsImg * ssqrts( 0.5f * ((dblA + dblAbsReal) / (dblR + (dblAbsReal + 1)) + (dblA + dblAbsReal) / (dblS + (dblAbsReal-1))))));
+
+ /* compute the imaginary part */
+ if(dblA <= sdblAcross)
+ {
+ float dblImg1 = 0;
+
+ if(dblAbsReal < 1)
+ /* Am1 = 0.5d0*((y**2)/(R+(x+1.d0))+(y**2)/(S+(1.d0-x))) */
+ dblImg1 = 0.5f * (dblAbsImg * dblAbsImg / (dblR + (dblAbsReal + 1)) + dblAbsImg * dblAbsImg / (dblS + (dblAbsReal - 1)));
+ else
+ /* Am1 = 0.5d0*((y**2)/(R+(x+1.d0))+(S+(x-1.d0))) */
+ dblImg1 = 0.5f * (dblAbsImg * dblAbsImg / (dblR + (dblAbsReal + 1)) + (dblS + (dblAbsReal - 1)));
+ /* ai = logp1(Am1 + sqrt(Am1*(A+1.d0))) */
+ dblTemp = dblImg1 + ssqrts(dblImg1 * dblA + 1);
+ _pdblImg = slog1ps(dblTemp);
+ }
+ else
+ /* ai = log(A + sqrt(A**2 - 1.d0)) */
+ _pdblImg = slogs(dblA + ssqrts(dblA * dblA - (float) 1.0));
+ }
+ else
+ {
+ /* evaluation in the special regions ... */
+ if(dblAbsImg <= dblEpsm * dabss(dblAbsReal - 1))
+ {
+ if(dblAbsReal < 1)
+ {
+ _pdblReal = sasins(dblAbsReal);
+ _pdblImg = dblAbsImg / ssqrts((1 + dblAbsReal) * (1 - dblAbsReal));
+ }
+ else
+ {
+ _pdblReal = sdblPi_2;
+ if(dblAbsReal <= dblLsup)
+ {
+ dblTemp = (dblAbsReal - 1) + ssqrts((dblAbsReal - 1) * (dblAbsReal + 1));
+ _pdblImg = slog1ps(dblTemp);
+ }
+ else
+ _pdblImg = sdblLn2 + slogs(dblAbsReal);
+ }
+ }
+ else if(dblAbsImg < dblLinf)
+ {
+ _pdblReal = sdblPi_2 - ssqrts(dblAbsImg);
+ _pdblImg = ssqrts(dblAbsImg);
+ }
+ else if((dblEpsm * dblAbsImg - 1 >= dblAbsReal))
+ {
+ _pdblReal = dblAbsReal * dblAbsImg;
+ _pdblImg = sdblLn2 + slogs(dblAbsReal);
+ }
+ else if(dblAbsReal > 1)
+ {
+ _pdblReal = satans(dblAbsReal / dblAbsImg);
+ dblTemp = (dblAbsReal / dblAbsImg) * (dblAbsReal / dblAbsImg);
+ _pdblImg = sdblLn2 + slogs(dblAbsReal) + 0.5f * slog1ps(dblTemp);
+ }
+ else
+ {
+ float dblTemp2 = ssqrts(1 + dblAbsImg * dblAbsImg);
+ _pdblReal = dblAbsReal / dblTemp2;
+ dblTemp = 2.0f * dblAbsImg * (dblAbsImg + dblTemp2);
+ _pdblImg = 0.5f * slog1ps(dblTemp);
+ }
+ }
+ _pdblReal *= iSignReal;
+ _pdblImg *= iSignImg;
+
+ return (FloatComplex(_pdblReal, _pdblImg));
}
diff --git a/src/elementaryFunctions/asin/sasins.c b/src/elementaryFunctions/asin/sasins.c
index 32ed4d86..63967c27 100644
--- a/src/elementaryFunctions/asin/sasins.c
+++ b/src/elementaryFunctions/asin/sasins.c
@@ -1,18 +1,18 @@
/*
-** -*- C -*-
-**
-** sasins.c
-** Made by Bruno JOFRET <bruno.jofret@inria.fr>
-**
-** Started on Fri Jan 5 10:25:44 2007 jofret
-** Last update Fri Apr 20 14:45:12 2007 jofret
-**
-** Copyright INRIA 2007
-*/
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2008-2008 - INRIA - Bruno JOFRET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
#include <math.h>
#include "asin.h"
float sasins(float x) {
- return (asin(x));
+ return (asinf(x));
}
diff --git a/src/elementaryFunctions/asin/testAsin.c b/src/elementaryFunctions/asin/testAsin.c
deleted file mode 100644
index 784fedc3..00000000
--- a/src/elementaryFunctions/asin/testAsin.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
- * Copyright (C) 2006-2008 - INRIA - Bruno JOFRET
- *
- * This file must be used under the terms of the CeCILL.
- * This source file is licensed as described in the file COPYING, which
- * you should have received as part of this distribution. The terms
- * are also available at
- * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
- *
- */
-
-#include "testAsin.h"
-
-void sasinsTest(void) {
- printf(">> Float scalar\n");
- printf("sasins(0) = %f\n", sasins((float) 0));
- printf("sasins(PI) = %f\n", sasins(PI));
- printf("sasins(PI/2) = %f\n", sasins(PI/2));
- printf("sasins(PI/3) = %f\n", sasins(PI/3));
- printf("sasins(PI/4) = %f\n", sasins(PI/4));
- printf("sasins(PI/6) = %f\n", sasins(PI/6));
- printf("sasins(-PI) = %f\n", sasins(-PI));
- printf("sasins(-PI/2) = %f\n", sasins(-PI/2));
- printf("sasins(-PI/3) = %f\n", sasins(-PI/3));
- printf("sasins(-PI/4) = %f\n", sasins(-PI/4));
- printf("sasins(-PI/6) = %f\n", sasins(-PI/6));
-}
-
-void dasinsTest(void) {
- printf(">> Double scalar\n");
- printf("dasins(0) = %e\n", dasins((double) 0));
- printf("dasins(PI) = %e\n", dasins(PI));
- printf("dasins(PI/2) = %e\n", dasins(PI/2));
- printf("dasins(PI/3) = %e\n", dasins(PI/3));
- printf("dasins(PI/4) = %e\n", dasins(PI/4));
- printf("dasins(PI/6) = %e\n", dasins(PI/6));
- printf("dasins(-PI) = %e\n", dasins(-PI));
- printf("dasins(-PI/2) = %e\n", dasins(-PI/2));
- printf("dasins(-PI/3) = %e\n", dasins(-PI/3));
- printf("dasins(-PI/4) = %e\n", dasins(-PI/4));
- printf("dasins(-PI/6) = %e\n", dasins(-PI/6));
-}
-
-void casinsTest(void) {
- floatComplex pi_pi = FloatComplex(PI, PI);
- floatComplex pi_2_pi_2 = FloatComplex(PI/2, PI/2);
- floatComplex pi_2_pi_3 = FloatComplex(PI/2, PI/3);
- floatComplex pi_2_pi_4 = FloatComplex(PI/2, PI/4);
- floatComplex out;
-
- printf(">> Float Complex scalar\n");
- out = casins(pi_pi);
- printf("casins(PI + I*PI) = %f + I * %f\n", creals(out), cimags(out));
- out = casins(pi_2_pi_2);
- printf("casins(PI/2 + I*PI/2) = %f + I * %f\n", creals(out), cimags(out));
- out = casins(pi_2_pi_3);
- printf("casins(PI/2 + I*PI/3) = %f + I * %f\n", creals(out), cimags(out));
- out = casins(pi_2_pi_4);
- printf("casins(PI/2 + I*PI/4) = %f + I * %f\n", creals(out), cimags(out));
-}
-
-void zasinsTest(void) {
- doubleComplex pi_pi = DoubleComplex(PI, PI);
- doubleComplex pi_2_pi_2 = DoubleComplex(PI/2, PI/2);
- doubleComplex pi_2_pi_3 = DoubleComplex(PI/2, PI/3);
- doubleComplex pi_2_pi_4 = DoubleComplex(PI/2, PI/4);
- doubleComplex out;
-
- printf(">> Double Complex scalar\n");
- out = zasins(pi_pi);
- printf("zasins(PI + I*PI) = %e + I * %e\n", zreals(out), zimags(out));
- out = zasins(pi_2_pi_2);
- printf("zasins(PI/2 + I*PI/2) = %e + I * %e\n", zreals(out), zimags(out));
- out = zasins(pi_2_pi_3);
- printf("zasins(PI/2 + I*PI/3) = %e + I * %e\n", zreals(out), zimags(out));
- out = zasins(pi_2_pi_4);
- printf("zasins(PI/2 + I*PI/4) = %e + I * %e\n", zreals(out), zimags(out));
-}
-
-void sasinaTest(void) {
- float out[5];
- float in[5] = {PI, PI/2, PI/3, PI/4, PI/6};
- int i = 0;
-
- printf(">> Float array\n");
- sasina(in, 5, out);
- for (i = 0 ; i < 5 ; ++i)
- printf("sasina(array) = %f\n", out[i]);
-}
-
-void dasinaTest(void) {
- double out[5];
- double in[5] = {PI, PI/2, PI/3, PI/4, PI/6};
- int i = 0;
-
- printf(">> Double Array\n");
- dasina(in, 5, out);
- for (i = 0 ; i < 5 ; ++i)
- printf("sasina(array) = %f\n", out[i]);
-
-}
-
-void casinaTest(void) {
- floatComplex in[4];
- floatComplex out[4];
- int i = 0;
-
- in[0] = FloatComplex(PI, PI);
- in[1] = FloatComplex(PI/2, PI/2);
- in[2] = FloatComplex(PI/2, PI/3);
- in[3] = FloatComplex(PI/2, PI/4);
-
- casina(in, 4, out);
- printf(">> Float Complex Array\n");
- for (i = 0 ; i < 4 ; ++i)
- printf("casina(array) = %e + I * %e\n", creals(out[i]), cimags(out[i]));
-}
-
-void zasinaTest(void) {
- doubleComplex in[4];
- doubleComplex out[4];
- int i = 0;
-
- in[0] = DoubleComplex(PI, PI);
- in[1] = DoubleComplex(PI/2, PI/2);
- in[2] = DoubleComplex(PI/2, PI/3);
- in[3] = DoubleComplex(PI/2, PI/4);
-
- zasina(in, 4, out);
- printf(">> Double Complex Array\n");
- for (i = 0 ; i < 4 ; ++i)
- printf("zasina(array) = %e + I * %e\n", zreals(out[i]), zimags(out[i]));
-}
-
-int testAsin(void) {
- printf("\n>>>> ArcSine Tests\n");
- sasinsTest();
- dasinsTest();
- casinsTest();
- zasinsTest();
- /*
- sasinaTest();
- dasinaTest();
- casinaTest();
- zasinaTest();
- */
- return 0;
-}
-
-int main(void) {
- assert(testAsin() == 0);
- return 0;
-}
diff --git a/src/elementaryFunctions/asin/testDoubleAsin.c b/src/elementaryFunctions/asin/testDoubleAsin.c
new file mode 100644
index 00000000..8b0f0f5a
--- /dev/null
+++ b/src/elementaryFunctions/asin/testDoubleAsin.c
@@ -0,0 +1,101 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2006-2008 - INRIA - Bruno JOFRET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "testAsin.h"
+
+void dasinsTest(void) {
+ printf(">> Double scalar\n");
+ printf("dasins(0) = %e\n", dasins(0.0));
+ printf("dasins(PI) = %e\n", dasins(DPI));
+ printf("dasins(PI/2) = %e\n", dasins(DPI/2));
+ printf("dasins(PI/3) = %e\n", dasins(DPI/3));
+ printf("dasins(PI/4) = %e\n", dasins(DPI/4));
+ printf("dasins(PI/6) = %e\n", dasins(DPI/6));
+ printf("dasins(-PI) = %e\n", dasins(-DPI));
+ printf("dasins(-PI/2) = %e\n", dasins(-DPI/2));
+ printf("dasins(-PI/3) = %e\n", dasins(-DPI/3));
+ printf("dasins(-PI/4) = %e\n", dasins(-DPI/4));
+ printf("dasins(-PI/6) = %e\n", dasins(-DPI/6));
+ printf("dasins(1) = %e\n", dasins(1));
+ printf("dasins(-1) = %e\n", dasins(-1));
+}
+
+void zasinsTest(void) {
+ doubleComplex pi_pi = DoubleComplex(DPI, DPI);
+ doubleComplex pi_2_pi_2 = DoubleComplex(DPI/2, DPI/2);
+ doubleComplex pi_2_pi_3 = DoubleComplex(DPI/2, DPI/3);
+ doubleComplex pi_2_pi_4 = DoubleComplex(DPI/2, DPI/4);
+ doubleComplex zero_zero = DoubleComplex(0.0, 0.0);
+ doubleComplex one_and_i = DoubleComplex(1.0, 1.0);
+ doubleComplex asin_one_and_i = DoubleComplex(0.6662394324925152711003,
+ 1.0612750619050357325790);
+ doubleComplex out;
+
+ printf(">> Double Complex scalar\n");
+ out = zasins(pi_pi);
+ printf("zasins(PI + I*PI) = %e + I * %e\n", zreals(out), zimags(out));
+ out = zasins(pi_2_pi_2);
+ printf("zasins(PI/2 + I*PI/2) = %e + I * %e\n", zreals(out), zimags(out));
+ out = zasins(pi_2_pi_3);
+ printf("zasins(PI/2 + I*PI/3) = %e + I * %e\n", zreals(out), zimags(out));
+ out = zasins(pi_2_pi_4);
+ printf("zasins(PI/2 + I*PI/4) = %e + I * %e\n", zreals(out), zimags(out));
+ out = zasins(zero_zero);
+ printf("zasins(0 + I*0) = %e + I * %e\n", zreals(out), zimags(out));
+ out = zasins(one_and_i);
+ printf("zasins(1 + I*1) = %.25e + I * %.25e\n", zreals(out), zimags(out));
+ printf("zasins(1 + I*1) = %.25e + I * %.25e\n", zreals(asin_one_and_i), zimags(asin_one_and_i));
+ /* assert(zreals(out) == zreals(asin_one_and_i)); */
+ /* assert(zimags(out) == zimags(asin_one_and_i)); */
+}
+
+void dasinaTest(void) {
+ double out[5];
+ double in[5] = {DPI, DPI/2, DPI/3, DPI/4, DPI/6};
+ int i = 0;
+
+ printf(">> Double Array\n");
+ dasina(in, 5, out);
+ for (i = 0 ; i < 5 ; ++i)
+ printf("sasina(array) = %f\n", out[i]);
+
+}
+
+void zasinaTest(void) {
+ doubleComplex in[4];
+ doubleComplex out[4];
+ int i = 0;
+
+ in[0] = DoubleComplex(DPI, DPI);
+ in[1] = DoubleComplex(DPI/2, DPI/2);
+ in[2] = DoubleComplex(DPI/2, DPI/3);
+ in[3] = DoubleComplex(DPI/2, DPI/4);
+
+ zasina(in, 4, out);
+ printf(">> Double Complex Array\n");
+ for (i = 0 ; i < 4 ; ++i)
+ printf("zasina(array) = %e + I * %e\n", zreals(out[i]), zimags(out[i]));
+}
+
+int testAsin(void) {
+ printf("\n>>>> Double ArcSine Tests\n");
+ dasinsTest();
+ zasinsTest();
+ dasinaTest();
+ zasinaTest();
+ return 0;
+}
+
+int main(void) {
+ assert(testAsin() == 0);
+ return 0;
+}
diff --git a/src/elementaryFunctions/asin/testFloatAsin.c b/src/elementaryFunctions/asin/testFloatAsin.c
new file mode 100644
index 00000000..8373593f
--- /dev/null
+++ b/src/elementaryFunctions/asin/testFloatAsin.c
@@ -0,0 +1,87 @@
+/*
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2006-2008 - INRIA - Bruno JOFRET
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution. The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "testAsin.h"
+
+void sasinsTest(void) {
+ printf(">> Float scalar\n");
+ printf("sasins(0) = %f\n", sasins(0.0f));
+ printf("sasins(PI) = %f\n", sasins(FPI));
+ printf("sasins(PI/2) = %f\n", sasins(FPI/2));
+ printf("sasins(PI/3) = %f\n", sasins(FPI/3));
+ printf("sasins(PI/4) = %f\n", sasins(FPI/4));
+ printf("sasins(PI/6) = %f\n", sasins(FPI/6));
+ printf("sasins(-PI) = %f\n", sasins(-FPI));
+ printf("sasins(-PI/2) = %f\n", sasins(-FPI/2));
+ printf("sasins(-PI/3) = %f\n", sasins(-FPI/3));
+ printf("sasins(-PI/4) = %f\n", sasins(-FPI/4));
+ printf("sasins(-PI/6) = %f\n", sasins(-FPI/6));
+}
+
+void casinsTest(void) {
+ floatComplex pi_pi = FloatComplex(FPI, FPI);
+ floatComplex pi_2_pi_2 = FloatComplex(FPI/2, FPI/2);
+ floatComplex pi_2_pi_3 = FloatComplex(FPI/2, FPI/3);
+ floatComplex pi_2_pi_4 = FloatComplex(FPI/2, FPI/4);
+ floatComplex out;
+
+ printf(">> Float Complex scalar\n");
+ out = casins(pi_pi);
+ printf("casins(PI + I*PI) = %f + I * %f\n", creals(out), cimags(out));
+ out = casins(pi_2_pi_2);
+ printf("casins(PI/2 + I*PI/2) = %f + I * %f\n", creals(out), cimags(out));
+ out = casins(pi_2_pi_3);
+ printf("casins(PI/2 + I*PI/3) = %f + I * %f\n", creals(out), cimags(out));
+ out = casins(pi_2_pi_4);
+ printf("casins(PI/2 + I*PI/4) = %f + I * %f\n", creals(out), cimags(out));
+}
+
+void sasinaTest(void) {
+ float out[5];
+ float in[5] = {FPI, FPI/2, FPI/3, FPI/4, FPI/6};
+ int i = 0;
+
+ printf(">> Float array\n");
+ sasina(in, 5, out);
+ for (i = 0 ; i < 5 ; ++i)
+ printf("sasina(array) = %f\n", out[i]);
+}
+
+void casinaTest(void) {
+ floatComplex in[4];
+ floatComplex out[4];
+ int i = 0;
+
+ in[0] = FloatComplex(FPI, FPI);
+ in[1] = FloatComplex(FPI/2, FPI/2);
+ in[2] = FloatComplex(FPI/2, FPI/3);
+ in[3] = FloatComplex(FPI/2, FPI/4);
+
+ casina(in, 4, out);
+ printf(">> Float Complex Array\n");
+ for (i = 0 ; i < 4 ; ++i)
+ printf("casina(array) = %e + I * %e\n", creals(out[i]), cimags(out[i]));
+}
+
+int testAsin(void) {
+ printf("\n>>>> Float ArcSine Tests\n");
+ sasinsTest();
+ casinsTest();
+ sasinaTest();
+ casinaTest();
+ return 0;
+}
+
+int main(void) {
+ assert(testAsin() == 0);
+ return 0;
+}
diff --git a/src/elementaryFunctions/asin/zasins.c b/src/elementaryFunctions/asin/zasins.c
index 8c0d149a..19bce55b 100644
--- a/src/elementaryFunctions/asin/zasins.c
+++ b/src/elementaryFunctions/asin/zasins.c
@@ -20,8 +20,7 @@
* Vol 23, No. 3, Sept 1997, p. 299-335
*/
-#include <stdio.h>
-
+#include "lapack.h"
#include "asin.h"
#include "atan.h"
#include "sqrt.h"
@@ -31,20 +30,15 @@
#include "min.h"
#include "max.h"
-/*
-** FIXME
-*/
-extern double dlamch_(char *CMACH, unsigned long int);
-
doubleComplex zasins(doubleComplex z) {
static double sdblPi_2 = 1.5707963267948966192313216;
static double sdblLn2 = 0.6931471805599453094172321;
static double sdblAcross = 1.5;
static double sdblBcross = 0.6417;
- double dblLsup = dsqrts(dlamch_("o",1L))/8.0;
- double dblLinf = 4 * dsqrts(dlamch_("u",1L));
- double dblEpsm = dsqrts(dlamch_("e",1L));
+ double dblLsup = dsqrts(getOverflowThreshold())/8.0;
+ double dblLinf = 4 * dsqrts(getUnderflowThreshold());
+ double dblEpsm = dsqrts(getRelativeMachinePrecision());
double _dblReal = zreals(z);
double _dblImg = zimags(z);