Filter:   InfoImg
download acosl.c
Language: C
Copyright: (C) 1993 by Sun Microsystems, Inc. All rights reserved.
LOC: 161
Project Info
gnulib - portability library(gnulib)
Server: Savannah GNU
Type: cvs
...g\gnulib\gnulib\gnulib\lib\
   .cppi-disable
   .cvsignore
   __fpending.c
   __fpending.h
   acl-internal.h
   acl.c
   acl.h
   acl_entries.c
   acosl.c
   alloca.c
   alloca_.h
   arcfour.c
   arcfour.h
   arctwo.c
   arctwo.h
   areadlink-with-size.c
   areadlink.h
   argmatch.c
   argmatch.h
   argp-ba.c
   argp-eexst.c
   argp-fmtstream.c
   argp-fmtstream.h
   argp-fs-xinl.c
   argp-help.c
   argp-namefrob.h
   argp-parse.c
   argp-pin.c
   argp-pv.c
   argp-pvh.c
   argp-xinl.c
   argp.h
   argz.c
   argz_.h
   asinl.c
   asnprintf.c
   asprintf.c
   at-func.c
   atanl.c
   atexit.c
   backupfile.c
   backupfile.h
   base64.c
   base64.h
   basename.c
   bcopy.c
   binary-io.h
   byteswap_.h
   c-ctype.c
   c-ctype.h
   c-stack.c
   c-stack.h
   c-strcase.h
   c-strcasecmp.c
   c-strcaseeq.h
   c-strcasestr.c
   c-strcasestr.h
   c-strncasecmp.c
   c-strstr.c
   c-strstr.h
   c-strtod.c
   c-strtod.h
   c-strtold.c
   calloc.c
   canon-host.c
   canon-host.h
   canonicalize-lgpl.c
   canonicalize.c
   canonicalize.h
   ceill.c
   chdir-long.c
   chdir-long.h
   chdir-safer.c
   chdir-safer.h
   check-version.c
   check-version.h
   chown.c
   classpath.c
   classpath.h
   clean-temp.c
   clean-temp.h
   cloexec.c
   cloexec.h
   close-stream.c
   close-stream.h
   closein.c
   closein.h
   closeout.c
   closeout.h
   concat-filename.c
   config.charset
   copy-file.c
   copy-file.h
   cosl.c
   count-one-bits.h
   crc.c
   crc.h
   creat-safer.c
   csharpcomp.c
   csharpcomp.h
   csharpexec.c
   csharpexec.h
   cycle-check.c
   cycle-check.h
   des.c
   des.h
   dev-ino.h
   diacrit.c
   diacrit.h
   diffseq.h
   dirchownmod.c
   dirchownmod.h
   dirent_.h
   dirfd.c
   dirfd.h
   dirname.c
   dirname.h
   dummy.c
   dup-safer.c
   dup2.c
   eealloc.h
   error.c
   error.h
   euidaccess.c
   euidaccess.h
   exclude.c
   exclude.h
   execute.c
   execute.h
   exitfail.c
   exitfail.h
   expl.c
   fatal-signal.c
   fatal-signal.h
   fbufmode.c
   fbufmode.h
   fchdir.c
   fchmodat.c
   fchown-stub.c
   fchownat.c
   fcntl--.h
   fcntl-safer.h
   fcntl_.h
   fd-safer.c
   fflush.c
   file-has-acl.c
   file-type.c
   file-type.h
   fileblocks.c
   filemode.c
   filemode.h
   filename.h
   filenamecat.c
   filenamecat.h
   findprog.c
   findprog.h
   float+.h
   float_.h
   floorl.c
   fnmatch.c
   fnmatch_.h
   fnmatch_loop.c
   fopen-safer.c
   fprintf.c
   fprintftime.c
   fprintftime.h
   fpucw.h
   fpurge.c
   fpurge.h
   freadable.c
   freadable.h
   freadahead.c
   freadahead.h
   freading.c
   freading.h
   free.c
   frexp.c
   frexpl.c
   fseek.c
   fseeko.c
   fseterr.c
   fseterr.h
   fstatat.c
   fstrcmp.c
   fstrcmp.h
   fsusage.c
   fsusage.h
   ftell.c
   ftello.c
   ftruncate.c
   fts-cycle.c
   fts.c
   fts_.h
   full-read.c
   full-read.h
   full-write.c
   full-write.h
   fwritable.c
   fwritable.h
   fwriteerror.c
   fwriteerror.h
   fwriting.c
   fwriting.h
   gai_strerror.c
   gc-gnulib.c
   gc-libgcrypt.c
   gc-pbkdf2-sha1.c
   gc.h
   gcd.c
   gcd.h
   getaddrinfo.c
   getaddrinfo.h
   getcwd.c
   getdate.h
   getdate.y
   getdelim.c
   getdomainname.c
   getdomainname.h
   getgroups.c
   gethostname.c
   gethrxtime.c
   gethrxtime.h
   getline.c
   getloadavg.c
   getlogin_r.c
   getndelim2.c
   getndelim2.h
   getnline.c
   getnline.h
   getopt.c
   getopt_.h
   getopt_int.h
   getopt1.c
   getpagesize.h
   getpass.c
   getpass.h
   getsubopt.c
   gettext.h
   gettime.c
   gettimeofday.c
   getugroups.c
   getugroups.h
   getusershell.c
   gl_anyavltree_list1.h
   gl_anyavltree_list2.h
   gl_anyhash_list1.h
   gl_anyhash_list2.h
   gl_anylinked_list1.h
   gl_anylinked_list2.h
   gl_anyrbtree_list1.h
   gl_anyrbtree_list2.h
   gl_anytree_list1.h
   gl_anytree_list2.h
   gl_anytree_oset.h
   gl_anytreehash_list1.h
   gl_anytreehash_list2.h
   gl_array_list.c
   gl_array_list.h
   gl_array_oset.c
   gl_array_oset.h
   gl_avltree_list.c
   gl_avltree_list.h
   gl_avltree_oset.c
   gl_avltree_oset.h
   gl_avltreehash_list.c
   gl_avltreehash_list.h
   gl_carray_list.c
   gl_carray_list.h
   gl_linked_list.c
   gl_linked_list.h
   gl_linkedhash_list.c
   gl_linkedhash_list.h
   gl_list.c
   gl_list.h
   gl_oset.c
   gl_oset.h
   gl_rbtree_list.c
   gl_rbtree_list.h
   gl_rbtree_oset.c
   gl_rbtree_oset.h
   gl_rbtreehash_list.c
   gl_rbtreehash_list.h
   gl_sublist.c
   gl_sublist.h
   glob-libc.h
   glob.c
   glob_.h
   group-member.c
   group-member.h
   hard-locale.c
   hard-locale.h
   hash-pjw.c
   hash-pjw.h
   hash.c
   hash.h
   hmac-md5.c
   hmac-sha1.c
   hmac.h
   human.c
   human.h
   i-ring-test.c
   i-ring.c
   i-ring.h
   iconv_.h
   iconv_open-aix.gperf
   iconv_open-hpux.gperf
   iconv_open-irix.gperf
   iconv_open-osf.gperf
   iconv_open.c
   idcache.c
   idcache.h
   imaxabs.c
   imaxdiv.c
   imaxtostr.c
   inet_ntop.c
   inet_ntop.h
   inet_pton.c
   inet_pton.h
   intprops.h
   inttostr.c
   inttostr.h
   inttypes_.h
   isapipe.c
   isapipe.h
   isdir.c
   isnan.c
   isnan.h
   isnanf.c
   isnanf.h
   isnanl-nolibm.h
   isnanl.c
   isnanl.h
   javacomp.c
   javacomp.h
   javaexec.c
   javaexec.h
   javaversion.c
   javaversion.h
   javaversion.java
   lbrkprop.h
   lchmod.h
   lchown.c
   ldexpl.c
   linebreak.c
   linebreak.h
   linebuffer.c
   linebuffer.h
   localcharset.c
   localcharset.h
   locale_.h
   localename.c
   localename.h
   lock.c
   lock.h
   logl.c
   long-options.c
   long-options.h
   lseek.c
   lstat.c
   lstat.h
   malloc.c
   malloca.c
   malloca.h
   malloca.valgrind
   math_.h
   mbchar.c
   mbchar.h
   mbfile.h
   mbiter.h
   mbscasecmp.c
   mbscasestr.c
   mbschr.c
   mbscspn.c
   mbslen.c
   mbsncasecmp.c
   mbsnlen.c
   mbspbrk.c
   mbspcasecmp.c
   mbsrchr.c
   mbssep.c
   mbsspn.c
   mbsstr.c
   mbstok_r.c
   mbswidth.c
   mbswidth.h
   mbuiter.h
   md2.c
   md2.h
   md4.c
   md4.h
   md5.c
   md5.h
   memcasecmp.c
   memcasecmp.h
   memchr.c
   memcmp.c
   memcoll.c
   memcoll.h
   memcpy.c
   memmem.c
   memmove.c
   mempcpy.c
   memrchr.c
   memset.c
   memxor.c
   memxor.h
   minmax.h
   mkancesdirs.c
   mkancesdirs.h
   mkdir-p.c
   mkdir-p.h
   mkdir.c
   mkdirat.c
   mkdtemp.c
   mkstemp-safer.c
   mkstemp.c
   mktime.c
   modechange.c
   modechange.h
   mountlist.c
   mountlist.h
   mpsort.c
   mpsort.h
   nanosleep.c
   netinet_in_.h
   obstack.c
   obstack.h
   offtostr.c
   open-safer.c
   openat-die.c
   openat-priv.h
   openat-proc.c
   openat.c
   openat.h
   pagealign_alloc.c
   pagealign_alloc.h
   pathmax.h
   physmem.c
   physmem.h
   pipe-safer.c
   pipe.c
   pipe.h
   poll.c
   poll_.h
   posixtm.c
   posixtm.h
   posixver.c
   posixver.h
   printf-args.c
   printf-args.h
   printf-frexp.c
   printf-frexp.h
   printf-frexpl.c
   printf-frexpl.h
   printf-parse.c
   printf-parse.h
   printf.c
   progname.c
   progname.h
   progreloc.c
   putenv.c
   quote.c
   quote.h
   quotearg.c
   quotearg.h
   raise.c
   read-file.c
   read-file.h
   readline.c
   readline.h
   readlink.c
   readtokens.c
   readtokens.h
   readtokens0.c
   readtokens0.h
   readutmp.c
   readutmp.h
   realloc.c
   ref-add.sin
   ref-del.sin
   regcomp.c
   regex.c
   regex.h
   regex_internal.c
   regex_internal.h
   regexec.c
   relocatable.c
   relocatable.h
   relocwrapper.c
   rename-dest-slash.c
   rename.c
   rijndael-alg-fst.c
   rijndael-alg-fst.h
   rijndael-api-fst.c
   rijndael-api-fst.h
   rmdir.c
   rpmatch.c
   safe-read.c
   safe-read.h
   safe-write.c
   safe-write.h
   same-inode.h
   same.c
   same.h
   save-cwd.c
   save-cwd.h
   savedir.c
   savedir.h
   savewd.c
   savewd.h
   search_.h
   setenv.c
   setenv.h
   settime.c
   sh-quote.c
   sh-quote.h
   sha1.c
   sha1.h
   sig2str.c
   sig2str.h
   signal_.h
   signbitd.c
   signbitf.c
   signbitl.c
   sigprocmask.c
   sincosl.c
   sinl.c
   size_max.h
   sleep.c
   snprintf.c
   sprintf.c
   sqrtl.c
   stat-macros.h
   stat-time.h
   stdbool_.h
   stdint_.h
   stdio--.h
   stdio-safer.h
   stdio_.h
   stdlib--.h
   stdlib-safer.h
   stdlib_.h
   stpcpy.c
   stpncpy.c
   strcasecmp.c
   strcasestr.c
   strchrnul.c
   strcspn.c
   strdup.c
   streq.h
   strerror.c
   strftime.c
   strftime.h
   striconv.c
   striconv.h
   striconveh.c
   striconveh.h
   striconveha.c
   striconveha.h
   string_.h
   stripslash.c
   strncasecmp.c
   strndup.c
   strnlen.c
   strnlen1.c
   strnlen1.h
   strpbrk.c
   strptime.c
   strsep.c
   strtod.c
   strtoimax.c
   strtok_r.c
   strtol.c
   strtoll.c
   strtoul.c
   strtoull.c
   strtoumax.c
   strverscmp.c
   strverscmp.h
   sys_select_.h
   sys_socket_.h
   sys_stat_.h
   sys_time_.h
   sysexits_.h
   tanl.c
   tempname.c
   tempname.h
   time_.h
   time_r.c
   timegm.c
   timespec.h
   tls.c
   tls.h
   tmpdir.c
   tmpdir.h
   tmpfile-safer.c
   tmpfile.c
   trigl.c
   trigl.h
   trim.c
   trim.h
   tsearch.c
   uinttostr.c
   umaxtostr.c
   unicodeio.c
   unicodeio.h
   uniconv.h
   uniname.h
   unistd--.h
   unistd-safer.h
   unistd_.h
   unistdio.h
   unistr.h
   unitypes.h
   uniwidth.h
   unlinkdir.c
   unlinkdir.h
   unlocked-io.h
   unsetenv.c
   userspec.c
   userspec.h
   utime.c
   utimecmp.c
   utimecmp.h
   utimens.c
   utimens.h
   vasnprintf.c
   vasnprintf.h
   vasprintf.c
   verify.h
   verror.c
   verror.h
   version-etc-fsf.c
   version-etc.c
   version-etc.h
   vfprintf.c
   vprintf.c
   vsnprintf.c
   vsprintf.c
   w32spawn.h
   wait-process.c
   wait-process.h
   wchar_.h
   wctype_.h
   wcwidth.c
   write-any-file.c
   write-any-file.h
   xalloc-die.c
   xalloc.h
   xasprintf.c
   xgetcwd.c
   xgetcwd.h
   xgetdomainname.c
   xgetdomainname.h
   xgethostname.c
   xgethostname.h
   xmalloc.c
   xmalloca.c
   xmalloca.h
   xmemcoll.c
   xmemcoll.h
   xnanosleep.c
   xnanosleep.h
   xreadlink.c
   xreadlink.h
   xsetenv.c
   xsetenv.h
   xsize.h
   xstriconv.c
   xstriconv.h
   xstrndup.c
   xstrndup.h
   xstrtod.c
   xstrtod.h
   xstrtoimax.c
   xstrtol-error.c
   xstrtol.c
   xstrtol.h
   xstrtold.c
   xstrtoul.c
   xstrtoumax.c
   xtime.h
   xvasprintf.c
   xvasprintf.h
   yesno.c
   yesno.h

/*
 * ====================================================
 * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
 *
 * Developed at SunPro, a Sun Microsystems, Inc. business.
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

#include <config.h>

/* Specification.  */
#include <math.h>

/*
  Long double expansions contributed by
  Stephen L. Moshier <moshier@na-net.ornl.gov>
*/

/* asin(x)
 * Method :
 *	Since  asin(x) = x + x^3/6 + x^5*3/40 + x^7*15/336 + ...
 *	we approximate asin(x) on [0,0.5] by
 *		asin(x) = x + x*x^2*R(x^2)
 *      Between .5 and .625 the approximation is
 *              asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
 *	For x in [0.625,1]
 *		asin(x) = pi/2-2*asin(sqrt((1-x)/2))
 *
 * Special cases:
 *	if x is NaN, return x itself;
 *	if |x|>1, return NaN with invalid signal.
 *
 */


static const long double
  one = 1.0L,
  huge = 1.0e+4932L,
  pi =      3.1415926535897932384626433832795028841972L,
  pio2_hi = 1.5707963267948966192313216916397514420986L,
  pio2_lo = 4.3359050650618905123985220130216759843812E-35L,
  pio4_hi = 7.8539816339744830961566084581987569936977E-1L,

	/* coefficient for R(x^2) */

  /* asin(x) = x + x^3 pS(x^2) / qS(x^2)
     0 <= x <= 0.5
     peak relative error 1.9e-35  */
  pS0 = -8.358099012470680544198472400254596543711E2L,
  pS1 =  3.674973957689619490312782828051860366493E3L,
  pS2 = -6.730729094812979665807581609853656623219E3L,
  pS3 =  6.643843795209060298375552684423454077633E3L,
  pS4 = -3.817341990928606692235481812252049415993E3L,
  pS5 =  1.284635388402653715636722822195716476156E3L,
  pS6 = -2.410736125231549204856567737329112037867E2L,
  pS7 =  2.219191969382402856557594215833622156220E1L,
  pS8 = -7.249056260830627156600112195061001036533E-1L,
  pS9 =  1.055923570937755300061509030361395604448E-3L,

  qS0 = -5.014859407482408326519083440151745519205E3L,
  qS1 =  2.430653047950480068881028451580393430537E4L,
  qS2 = -4.997904737193653607449250593976069726962E4L,
  qS3 =  5.675712336110456923807959930107347511086E4L,
  qS4 = -3.881523118339661268482937768522572588022E4L,
  qS5 =  1.634202194895541569749717032234510811216E4L,
  qS6 = -4.151452662440709301601820849901296953752E3L,
  qS7 =  5.956050864057192019085175976175695342168E2L,
  qS8 = -4.175375777334867025769346564600396877176E1L,
  /* 1.000000000000000000000000000000000000000E0 */

  /* asin(0.5625 + x) = asin(0.5625) + x rS(x) / sS(x)
     -0.0625 <= x <= 0.0625
     peak relative error 3.3e-35  */
  rS0 = -5.619049346208901520945464704848780243887E0L,
  rS1 =  4.460504162777731472539175700169871920352E1L,
  rS2 = -1.317669505315409261479577040530751477488E2L,
  rS3 =  1.626532582423661989632442410808596009227E2L,
  rS4 = -3.144806644195158614904369445440583873264E1L,
  rS5 = -9.806674443470740708765165604769099559553E1L,
  rS6 =  5.708468492052010816555762842394927806920E1L,
  rS7 =  1.396540499232262112248553357962639431922E1L,
  rS8 = -1.126243289311910363001762058295832610344E1L,
  rS9 = -4.956179821329901954211277873774472383512E-1L,
  rS10 =  3.313227657082367169241333738391762525780E-1L,

  sS0 = -4.645814742084009935700221277307007679325E0L,
  sS1 =  3.879074822457694323970438316317961918430E1L,
  sS2 = -1.221986588013474694623973554726201001066E2L,
  sS3 =  1.658821150347718105012079876756201905822E2L,
  sS4 = -4.804379630977558197953176474426239748977E1L,
  sS5 = -1.004296417397316948114344573811562952793E2L,
  sS6 =  7.530281592861320234941101403870010111138E1L,
  sS7 =  1.270735595411673647119592092304357226607E1L,
  sS8 = -1.815144839646376500705105967064792930282E1L,
  sS9 = -7.821597334910963922204235247786840828217E-2L,
  /*  1.000000000000000000000000000000000000000E0 */

 asinr5625 =  5.9740641664535021430381036628424864397707E-1L;


long double
acosl (long double x)
{
  long double t, p, q;

  if (x < 0.0L)
    {
      t = pi - acosl(-x);
      if (huge + x > one) /* return with inexact */
        return t;
    }

  if (x >= 1.0L)	/* |x|>= 1 */
    {
      if (x == 1.0L)
	return 0.0L;   /* return zero */

      return (x - x) / (x - x);	/* asin(|x|>1) is NaN */
    }

  else if (x < 0.5L) /* |x| < 0.5 */
    {
      if (x < 0.000000000000000006938893903907228377647697925567626953125L) /* |x| < 2**-57 */
	/* acos(0)=+-pi/2 with inexact */
	return x * pio2_hi + x * pio2_lo;

      t = x * x;
      p = (((((((((pS9 * t
                   + pS8) * t
                  + pS7) * t
                 + pS6) * t
                + pS5) * t
               + pS4) * t
              + pS3) * t
             + pS2) * t
            + pS1) * t
           + pS0) * t;

      q = (((((((( t
                  + qS8) * t
                 + qS7) * t
                + qS6) * t
               + qS5) * t
              + qS4) * t
             + qS3) * t
            + qS2) * t
           + qS1) * t
        + qS0;

      return pio2_hi - (x + x * (p / q) - pio2_lo);
    }

  else if (x < 0.625) /* 0.625 */
    {
      t = x - 0.5625;
      p = ((((((((((rS10 * t
		    + rS9) * t
		   + rS8) * t
		  + rS7) * t
		 + rS6) * t
		+ rS5) * t
	       + rS4) * t
	      + rS3) * t
	     + rS2) * t
	    + rS1) * t
	   + rS0) * t;

      q = ((((((((( t
		    + sS9) * t
		  + sS8) * t
		 + sS7) * t
		+ sS6) * t
	       + sS5) * t
	      + sS4) * t
	     + sS3) * t
	    + sS2) * t
	   + sS1) * t
	+ sS0;

      return (pio2_hi - asinr5625) - (p / q - pio2_lo);
    }
  else
    return 2 * asinl(sqrtl((1-x)/2));
}

#if 0
int
main (void)
{
  printf ("%.18Lg %.18Lg\n",
          acosl(1.0L),
          1.5707963267948966192313216916397514420984L -
          1.5707963267948966192313216916397514420984L);
  printf ("%.18Lg %.18Lg\n",
          acosl(0.7071067811865475244008443621048490392848L),
          1.5707963267948966192313216916397514420984L -
          0.7853981633974483096156608458198757210492L);
  printf ("%.18Lg %.18Lg\n",
          acosl(0.5L),
          1.5707963267948966192313216916397514420984L -
          0.5235987755982988730771072305465838140328L);
  printf ("%.18Lg %.18Lg\n",
          acosl(0.3090169943749474241022934171828190588600L),
          1.5707963267948966192313216916397514420984L -
          0.3141592653589793238462643383279502884196L);
  printf ("%.18Lg %.18Lg\n",
          acosl(-1.0L),
          1.5707963267948966192313216916397514420984L -
          -1.5707963267948966192313216916397514420984L);
  printf ("%.18Lg %.18Lg\n",
          acosl(-0.7071067811865475244008443621048490392848L),
          1.5707963267948966192313216916397514420984L -
          -0.7853981633974483096156608458198757210492L);
  printf ("%.18Lg %.18Lg\n",
          acosl(-0.5L),
          1.5707963267948966192313216916397514420984L -
          -0.5235987755982988730771072305465838140328L);
  printf ("%.18Lg %.18Lg\n",
          acosl(-0.3090169943749474241022934171828190588600L),
          1.5707963267948966192313216916397514420984L -
          -0.3141592653589793238462643383279502884196L);
}
#endif