diff options
author | jofret | 2008-04-21 15:09:53 +0000 |
---|---|---|
committer | jofret | 2008-04-21 15:09:53 +0000 |
commit | 7425dfa5ac9f8f06bea91974960b8af6474fd878 (patch) | |
tree | 880ab806e9bbd094eed9faf2655bd9c0a32bd297 /src/elementaryFunctions/asin | |
parent | 9bee1f2a458843199b0541eaf28a7f4d5bbbfa34 (diff) | |
download | scilab2c-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.am | 28 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/Makefile.in | 93 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/casins.c | 150 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/sasins.c | 22 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/testAsin.c | 154 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/testDoubleAsin.c | 101 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/testFloatAsin.c | 87 | ||||
-rw-r--r-- | src/elementaryFunctions/asin/zasins.c | 14 |
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); |