]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[multiple changes]
authorTom Tromey <tromey@gcc.gnu.org>
Thu, 24 Jun 1999 20:15:28 +0000 (20:15 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Thu, 24 Jun 1999 20:15:28 +0000 (20:15 +0000)
Fri May 28 22:20:03 1999  Anthony Green  <green@cygnus.com>
* java/lang/fdlibm.h: Don't use __uint32_t.  Include mprec.h.
* java/lang/e_log.c: Don't use __uint32_t.
1999-05-27  Eric Christopher <echristo@cygnus.com>
* configure: Rebuilt
* configure.in: Fixed ISO C9X and namespace collision with __uint32_t
* acconfig.h: Rebuilt
* include/config.h.in: Rebuilt
* java/lang/mprec.h, java/lang/e_acos.c, java/lang/e_asin.c,
  java/lang/e_atan2.c, java/lang/e_exp.c, java/lang/e_fmod.c,
  e_log.c, java/lang/e_pow.c, java/lang/e_rem_pio2.c,
  java/lang/e_remainder.c, java/lang/e_sqrt.c, java/lang/fdlibm.h,
  k_tan.c, java/lang/mprec.h, java/lang/s_atan.c,
  java/lang/s_ceil.c, java/lang/s_copysign.c, java/lang/s_fabs.c,
  s_floor.c, java/lang/s_rint.c, java/lang/sf_rint.c: Fixed ISO C9X
  and namespace collision with __uint32_t

From-SVN: r27731

31 files changed:
libjava/ChangeLog
libjava/acconfig.h
libjava/configure
libjava/configure.in
libjava/include/config.h.in
libjava/java/lang/dtoa.c
libjava/java/lang/e_acos.c
libjava/java/lang/e_atan2.c
libjava/java/lang/e_exp.c
libjava/java/lang/e_fmod.c
libjava/java/lang/e_log.c
libjava/java/lang/e_pow.c
libjava/java/lang/e_rem_pio2.c
libjava/java/lang/e_remainder.c
libjava/java/lang/e_sqrt.c
libjava/java/lang/k_cos.c
libjava/java/lang/k_rem_pio2.c
libjava/java/lang/k_sin.c
libjava/java/lang/k_tan.c
libjava/java/lang/mprec.h
libjava/java/lang/s_atan.c
libjava/java/lang/s_ceil.c
libjava/java/lang/s_copysign.c
libjava/java/lang/s_cos.c
libjava/java/lang/s_fabs.c
libjava/java/lang/s_floor.c
libjava/java/lang/s_rint.c
libjava/java/lang/s_scalbn.c
libjava/java/lang/s_sin.c
libjava/java/lang/s_tan.c
libjava/java/lang/sf_rint.c

index 9bd18425884a7833a825a0115f1f6fdd81eff33e..faa2bdb89a525e4c8817c97ba6aacca7821a6ca2 100644 (file)
@@ -1,3 +1,24 @@
+Fri May 28 22:20:03 1999  Anthony Green  <green@cygnus.com>
+
+       * java/lang/fdlibm.h: Don't use __uint32_t.  Include mprec.h.
+       * java/lang/e_log.c: Don't use __uint32_t.
+
+1999-05-27  Eric Christopher <echristo@cygnus.com>
+
+       * configure: Rebuilt
+       * configure.in: Fixed ISO C9X and namespace collision with __uint32_t
+       * acconfig.h: Rebuilt
+       * include/config.h.in: Rebuilt
+
+       * java/lang/mprec.h, java/lang/e_acos.c, java/lang/e_asin.c,
+       java/lang/e_atan2.c, java/lang/e_exp.c, java/lang/e_fmod.c,
+       e_log.c, java/lang/e_pow.c, java/lang/e_rem_pio2.c,
+       java/lang/e_remainder.c, java/lang/e_sqrt.c, java/lang/fdlibm.h,
+       k_tan.c, java/lang/mprec.h, java/lang/s_atan.c,
+       java/lang/s_ceil.c, java/lang/s_copysign.c, java/lang/s_fabs.c,
+       s_floor.c, java/lang/s_rint.c, java/lang/sf_rint.c: Fixed ISO C9X
+       and namespace collision with __uint32_t
+
 1999-06-23  Tom Tromey  <tromey@cygnus.com>
 
        * java/util/zip/InflaterInputStream.java (read): Throw
index 9e98b769f2e8d3db28166589fbff305620038ecc..daddbb141027ddd66cc946ff476963adc8266adc 100644 (file)
 /* Define if you have sleep.  */
 #undef HAVE_SLEEP
 
-/* Define if you have __int32_t and __uint32_t. */
+/* Define if you have int32_t and uint32_t. */
 #undef HAVE_INT32_DEFINED
 
+/* Define if you have u_int32_t */
+#undef HAVE_BSD_INT32_DEFINED
+
 /* Define if you're running eCos. */
 #undef ECOS
 
index 53e0324e11a9ecd494e56dda23d94053a1e81a7b..563ed45f2a4538b428bcc9514325ee6beb47ae55 100755 (executable)
@@ -2707,10 +2707,10 @@ echo "$ac_t""$CPP" 1>&6
 cat > conftest.$ac_ext <<EOF
 #line 2709 "configure"
 #include "confdefs.h"
-#include <sys/types.h>
+#include <stdint.h>
 EOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "__uint32_t" >/dev/null 2>&1; then
+  egrep "uint32_t" >/dev/null 2>&1; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_INT32_DEFINED 1
@@ -2722,10 +2722,10 @@ rm -f conftest*
 cat > conftest.$ac_ext <<EOF
 #line 2724 "configure"
 #include "confdefs.h"
-#include <sys/config.h>
+#include <inttypes.h>
 EOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "__uint32_t" >/dev/null 2>&1; then
+  egrep "uint32_t" >/dev/null 2>&1; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_INT32_DEFINED 1
@@ -2734,9 +2734,40 @@ EOF
 fi
 rm -f conftest*
 
+cat > conftest.$ac_ext <<EOF
+#line 2739 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "u_int32_t" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_BSD_INT32_DEFINED 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2754 "configure"
+#include "confdefs.h"
+#include <sys/config.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "u_int32_t" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_BSD_INT32_DEFINED 1
+EOF
+
+fi
+rm -f conftest*
+
+
 
 cat > conftest.$ac_ext <<EOF
-#line 2740 "configure"
+#line 2771 "configure"
 #include "confdefs.h"
 #include <time.h>
 EOF
@@ -2751,7 +2782,7 @@ fi
 rm -f conftest*
 
 cat > conftest.$ac_ext <<EOF
-#line 2755 "configure"
+#line 2786 "configure"
 #include "confdefs.h"
 #include <time.h>
 EOF
@@ -2789,7 +2820,7 @@ ZLIBSPEC=
 libsubdir=.libs
 
 echo $ac_n "checking for garbage collector to use""... $ac_c" 1>&6
-echo "configure:2793: checking for garbage collector to use" >&5
+echo "configure:2824: checking for garbage collector to use" >&5
 # Check whether --enable-java-gc or --disable-java-gc was given.
 if test "${enable_java_gc+set}" = set; then
   enableval="$enable_java_gc"
@@ -2839,7 +2870,7 @@ esac
 
 
 echo $ac_n "checking for threads package to use""... $ac_c" 1>&6
-echo "configure:2843: checking for threads package to use" >&5
+echo "configure:2874: checking for threads package to use" >&5
 # Check whether --enable-threads or --disable-threads was given.
 if test "${enable_threads+set}" = set; then
   enableval="$enable_threads"
@@ -3031,12 +3062,12 @@ else
    for ac_func in strerror ioctl select open fsync sleep
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3035: checking for $ac_func" >&5
+echo "configure:3066: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3040 "configure"
+#line 3071 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3059,7 +3090,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3063: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3094: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3086,12 +3117,12 @@ done
    for ac_func in ctime_r ctime
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3090: checking for $ac_func" >&5
+echo "configure:3121: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3095 "configure"
+#line 3126 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3114,7 +3145,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3118: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3149: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3141,12 +3172,12 @@ done
    for ac_func in gmtime_r localtime_r readdir_r getpwuid_r
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3145: checking for $ac_func" >&5
+echo "configure:3176: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3150 "configure"
+#line 3181 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3169,7 +3200,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3173: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3204: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3196,12 +3227,12 @@ done
    for ac_func in access stat mkdir rename rmdir unlink realpath
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3200: checking for $ac_func" >&5
+echo "configure:3231: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3205 "configure"
+#line 3236 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3224,7 +3255,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3228: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3259: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3251,12 +3282,12 @@ done
    for ac_func in inet_aton inet_addr
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3255: checking for $ac_func" >&5
+echo "configure:3286: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3260 "configure"
+#line 3291 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3279,7 +3310,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3283: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3306,12 +3337,12 @@ done
    for ac_func in inet_pton uname
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3310: checking for $ac_func" >&5
+echo "configure:3341: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3315 "configure"
+#line 3346 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3334,7 +3365,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3338: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3362,12 +3393,12 @@ done
    for ac_func in gethostbyname_r
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3366: checking for $ac_func" >&5
+echo "configure:3397: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3371 "configure"
+#line 3402 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3390,7 +3421,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3394: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3425: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3417,7 +3448,7 @@ EOF
      # We look for the one that returns `int'.
      # Hopefully this check is robust enough.
      cat > conftest.$ac_ext <<EOF
-#line 3421 "configure"
+#line 3452 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 EOF
@@ -3441,12 +3472,12 @@ done
    for ac_func in gethostbyaddr_r
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3445: checking for $ac_func" >&5
+echo "configure:3476: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3450 "configure"
+#line 3481 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3469,7 +3500,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3473: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3504: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3496,7 +3527,7 @@ EOF
      # We look for the one that returns `int'.
      # Hopefully this check is robust enough.
      cat > conftest.$ac_ext <<EOF
-#line 3500 "configure"
+#line 3531 "configure"
 #include "confdefs.h"
 #include <netdb.h>
 EOF
@@ -3520,12 +3551,12 @@ done
    for ac_func in gethostname
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3524: checking for $ac_func" >&5
+echo "configure:3555: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3529 "configure"
+#line 3560 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3548,7 +3579,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3552: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3572,7 +3603,7 @@ EOF
 EOF
 
      cat > conftest.$ac_ext <<EOF
-#line 3576 "configure"
+#line 3607 "configure"
 #include "confdefs.h"
 #include <unistd.h>
 EOF
@@ -3599,12 +3630,12 @@ done
    for ac_func in pthread_mutexattr_settype pthread_mutexattr_setkind_np sched_yield
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3603: checking for $ac_func" >&5
+echo "configure:3634: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3608 "configure"
+#line 3639 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3627,7 +3658,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3631: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3662: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3655,12 +3686,12 @@ done
    for ac_func in sched_yield
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3659: checking for $ac_func" >&5
+echo "configure:3690: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3664 "configure"
+#line 3695 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3683,7 +3714,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3687: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3718: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3705,7 +3736,7 @@ EOF
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for sched_yield in -lposix4""... $ac_c" 1>&6
-echo "configure:3709: checking for sched_yield in -lposix4" >&5
+echo "configure:3740: checking for sched_yield in -lposix4" >&5
 ac_lib_var=`echo posix4'_'sched_yield | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3713,7 +3744,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lposix4  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3717 "configure"
+#line 3748 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3724,7 +3755,7 @@ int main() {
 sched_yield()
 ; return 0; }
 EOF
-if { (eval echo configure:3728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3759: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3759,12 +3790,12 @@ done
    for ac_func in gettimeofday time ftime
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3763: checking for $ac_func" >&5
+echo "configure:3794: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3768 "configure"
+#line 3799 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3787,7 +3818,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3791: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3822: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3820,12 +3851,12 @@ done
    for ac_func in memmove
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3824: checking for $ac_func" >&5
+echo "configure:3855: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3829 "configure"
+#line 3860 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3848,7 +3879,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3852: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3883: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3881,12 +3912,12 @@ done
    for ac_func in memcpy
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:3885: checking for $ac_func" >&5
+echo "configure:3916: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3890 "configure"
+#line 3921 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -3909,7 +3940,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3944: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -3957,7 +3988,7 @@ done
    #--------------------------------------------------------------------
 
    echo $ac_n "checking for socket libraries""... $ac_c" 1>&6
-echo "configure:3961: checking for socket libraries" >&5
+echo "configure:3992: checking for socket libraries" >&5
 if eval "test \"`echo '$''{'gcj_cv_lib_sockets'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3965,12 +3996,12 @@ else
      gcj_checkBoth=0
      unset ac_cv_func_connect
      echo $ac_n "checking for connect""... $ac_c" 1>&6
-echo "configure:3969: checking for connect" >&5
+echo "configure:4000: checking for connect" >&5
 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3974 "configure"
+#line 4005 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char connect(); below.  */
@@ -3993,7 +4024,7 @@ connect();
 
 ; return 0; }
 EOF
-if { (eval echo configure:3997: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4028: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_connect=yes"
 else
@@ -4016,7 +4047,7 @@ fi
      if test "$gcj_checkSocket" = 1; then
         unset ac_cv_func_connect
         echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6
-echo "configure:4020: checking for main in -lsocket" >&5
+echo "configure:4051: checking for main in -lsocket" >&5
 ac_lib_var=`echo socket'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4024,14 +4055,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lsocket  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4028 "configure"
+#line 4059 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:4035: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4058,12 +4089,12 @@ fi
         LIBS="$LIBS -lsocket -lnsl"
         unset ac_cv_func_accept
         echo $ac_n "checking for accept""... $ac_c" 1>&6
-echo "configure:4062: checking for accept" >&5
+echo "configure:4093: checking for accept" >&5
 if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4067 "configure"
+#line 4098 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char accept(); below.  */
@@ -4086,7 +4117,7 @@ accept();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4090: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4121: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_accept=yes"
 else
@@ -4113,12 +4144,12 @@ fi
      gcj_oldLibs=$LIBS
      LIBS="$LIBS $gcj_cv_lib_sockets"
      echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
-echo "configure:4117: checking for gethostbyname" >&5
+echo "configure:4148: checking for gethostbyname" >&5
 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4122 "configure"
+#line 4153 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char gethostbyname(); below.  */
@@ -4141,7 +4172,7 @@ gethostbyname();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4176: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_gethostbyname=yes"
 else
@@ -4159,7 +4190,7 @@ if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
 else
   echo "$ac_t""no" 1>&6
 echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6
-echo "configure:4163: checking for main in -lnsl" >&5
+echo "configure:4194: checking for main in -lnsl" >&5
 ac_lib_var=`echo nsl'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4167,14 +4198,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lnsl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4171 "configure"
+#line 4202 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:4178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4209: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4206,7 +4237,7 @@ echo "$ac_t""$gcj_cv_lib_sockets" 1>&6
 
    if test "$with_system_zlib" = yes; then
       echo $ac_n "checking for deflate in -lz""... $ac_c" 1>&6
-echo "configure:4210: checking for deflate in -lz" >&5
+echo "configure:4241: checking for deflate in -lz" >&5
 ac_lib_var=`echo z'_'deflate | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4214,7 +4245,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lz  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4218 "configure"
+#line 4249 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4225,7 +4256,7 @@ int main() {
 deflate()
 ; return 0; }
 EOF
-if { (eval echo configure:4229: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4260: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4254,7 +4285,7 @@ fi
    # requires -ldl.
    if test "$GC" = boehm; then
       echo $ac_n "checking for main in -ldl""... $ac_c" 1>&6
-echo "configure:4258: checking for main in -ldl" >&5
+echo "configure:4289: checking for main in -ldl" >&5
 ac_lib_var=`echo dl'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4262,14 +4293,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-ldl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4266 "configure"
+#line 4297 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:4273: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4374,21 +4405,21 @@ EOF
 
 
 
-for ac_hdr in unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h
+for ac_hdr in unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4382: checking for $ac_hdr" >&5
+echo "configure:4413: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4387 "configure"
+#line 4418 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4392: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4423: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4418,17 +4449,17 @@ for ac_hdr in dirent.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4422: checking for $ac_hdr" >&5
+echo "configure:4453: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4427 "configure"
+#line 4458 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4463: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4456,16 +4487,16 @@ done
 
 
 echo $ac_n "checking whether struct sockaddr_in6 is in netinet/in.h""... $ac_c" 1>&6
-echo "configure:4460: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
+echo "configure:4491: checking whether struct sockaddr_in6 is in netinet/in.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 4462 "configure"
+#line 4493 "configure"
 #include "confdefs.h"
 #include <netinet/in.h>
 int main() {
 struct sockaddr_in6 addr6;
 ; return 0; }
 EOF
-if { (eval echo configure:4469: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4500: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_INET6 1
@@ -4481,16 +4512,16 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking for socklen_t in sys/socket.h""... $ac_c" 1>&6
-echo "configure:4485: checking for socklen_t in sys/socket.h" >&5
+echo "configure:4516: checking for socklen_t in sys/socket.h" >&5
 cat > conftest.$ac_ext <<EOF
-#line 4487 "configure"
+#line 4518 "configure"
 #include "confdefs.h"
 #include <sys/socket.h>
 int main() {
 socklen_t x = 5;
 ; return 0; }
 EOF
-if { (eval echo configure:4494: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4525: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_SOCKLEN_T 1
@@ -4506,16 +4537,16 @@ fi
 rm -f conftest*
 
 echo $ac_n "checking for tm_gmtoff in struct tm""... $ac_c" 1>&6
-echo "configure:4510: checking for tm_gmtoff in struct tm" >&5
+echo "configure:4541: checking for tm_gmtoff in struct tm" >&5
 cat > conftest.$ac_ext <<EOF
-#line 4512 "configure"
+#line 4543 "configure"
 #include "confdefs.h"
 #include <time.h>
 int main() {
 struct tm tim; tim.tm_gmtoff = 0;
 ; return 0; }
 EOF
-if { (eval echo configure:4519: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4550: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define STRUCT_TM_HAS_GMTOFF 1
@@ -4528,16 +4559,16 @@ else
   rm -rf conftest*
   echo "$ac_t""no" 1>&6
    echo $ac_n "checking for global timezone variable""... $ac_c" 1>&6
-echo "configure:4532: checking for global timezone variable" >&5
+echo "configure:4563: checking for global timezone variable" >&5
             cat > conftest.$ac_ext <<EOF
-#line 4534 "configure"
+#line 4565 "configure"
 #include "confdefs.h"
 #include <time.h>
 int main() {
 long z2 = timezone;
 ; return 0; }
 EOF
-if { (eval echo configure:4541: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:4572: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   cat >> confdefs.h <<\EOF
 #define HAVE_TIMEZONE 1
@@ -4557,19 +4588,19 @@ rm -f conftest*
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:4561: checking for working alloca.h" >&5
+echo "configure:4592: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4566 "configure"
+#line 4597 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:4573: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4604: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -4590,12 +4621,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:4594: checking for alloca" >&5
+echo "configure:4625: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4599 "configure"
+#line 4630 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -4623,7 +4654,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:4627: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4658: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -4655,12 +4686,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:4659: checking whether alloca needs Cray hooks" >&5
+echo "configure:4690: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4664 "configure"
+#line 4695 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -4685,12 +4716,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4689: checking for $ac_func" >&5
+echo "configure:4720: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4694 "configure"
+#line 4725 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4713,7 +4744,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4748: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4740,7 +4771,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:4744: checking stack direction for C alloca" >&5
+echo "configure:4775: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4748,7 +4779,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 4752 "configure"
+#line 4783 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -4767,7 +4798,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:4771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4802: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -4794,7 +4825,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4798: checking for $ac_word" >&5
+echo "configure:4829: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_PERL'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
index 4e7b63b33161ee4166bc960f2a1000cf8d4b152b..9ba86e5a3277c0ed0e06e741c1043aed02d7e655 100644 (file)
@@ -1,7 +1,7 @@
 dnl Process this with autoconf to create configure
 AC_INIT(java/lang/System.java)
 
-dnl Can't be done in LIBGCJ_CONFIGURE because that confuses automake. 
+dnl Can't be done in LIBGCJ_CONFIGURE because that confuses automake.
 AC_CONFIG_AUX_DIR(..)
 
 AC_CANONICAL_SYSTEM
@@ -64,8 +64,11 @@ case "$TARGET_ECOS" in
       ;;
 esac
 
-AC_EGREP_HEADER(__uint32_t, sys/types.h, AC_DEFINE(HAVE_INT32_DEFINED))
-AC_EGREP_HEADER(__uint32_t, sys/config.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(uint32_t, stdint.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(uint32_t, inttypes.h, AC_DEFINE(HAVE_INT32_DEFINED))
+AC_EGREP_HEADER(u_int32_t, sys/types.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
+AC_EGREP_HEADER(u_int32_t, sys/config.h, AC_DEFINE(HAVE_BSD_INT32_DEFINED))
+
 
 dnl These may not be defined in a non-ANS conformant embedded system.
 dnl FIXME: Should these case a runtime exception in that case?
@@ -466,7 +469,7 @@ AC_SUBST(AM_RUNTESTFLAGS)
 dnl We check for sys/filio.h because Solaris 2.5 defines FIONREAD there.
 dnl On that system, sys/ioctl.h will not include sys/filio.h unless
 dnl BSD_COMP is defined; just including sys/filio.h is simpler.
-AC_CHECK_HEADERS(unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h)
+AC_CHECK_HEADERS(unistd.h sys/time.h sys/types.h fcntl.h sys/ioctl.h sys/filio.h sys/stat.h sys/select.h sys/socket.h netinet/in.h arpa/inet.h netdb.h pwd.h sys/config.h inttypes.h stdint.h)
 dnl We avoid AC_HEADER_DIRENT since we really only care about dirent.h
 dnl for now.  If you change this, you also must update natFile.cc.
 AC_CHECK_HEADERS(dirent.h)
index c4acd69299f61e1db3bf0ba9a46f267df525871d..be94a759c0db26620ecdc230b111964c29bc6051 100644 (file)
 /* Define if you have strerror.  */
 #undef HAVE_STRERROR
 
-/* Define if you have __int32_t and __uint32_t. */
+/* Define if you have int32_t and uint32_t. */
 #undef HAVE_INT32_DEFINED
 
+/* Define if you have u_int32_t */
+#undef HAVE_BSD_INT32_DEFINED
+
 /* Define if you're running eCos. */
 #undef ECOS
 
 /* Define if you have the <fcntl.h> header file.  */
 #undef HAVE_FCNTL_H
 
+/* Define if you have the <inttypes.h> header file.  */
+#undef HAVE_INTTYPES_H
+
 /* Define if you have the <netdb.h> header file.  */
 #undef HAVE_NETDB_H
 
 /* Define if you have the <pwd.h> header file.  */
 #undef HAVE_PWD_H
 
+/* Define if you have the <stdint.h> header file.  */
+#undef HAVE_STDINT_H
+
+/* Define if you have the <sys/config.h> header file.  */
+#undef HAVE_SYS_CONFIG_H
+
 /* Define if you have the <sys/filio.h> header file.  */
 #undef HAVE_SYS_FILIO_H
 
index fae45c5aeb48ec660da7a244296d56eb0f1fc7a6..c55415413b1dad45df08058675ec6a36619bc09c 100644 (file)
@@ -1,906 +1,3 @@
-/****************************************************************
- *
- * The author of this software is David M. Gay.
- *
- * Copyright (c) 1991 by AT&T.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- ***************************************************************/
-
-/* Please send bug reports to
-       David M. Gay
-       AT&T Bell Laboratories, Room 2C-463
-       600 Mountain Avenue
-       Murray Hill, NJ 07974-2070
-       U.S.A.
-       dmg@research.att.com or research!dmg
- */
-
-#include "mprec.h"
-
-static int
-_DEFUN (quorem,
-       (b, S),
-       _Jv_Bigint * b _AND _Jv_Bigint * S)
-{
-  int n;
-  long borrow, y;
-  unsigned long carry, q, ys;
-  unsigned long *bx, *bxe, *sx, *sxe;
-#ifdef Pack_32
-  long z;
-  unsigned long si, zs;
-#endif
-
-  n = S->_wds;
-#ifdef DEBUG
-  /*debug*/ if (b->_wds > n)
-    /*debug*/ Bug ("oversize b in quorem");
-#endif
-  if (b->_wds < n)
-    return 0;
-  sx = S->_x;
-  sxe = sx + --n;
-  bx = b->_x;
-  bxe = bx + n;
-  q = *bxe / (*sxe + 1);       /* ensure q <= true quotient */
-#ifdef DEBUG
-  /*debug*/ if (q > 9)
-    /*debug*/ Bug ("oversized quotient in quorem");
-#endif
-  if (q)
-    {
-      borrow = 0;
-      carry = 0;
-      do
-       {
-#ifdef Pack_32
-         si = *sx++;
-         ys = (si & 0xffff) * q + carry;
-         zs = (si >> 16) * q + (ys >> 16);
-         carry = zs >> 16;
-         y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
-         borrow = y >> 16;
-         Sign_Extend (borrow, y);
-         z = (*bx >> 16) - (zs & 0xffff) + borrow;
-         borrow = z >> 16;
-         Sign_Extend (borrow, z);
-         Storeinc (bx, z, y);
-#else
-         ys = *sx++ * q + carry;
-         carry = ys >> 16;
-         y = *bx - (ys & 0xffff) + borrow;
-         borrow = y >> 16;
-         Sign_Extend (borrow, y);
-         *bx++ = y & 0xffff;
-#endif
-       }
-      while (sx <= sxe);
-      if (!*bxe)
-       {
-         bx = b->_x;
-         while (--bxe > bx && !*bxe)
-           --n;
-         b->_wds = n;
-       }
-    }
-  if (cmp (b, S) >= 0)
-    {
-      q++;
-      borrow = 0;
-      carry = 0;
-      bx = b->_x;
-      sx = S->_x;
-      do
-       {
-#ifdef Pack_32
-         si = *sx++;
-         ys = (si & 0xffff) + carry;
-         zs = (si >> 16) + (ys >> 16);
-         carry = zs >> 16;
-         y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
-         borrow = y >> 16;
-         Sign_Extend (borrow, y);
-         z = (*bx >> 16) - (zs & 0xffff) + borrow;
-         borrow = z >> 16;
-         Sign_Extend (borrow, z);
-         Storeinc (bx, z, y);
-#else
-         ys = *sx++ + carry;
-         carry = ys >> 16;
-         y = *bx - (ys & 0xffff) + borrow;
-         borrow = y >> 16;
-         Sign_Extend (borrow, y);
-         *bx++ = y & 0xffff;
-#endif
-       }
-      while (sx <= sxe);
-      bx = b->_x;
-      bxe = bx + n;
-      if (!*bxe)
-       {
-         while (--bxe > bx && !*bxe)
-           --n;
-         b->_wds = n;
-       }
-    }
-  return q;
-}
-
-#ifdef DEBUG
-#include <stdio.h>
-
-void
-print (_Jv_Bigint * b)
-{
-  int i, wds;
-  unsigned long *x, y;
-  wds = b->_wds;
-  x = b->_x+wds;
-  i = 0;
-  do
-    {
-      x--;
-      fprintf (stderr, "%08x", *x);
-    }
-  while (++i < wds);
-  fprintf (stderr, "\n");
-}
-#endif
-
-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
- *
- * Inspired by "How to Print Floating-Point Numbers Accurately" by
- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- *     1. Rather than iterating, we use a simple numeric overestimate
- *        to determine k = floor(log10(d)).  We scale relevant
- *        quantities using O(log2(k)) rather than O(k) multiplications.
- *     2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
- *        try to generate digits strictly left to right.  Instead, we
- *        compute with fewer bits and propagate the carry if necessary
- *        when rounding the final digit up.  This is often faster.
- *     3. Under the assumption that input will be rounded nearest,
- *        mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
- *        That is, we allow equality in stopping tests when the
- *        round-nearest rule will give the same floating-point value
- *        as would satisfaction of the stopping test with strict
- *        inequality.
- *     4. We remove common factors of powers of 2 from relevant
- *        quantities.
- *     5. When converting floating-point integers less than 1e16,
- *        we use floating-point arithmetic rather than resorting
- *        to multiple-precision integers.
- *     6. When asked to produce fewer than 15 digits, we first try
- *        to get by with floating-point arithmetic; we resort to
- *        multiple-precision integer arithmetic only if we cannot
- *        guarantee that the floating-point calculation has given
- *        the correctly rounded result.  For k requested digits and
- *        "uniformly" distributed input, the probability is
- *        something like 10^(k-15) that we must resort to the long
- *        calculation.
- */
-
-
-char *
-_DEFUN (_dtoa_r,
-       (ptr, _d, mode, ndigits, decpt, sign, rve, float_type),
-       struct _Jv_reent *ptr _AND
-       double _d _AND
-       int mode _AND
-       int ndigits _AND
-       int *decpt _AND
-       int *sign _AND
-       char **rve _AND
-       int float_type)
-{
-  /*   
-       float_type == 0 for double precision, 1 for float.
-
-       Arguments ndigits, decpt, sign are similar to those
-       of ecvt and fcvt; trailing zeros are suppressed from
-       the returned string.  If not null, *rve is set to point
-       to the end of the return value.  If d is +-Infinity or NaN,
-       then *decpt is set to 9999.
-
-       mode:
-               0 ==> shortest string that yields d when read in
-                       and rounded to nearest.
-               1 ==> like 0, but with Steele & White stopping rule;
-                       e.g. with IEEE P754 arithmetic , mode 0 gives
-                       1e23 whereas mode 1 gives 9.999999999999999e22.
-               2 ==> max(1,ndigits) significant digits.  This gives a
-                       return value similar to that of ecvt, except
-                       that trailing zeros are suppressed.
-               3 ==> through ndigits past the decimal point.  This
-                       gives a return value similar to that from fcvt,
-                       except that trailing zeros are suppressed, and
-                       ndigits can be negative.
-               4-9 should give the same return values as 2-3, i.e.,
-                       4 <= mode <= 9 ==> same return as mode
-                       2 + (mode & 1).  These modes are mainly for
-                       debugging; often they run slower but sometimes
-                       faster than modes 2-3.
-               4,5,8,9 ==> left-to-right digit generation.
-               6-9 ==> don't try fast floating-point estimate
-                       (if applicable).
-
-               > 16 ==> Floating-point arg is treated as single precision.
-
-               Values of mode other than 0-9 are treated as mode 0.
-
-               Sufficient space is allocated to the return value
-               to hold the suppressed trailing zeros.
-       */
-
-  int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0,
-    k_check, leftright, m2, m5, s2, s5, spec_case, try_quick;
-  union double_union d, d2, eps;
-  long L;
-#ifndef Sudden_Underflow
-  int denorm;
-  unsigned long x;
-#endif
-  _Jv_Bigint *b, *b1, *delta, *mlo, *mhi, *S;
-  double ds;
-  char *s, *s0;
-
-  d.d = _d;
-
-  if (ptr->_result)
-    {
-      ptr->_result->_k = ptr->_result_k;
-      ptr->_result->_maxwds = 1 << ptr->_result_k;
-      Bfree (ptr, ptr->_result);
-      ptr->_result = 0;
-    }
-
-  if (word0 (d) & Sign_bit)
-    {
-      /* set sign for everything, including 0's and NaNs */
-      *sign = 1;
-      word0 (d) &= ~Sign_bit;  /* clear sign bit */
-    }
-  else
-    *sign = 0;
-
-#if defined(IEEE_Arith) + defined(VAX)
-#ifdef IEEE_Arith
-  if ((word0 (d) & Exp_mask) == Exp_mask)
-#else
-  if (word0 (d) == 0x8000)
-#endif
-    {
-      /* Infinity or NaN */
-      *decpt = 9999;
-      s =
-#ifdef IEEE_Arith
-       !word1 (d) && !(word0 (d) & 0xfffff) ? "Infinity" :
-#endif
-       "NaN";
-      if (rve)
-       *rve =
-#ifdef IEEE_Arith
-         s[3] ? s + 8 :
-#endif
-         s + 3;
-      return s;
-    }
-#endif
-#ifdef IBM
-  d.d += 0;                    /* normalize */
-#endif
-  if (!d.d)
-    {
-      *decpt = 1;
-      s = "0";
-      if (rve)
-       *rve = s + 1;
-      return s;
-    }
-
-  b = d2b (ptr, d.d, &be, &bbits);
-#ifdef Sudden_Underflow
-  i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
-#else
-  if ((i = (int) (word0 (d) >> Exp_shift1 & (Exp_mask >> Exp_shift1))))
-    {
-#endif
-      d2.d = d.d;
-      word0 (d2) &= Frac_mask1;
-      word0 (d2) |= Exp_11;
-#ifdef IBM
-      if (j = 11 - hi0bits (word0 (d2) & Frac_mask))
-       d2.d /= 1 << j;
-#endif
-
-      /* log(x)        ~=~ log(1.5) + (x-1.5)/1.5
-                * log10(x)      =  log(x) / log(10)
-                *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
-                * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
-                *
-                * This suggests computing an approximation k to log10(d) by
-                *
-                * k = (i - Bias)*0.301029995663981
-                *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
-                *
-                * We want k to be too large rather than too small.
-                * The error in the first-order Taylor series approximation
-                * is in our favor, so we just round up the constant enough
-                * to compensate for any error in the multiplication of
-                * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
-                * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
-                * adding 1e-13 to the constant term more than suffices.
-                * Hence we adjust the constant term to 0.1760912590558.
-                * (We could get a more accurate k by invoking log10,
-                *  but this is probably not worthwhile.)
-                */
-
-      i -= Bias;
-#ifdef IBM
-      i <<= 2;
-      i += j;
-#endif
-#ifndef Sudden_Underflow
-      denorm = 0;
-    }
-  else
-    {
-      /* d is denormalized */
-
-      i = bbits + be + (Bias + (P - 1) - 1);
-      x = i > 32 ? word0 (d) << (64 - i) | word1 (d) >> (i - 32)
-       : word1 (d) << (32 - i);
-      d2.d = x;
-      word0 (d2) -= 31 * Exp_msk1;     /* adjust exponent */
-      i -= (Bias + (P - 1) - 1) + 1;
-      denorm = 1;
-    }
-#endif
-  ds = (d2.d - 1.5) * 0.289529654602168 + 0.1760912590558 + i * 0.301029995663981;
-  k = (int) ds;
-  if (ds < 0. && ds != k)
-    k--;                       /* want k = floor(ds) */
-  k_check = 1;
-  if (k >= 0 && k <= Ten_pmax)
-    {
-      if (d.d < tens[k])
-       k--;
-      k_check = 0;
-    }
-  j = bbits - i - 1;
-  if (j >= 0)
-    {
-      b2 = 0;
-      s2 = j;
-    }
-  else
-    {
-      b2 = -j;
-      s2 = 0;
-    }
-  if (k >= 0)
-    {
-      b5 = 0;
-      s5 = k;
-      s2 += k;
-    }
-  else
-    {
-      b2 -= k;
-      b5 = -k;
-      s5 = 0;
-    }
-  if (mode < 0 || mode > 9)
-    mode = 0;
-  try_quick = 1;
-  if (mode > 5)
-    {
-      mode -= 4;
-      try_quick = 0;
-    }
-  leftright = 1;
-  switch (mode)
-    {
-    case 0:
-    case 1:
-      ilim = ilim1 = -1;
-      i = 18;
-      ndigits = 0;
-      break;
-    case 2:
-      leftright = 0;
-      /* no break */
-    case 4:
-      if (ndigits <= 0)
-       ndigits = 1;
-      ilim = ilim1 = i = ndigits;
-      break;
-    case 3:
-      leftright = 0;
-      /* no break */
-    case 5:
-      i = ndigits + k + 1;
-      ilim = i;
-      ilim1 = i - 1;
-      if (i <= 0)
-       i = 1;
-    }
-  j = sizeof (unsigned long);
-  for (ptr->_result_k = 0; (int) (sizeof (_Jv_Bigint) - sizeof (unsigned long)) + j <= i;
-       j <<= 1)
-    ptr->_result_k++;
-  ptr->_result = Balloc (ptr, ptr->_result_k);
-  s = s0 = (char *) ptr->_result;
-
-  if (ilim >= 0 && ilim <= Quick_max && try_quick)
-    {
-      /* Try to get by with floating-point arithmetic. */
-
-      i = 0;
-      d2.d = d.d;
-      k0 = k;
-      ilim0 = ilim;
-      ieps = 2;                        /* conservative */
-      if (k > 0)
-       {
-         ds = tens[k & 0xf];
-         j = k >> 4;
-         if (j & Bletch)
-           {
-             /* prevent overflows */
-             j &= Bletch - 1;
-             d.d /= bigtens[n_bigtens - 1];
-             ieps++;
-           }
-         for (; j; j >>= 1, i++)
-           if (j & 1)
-             {
-               ieps++;
-               ds *= bigtens[i];
-             }
-         d.d /= ds;
-       }
-      else if ((j1 = -k))
-       {
-         d.d *= tens[j1 & 0xf];
-         for (j = j1 >> 4; j; j >>= 1, i++)
-           if (j & 1)
-             {
-               ieps++;
-               d.d *= bigtens[i];
-             }
-       }
-      if (k_check && d.d < 1. && ilim > 0)
-       {
-         if (ilim1 <= 0)
-           goto fast_failed;
-         ilim = ilim1;
-         k--;
-         d.d *= 10.;
-         ieps++;
-       }
-      eps.d = ieps * d.d + 7.;
-      word0 (eps) -= (P - 1) * Exp_msk1;
-      if (ilim == 0)
-       {
-         S = mhi = 0;
-         d.d -= 5.;
-         if (d.d > eps.d)
-           goto one_digit;
-         if (d.d < -eps.d)
-           goto no_digits;
-         goto fast_failed;
-       }
-#ifndef No_leftright
-      if (leftright)
-       {
-         /* Use Steele & White method of only
-          * generating digits needed.
-          */
-         eps.d = 0.5 / tens[ilim - 1] - eps.d;
-         for (i = 0;;)
-           {
-             L = d.d;
-             d.d -= L;
-             *s++ = '0' + (int) L;
-             if (d.d < eps.d)
-               goto ret1;
-             if (1. - d.d < eps.d)
-               goto bump_up;
-             if (++i >= ilim)
-               break;
-             eps.d *= 10.;
-             d.d *= 10.;
-           }
-       }
-      else
-       {
-#endif
-         /* Generate ilim digits, then fix them up. */
-         eps.d *= tens[ilim - 1];
-         for (i = 1;; i++, d.d *= 10.)
-           {
-             L = d.d;
-             d.d -= L;
-             *s++ = '0' + (int) L;
-             if (i == ilim)
-               {
-                 if (d.d > 0.5 + eps.d)
-                   goto bump_up;
-                 else if (d.d < 0.5 - eps.d)
-                   {
-                     while (*--s == '0');
-                     s++;
-                     goto ret1;
-                   }
-                 break;
-               }
-           }
-#ifndef No_leftright
-       }
-#endif
-    fast_failed:
-      s = s0;
-      d.d = d2.d;
-      k = k0;
-      ilim = ilim0;
-    }
-
-  /* Do we have a "small" integer? */
-
-  if (be >= 0 && k <= Int_max)
-    {
-      /* Yes. */
-      ds = tens[k];
-      if (ndigits < 0 && ilim <= 0)
-       {
-         S = mhi = 0;
-         if (ilim < 0 || d.d <= 5 * ds)
-           goto no_digits;
-         goto one_digit;
-       }
-      for (i = 1;; i++)
-       {
-         L = d.d / ds;
-         d.d -= L * ds;
-#ifdef Check_FLT_ROUNDS
-         /* If FLT_ROUNDS == 2, L will usually be high by 1 */
-         if (d.d < 0)
-           {
-             L--;
-             d.d += ds;
-           }
-#endif
-         *s++ = '0' + (int) L;
-         if (i == ilim)
-           {
-             d.d += d.d;
-             if (d.d > ds || (d.d == ds && L & 1))
-               {
-               bump_up:
-                 while (*--s == '9')
-                   if (s == s0)
-                     {
-                       k++;
-                       *s = '0';
-                       break;
-                     }
-                 ++*s++;
-               }
-             break;
-           }
-         if (!(d.d *= 10.))
-           break;
-       }
-      goto ret1;
-    }
-
-  m2 = b2;
-  m5 = b5;
-  mhi = mlo = 0;
-  if (leftright)
-    {
-      if (mode < 2)
-       {
-         i =
-#ifndef Sudden_Underflow
-           denorm ? be + (Bias + (P - 1) - 1 + 1) :
-#endif
-#ifdef IBM
-           1 + 4 * P - 3 - bbits + ((bbits + be - 1) & 3);
-#else
-           1 + P - bbits;
-#endif
-       }
-      else
-       {
-         j = ilim - 1;
-         if (m5 >= j)
-           m5 -= j;
-         else
-           {
-             s5 += j -= m5;
-             b5 += j;
-             m5 = 0;
-           }
-         if ((i = ilim) < 0)
-           {
-             m2 -= i;
-             i = 0;
-           }
-       }
-      b2 += i;
-      s2 += i;
-      mhi = i2b (ptr, 1);
-    }
-  if (m2 > 0 && s2 > 0)
-    {
-      i = m2 < s2 ? m2 : s2;
-      b2 -= i;
-      m2 -= i;
-      s2 -= i;
-    }
-  if (b5 > 0)
-    {
-      if (leftright)
-       {
-         if (m5 > 0)
-           {
-             mhi = pow5mult (ptr, mhi, m5);
-             b1 = mult (ptr, mhi, b);
-             Bfree (ptr, b);
-             b = b1;
-           }
-         if ((j = b5 - m5))
-           b = pow5mult (ptr, b, j);
-       }
-      else
-       b = pow5mult (ptr, b, b5);
-    }
-  S = i2b (ptr, 1);
-  if (s5 > 0)
-    S = pow5mult (ptr, S, s5);
-
-  /* Check for special case that d is a normalized power of 2. */
-
-  if (mode < 2)
-    {
-      if (!word1 (d) && !(word0 (d) & Bndry_mask)
-#ifndef Sudden_Underflow
-         && word0 (d) & Exp_mask
-#endif
-       )
-       {
-         /* The special case */
-         b2 += Log2P;
-         s2 += Log2P;
-         spec_case = 1;
-       }
-      else
-       spec_case = 0;
-    }
-
-  /* Arrange for convenient computation of quotients:
-   * shift left if necessary so divisor has 4 leading 0 bits.
-   *
-   * Perhaps we should just compute leading 28 bits of S once
-   * and for all and pass them and a shift to quorem, so it
-   * can do shifts and ors to compute the numerator for q.
-   */
-
-#ifdef Pack_32
-  if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0x1f))
-    i = 32 - i;
-#else
-  if ((i = ((s5 ? 32 - hi0bits (S->_x[S->_wds - 1]) : 1) + s2) & 0xf))
-    i = 16 - i;
-#endif
-  if (i > 4)
-    {
-      i -= 4;
-      b2 += i;
-      m2 += i;
-      s2 += i;
-    }
-  else if (i < 4)
-    {
-      i += 28;
-      b2 += i;
-      m2 += i;
-      s2 += i;
-    }
-  if (b2 > 0)
-    b = lshift (ptr, b, b2);
-  if (s2 > 0)
-    S = lshift (ptr, S, s2);
-  if (k_check)
-    {
-      if (cmp (b, S) < 0)
-       {
-         k--;
-         b = multadd (ptr, b, 10, 0);  /* we botched the k estimate */
-         if (leftright)
-           mhi = multadd (ptr, mhi, 10, 0);
-         ilim = ilim1;
-       }
-    }
-  if (ilim <= 0 && mode > 2)
-    {
-      if (ilim < 0 || cmp (b, S = multadd (ptr, S, 5, 0)) <= 0)
-       {
-         /* no digits, fcvt style */
-       no_digits:
-         k = -1 - ndigits;
-         goto ret;
-       }
-    one_digit:
-      *s++ = '1';
-      k++;
-      goto ret;
-    }
-  if (leftright)
-    {
-      if (m2 > 0)
-       mhi = lshift (ptr, mhi, m2);
-
-      /* Single precision case, */
-      if (float_type)
-       mhi = lshift (ptr, mhi, 29);
-
-      /* Compute mlo -- check for special case
-       * that d is a normalized power of 2.
-       */
-
-      mlo = mhi;
-      if (spec_case)
-       {
-         mhi = Balloc (ptr, mhi->_k);
-         Bcopy (mhi, mlo);
-         mhi = lshift (ptr, mhi, Log2P);
-       }
-
-      for (i = 1;; i++)
-       {
-         dig = quorem (b, S) + '0';
-         /* Do we yet have the shortest decimal string
-          * that will round to d?
-          */
-         j = cmp (b, mlo);
-         delta = diff (ptr, S, mhi);
-         j1 = delta->_sign ? 1 : cmp (b, delta);
-         Bfree (ptr, delta);
-#ifndef ROUND_BIASED
-         if (j1 == 0 && !mode && !(word1 (d) & 1))
-           {
-             if (dig == '9')
-               goto round_9_up;
-             if (j > 0)
-               dig++;
-             *s++ = dig;
-             goto ret;
-           }
-#endif
-         if (j < 0 || (j == 0 && !mode
-#ifndef ROUND_BIASED
-             && !(word1 (d) & 1)
-#endif
-           ))
-           {
-             if (j1 > 0)
-               {
-                 b = lshift (ptr, b, 1);
-                 j1 = cmp (b, S);
-                 if ((j1 > 0 || (j1 == 0 && dig & 1))
-                     && dig++ == '9')
-                   goto round_9_up;
-               }
-             *s++ = dig;
-             goto ret;
-           }
-         if (j1 > 0)
-           {
-             if (dig == '9')
-               {               /* possible if i == 1 */
-               round_9_up:
-                 *s++ = '9';
-                 goto roundoff;
-               }
-             *s++ = dig + 1;
-             goto ret;
-           }
-         *s++ = dig;
-         if (i == ilim)
-           break;
-         b = multadd (ptr, b, 10, 0);
-         if (mlo == mhi)
-           mlo = mhi = multadd (ptr, mhi, 10, 0);
-         else
-           {
-             mlo = multadd (ptr, mlo, 10, 0);
-             mhi = multadd (ptr, mhi, 10, 0);
-           }
-       }
-    }
-  else
-    for (i = 1;; i++)
-      {
-       *s++ = dig = quorem (b, S) + '0';
-       if (i >= ilim)
-         break;
-       b = multadd (ptr, b, 10, 0);
-      }
-
-  /* Round off last digit */
-
-  b = lshift (ptr, b, 1);
-  j = cmp (b, S);
-  if (j > 0 || (j == 0 && dig & 1))
-    {
-    roundoff:
-      while (*--s == '9')
-       if (s == s0)
-         {
-           k++;
-           *s++ = '1';
-           goto ret;
-         }
-      ++*s++;
-    }
-  else
-    {
-      while (*--s == '0');
-      s++;
-    }
-ret:
-  Bfree (ptr, S);
-  if (mhi)
-    {
-      if (mlo && mlo != mhi)
-       Bfree (ptr, mlo);
-      Bfree (ptr, mhi);
-    }
-ret1:
-  Bfree (ptr, b);
-  *s = 0;
-  *decpt = k + 1;
-  if (rve)
-    *rve = s;
-  return s0;
-}
-
-
-_VOID
-_DEFUN (_dtoa,
-       (_d, mode, ndigits, decpt, sign, rve, buf, float_type),
-       double _d _AND
-       int mode _AND
-       int ndigits _AND
-       int *decpt _AND
-       int *sign _AND
-       char **rve _AND
-       char *buf _AND
-       int float_type)
-{
-  struct _Jv_reent reent;  
-  char *p;
-  memset (&reent, 0, sizeof reent);
-
-  p = _dtoa_r (&reent, _d, mode, ndigits, decpt, sign, rve, float_type);
-  strcpy (buf, p);
-
-  return;
-}
-
-  
+  /*
+         && word0(d) & Exp_mask
+  struct _Jv_reent reent;
index 319b1d56fa097cf9e1df2115f58ee5de98e20b54..ded6cbb2f970bc4a067beee0a8d0c30c3279adaf 100644 (file)
@@ -1,111 +1,7 @@
-
-/* @(#)e_acos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* __ieee754_acos(x)
- * Method :                  
- *     acos(x)  = pi/2 - asin(x)
- *     acos(-x) = pi/2 + asin(x)
- * For |x|<=0.5
- *     acos(x) = pi/2 - (x + x*x^2*R(x^2))     (see asin.c)
- * For x>0.5
- *     acos(x) = pi/2 - (pi/2 - 2asin(sqrt((1-x)/2)))
- *             = 2asin(sqrt((1-x)/2))  
- *             = 2s + 2s*z*R(z)        ...z=(1-x)/2, s=sqrt(z)
- *             = 2f + (2c + 2s*z*R(z))
- *     where f=hi part of s, and c = (z-f*f)/(s+f) is the correction term
- *     for f so that f+c ~ sqrt(z).
- * For x<-0.5
- *     acos(x) = pi - 2asin(sqrt((1-|x|)/2))
- *             = pi - 0.5*(s+s*z*R(z)), where z=(1-|x|)/2,s=sqrt(z)
- *
- * Special cases:
- *     if x is NaN, return x itself;
- *     if |x|>1, return NaN with invalid signal.
- *
- * Function needed: sqrt
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-one=  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-pi =  3.14159265358979311600e+00, /* 0x400921FB, 0x54442D18 */
-pio2_hi =  1.57079632679489655800e+00, /* 0x3FF921FB, 0x54442D18 */
-pio2_lo =  6.12323399573676603587e-17, /* 0x3C91A626, 0x33145C07 */
-pS0 =  1.66666666666666657415e-01, /* 0x3FC55555, 0x55555555 */
-pS1 = -3.25565818622400915405e-01, /* 0xBFD4D612, 0x03EB6F7D */
-pS2 =  2.01212532134862925881e-01, /* 0x3FC9C155, 0x0E884455 */
-pS3 = -4.00555345006794114027e-02, /* 0xBFA48228, 0xB5688F3B */
-pS4 =  7.91534994289814532176e-04, /* 0x3F49EFE0, 0x7501B288 */
-pS5 =  3.47933107596021167570e-05, /* 0x3F023DE1, 0x0DFDF709 */
-qS1 = -2.40339491173441421878e+00, /* 0xC0033A27, 0x1C8A2D4B */
-qS2 =  2.02094576023350569471e+00, /* 0x40002AE5, 0x9C598AC8 */
-qS3 = -6.88283971605453293030e-01, /* 0xBFE6066C, 0x1B8D0159 */
-qS4 =  7.70381505559019352791e-02; /* 0x3FB3B8C5, 0xB12E9282 */
-
-#ifdef __STDC__
-       double __ieee754_acos(double x)
-#else
-       double __ieee754_acos(x)
-       double x;
-#endif
-{
-       double z,p,q,r,w,s,c,df;
-       __int32_t hx,ix;
-       GET_HIGH_WORD(hx,x);
-       ix = hx&0x7fffffff;
-       if(ix>=0x3ff00000) {    /* |x| >= 1 */
-           __uint32_t lx;
-           GET_LOW_WORD(lx,x);
-           if(((ix-0x3ff00000)|lx)==0) {       /* |x|==1 */
-               if(hx>0) return 0.0;            /* acos(1) = 0  */
-               else return pi+2.0*pio2_lo;     /* acos(-1)= pi */
-           }
-           return (x-x)/(x-x);         /* acos(|x|>1) is NaN */
-       }
-       if(ix<0x3fe00000) {     /* |x| < 0.5 */
-           if(ix<=0x3c600000) return pio2_hi+pio2_lo;/*if|x|<2**-57*/
-           z = x*x;
-           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
-           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
-           r = p/q;
-           return pio2_hi - (x - (pio2_lo-x*r));
-       } else  if (hx<0) {             /* x < -0.5 */
-           z = (one+x)*0.5;
-           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
-           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
-           s = __ieee754_sqrt(z);
-           r = p/q;
-           w = r*s-pio2_lo;
-           return pi - 2.0*(s+w);
-       } else {                        /* x > 0.5 */
-           z = (one-x)*0.5;
-           s = __ieee754_sqrt(z);
-           df = s;
-           SET_LOW_WORD(df,0);
-           c  = (z-df*df)/(s+df);
-           p = z*(pS0+z*(pS1+z*(pS2+z*(pS3+z*(pS4+z*pS5)))));
-           q = one+z*(qS1+z*(qS2+z*(qS3+z*qS4)));
-           r = p/q;
-           w = r*s+c;
-           return 2.0*(df+w);
-       }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ * Method :
+ *             = 2asin(sqrt((1-x)/2))
+static const double
+static double
+       int32_t hx,ix;
+           uint32_t lx;
index 8e9650f290de37a0800f0b822ef960bccf847a55..f0317f7e24a0c5778c51ec0347e5d4f79ecb31fa 100644 (file)
-
-/* @(#)e_atan2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- *
- */
-
-/* __ieee754_atan2(y,x)
- * Method :
- *     1. Reduce y to positive by atan2(y,x)=-atan2(-y,x).
- *     2. Reduce x to positive by (if x and y are unexceptional): 
- *             ARG (x+iy) = arctan(y/x)           ... if x > 0,
- *             ARG (x+iy) = pi - arctan[y/(-x)]   ... if x < 0,
- *
- * Special cases:
- *
- *     ATAN2((anything), NaN ) is NaN;
- *     ATAN2(NAN , (anything) ) is NaN;
- *     ATAN2(+-0, +(anything but NaN)) is +-0  ;
- *     ATAN2(+-0, -(anything but NaN)) is +-pi ;
- *     ATAN2(+-(anything but 0 and NaN), 0) is +-pi/2;
- *     ATAN2(+-(anything but INF and NaN), +INF) is +-0 ;
- *     ATAN2(+-(anything but INF and NaN), -INF) is +-pi;
- *     ATAN2(+-INF,+INF ) is +-pi/4 ;
- *     ATAN2(+-INF,-INF ) is +-3pi/4;
- *     ATAN2(+-INF, (anything but,0,NaN, and INF)) is +-pi/2;
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-tiny  = 1.0e-300,
-zero  = 0.0,
-pi_o_4  = 7.8539816339744827900E-01, /* 0x3FE921FB, 0x54442D18 */
-pi_o_2  = 1.5707963267948965580E+00, /* 0x3FF921FB, 0x54442D18 */
-pi      = 3.1415926535897931160E+00, /* 0x400921FB, 0x54442D18 */
-pi_lo   = 1.2246467991473531772E-16; /* 0x3CA1A626, 0x33145C07 */
-
-#ifdef __STDC__
-       double __ieee754_atan2(double y, double x)
-#else
-       double __ieee754_atan2(y,x)
-       double  y,x;
-#endif
-{  
-       double z;
-       __int32_t k,m,hx,hy,ix,iy;
-       __uint32_t lx,ly;
-
-       EXTRACT_WORDS(hx,lx,x);
-       ix = hx&0x7fffffff;
-       EXTRACT_WORDS(hy,ly,y);
-       iy = hy&0x7fffffff;
-       if(((ix|((lx|-lx)>>31))>0x7ff00000)||
-          ((iy|((ly|-ly)>>31))>0x7ff00000))    /* x or y is NaN */
-          return x+y;
-       if(((hx-0x3ff00000)|lx)==0) return atan(y);   /* x=1.0 */
-       m = ((hy>>31)&1)|((hx>>30)&2);  /* 2*sign(x)+sign(y) */
-
-    /* when y = 0 */
-       if((iy|ly)==0) {
-           switch(m) {
-               case 0: 
-               case 1: return y;       /* atan(+-0,+anything)=+-0 */
-               case 2: return  pi+tiny;/* atan(+0,-anything) = pi */
-               case 3: return -pi-tiny;/* atan(-0,-anything) =-pi */
-           }
-       }
-    /* when x = 0 */
-       if((ix|lx)==0) return (hy<0)?  -pi_o_2-tiny: pi_o_2+tiny;
-           
-    /* when x is INF */
-       if(ix==0x7ff00000) {
-           if(iy==0x7ff00000) {
-               switch(m) {
-                   case 0: return  pi_o_4+tiny;/* atan(+INF,+INF) */
-                   case 1: return -pi_o_4-tiny;/* atan(-INF,+INF) */
-                   case 2: return  3.0*pi_o_4+tiny;/*atan(+INF,-INF)*/
-                   case 3: return -3.0*pi_o_4-tiny;/*atan(-INF,-INF)*/
-               }
-           } else {
-               switch(m) {
-                   case 0: return  zero  ;     /* atan(+...,+INF) */
-                   case 1: return -zero  ;     /* atan(-...,+INF) */
-                   case 2: return  pi+tiny  ;  /* atan(+...,-INF) */
-                   case 3: return -pi-tiny  ;  /* atan(-...,-INF) */
-               }
-           }
-       }
-    /* when y is INF */
-       if(iy==0x7ff00000) return (hy<0)? -pi_o_2-tiny: pi_o_2+tiny;
-
-    /* compute y/x */
-       k = (iy-ix)>>20;
-       if(k > 60) z=pi_o_2+0.5*pi_lo;  /* |y/x| >  2**60 */
-       else if(hx<0&&k<-60) z=0.0;     /* |y|/x < -2**60 */
-       else z=atan(fabs(y/x));         /* safe to do y/x */
-       switch (m) {
-           case 0: return       z  ;   /* atan(+,+) */
-           case 1: {
-                     __uint32_t zh;
-                     GET_HIGH_WORD(zh,z);
-                     SET_HIGH_WORD(z,zh ^ 0x80000000);
-                   }
-                   return       z  ;   /* atan(-,+) */
-           case 2: return  pi-(z-pi_lo);/* atan(+,-) */
-           default: /* case 3 */
-                   return  (z-pi_lo)-pi;/* atan(-,-) */
-       }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ *     2. Reduce x to positive by (if x and y are unexceptional):
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static const double
+static double
+{
+       int32_t k,m,hx,hy,ix,iy;
+       uint32_t lx,ly;
+               case 0:
+
+                     uint32_t zh;
index ce093c61065057c718769f2344b12f3f82f2bbe8..7c377ea71d4797d70f6dd193f90e50a447f174db 100644 (file)
-
-/* @(#)e_exp.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* __ieee754_exp(x)
- * Returns the exponential of x.
- *
- * Method
- *   1. Argument reduction:
- *      Reduce x to an r so that |r| <= 0.5*ln2 ~ 0.34658.
- *     Given x, find r and integer k such that
- *
- *               x = k*ln2 + r,  |r| <= 0.5*ln2.  
- *
- *      Here r will be represented as r = hi-lo for better 
- *     accuracy.
- *
- *   2. Approximation of exp(r) by a special rational function on
- *     the interval [0,0.34658]:
- *     Write
- *         R(r**2) = r*(exp(r)+1)/(exp(r)-1) = 2 + r*r/6 - r**4/360 + ...
- *      We use a special Reme algorithm on [0,0.34658] to generate 
- *     a polynomial of degree 5 to approximate R. The maximum error 
- *     of this polynomial approximation is bounded by 2**-59. In
- *     other words,
- *         R(z) ~ 2.0 + P1*z + P2*z**2 + P3*z**3 + P4*z**4 + P5*z**5
- *     (where z=r*r, and the values of P1 to P5 are listed below)
- *     and
- *         |                  5          |     -59
- *         | 2.0+P1*z+...+P5*z   -  R(z) | <= 2 
- *         |                             |
- *     The computation of exp(r) thus becomes
- *                             2*r
- *             exp(r) = 1 + -------
- *                           R - r
- *                                 r*R1(r)     
- *                    = 1 + r + ----------- (for better accuracy)
- *                               2 - R1(r)
- *     where
- *                              2       4             10
- *             R1(r) = r - (P1*r  + P2*r  + ... + P5*r   ).
- *     
- *   3. Scale back to obtain exp(x):
- *     From step 1, we have
- *        exp(x) = 2^k * exp(r)
- *
- * Special cases:
- *     exp(INF) is INF, exp(NaN) is NaN;
- *     exp(-INF) is 0, and
- *     for finite argument, only exp(0)=1 is exact.
- *
- * Accuracy:
- *     according to an error analysis, the error is always less than
- *     1 ulp (unit in the last place).
- *
- * Misc. info.
- *     For IEEE double 
- *         if x >  7.09782712893383973096e+02 then exp(x) overflow
- *         if x < -7.45133219101941108420e+02 then exp(x) underflow
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-one    = 1.0,
-halF[2]        = {0.5,-0.5,},
-huge   = 1.0e+300,
-twom1000= 9.33263618503218878990e-302,     /* 2**-1000=0x01700000,0*/
-o_threshold=  7.09782712893383973096e+02,  /* 0x40862E42, 0xFEFA39EF */
-u_threshold= -7.45133219101941108420e+02,  /* 0xc0874910, 0xD52D3051 */
-ln2HI[2]   ={ 6.93147180369123816490e-01,  /* 0x3fe62e42, 0xfee00000 */
-            -6.93147180369123816490e-01,},/* 0xbfe62e42, 0xfee00000 */
-ln2LO[2]   ={ 1.90821492927058770002e-10,  /* 0x3dea39ef, 0x35793c76 */
-            -1.90821492927058770002e-10,},/* 0xbdea39ef, 0x35793c76 */
-invln2 =  1.44269504088896338700e+00, /* 0x3ff71547, 0x652b82fe */
-P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
-P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
-P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
-P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
-P5   =  4.13813679705723846039e-08; /* 0x3E663769, 0x72BEA4D0 */
-
-
-#ifdef __STDC__
-       double __ieee754_exp(double x)  /* default IEEE double exp */
-#else
-       double __ieee754_exp(x) /* default IEEE double exp */
-       double x;
-#endif
-{
-       double y,hi,lo,c,t;
-       __int32_t k,xsb;
-       __uint32_t hx;
-
-       GET_HIGH_WORD(hx,x);
-       xsb = (hx>>31)&1;               /* sign bit of x */
-       hx &= 0x7fffffff;               /* high word of |x| */
-
-    /* filter out non-finite argument */
-       if(hx >= 0x40862E42) {                  /* if |x|>=709.78... */
-            if(hx>=0x7ff00000) {
-               __uint32_t lx;
-               GET_LOW_WORD(lx,x);
-               if(((hx&0xfffff)|lx)!=0) 
-                    return x+x;                /* NaN */
-               else return (xsb==0)? x:0.0;    /* exp(+-inf)={inf,0} */
-           }
-           if(x > o_threshold) return huge*huge; /* overflow */
-           if(x < u_threshold) return twom1000*twom1000; /* underflow */
-       }
-
-    /* argument reduction */
-       if(hx > 0x3fd62e42) {           /* if  |x| > 0.5 ln2 */ 
-           if(hx < 0x3FF0A2B2) {       /* and |x| < 1.5 ln2 */
-               hi = x-ln2HI[xsb]; lo=ln2LO[xsb]; k = 1-xsb-xsb;
-           } else {
-               k  = invln2*x+halF[xsb];
-               t  = k;
-               hi = x - t*ln2HI[0];    /* t*ln2HI is exact here */
-               lo = t*ln2LO[0];
-           }
-           x  = hi - lo;
-       } 
-       else if(hx < 0x3e300000)  {     /* when |x|<2**-28 */
-           if(huge+x>one) return one+x;/* trigger inexact */
-       }
-       else k = 0;
-
-    /* x is now in primary range */
-       t  = x*x;
-       c  = x - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
-       if(k==0)        return one-((x*c)/(c-2.0)-x); 
-       else            y = one-((lo-(x*c)/(2.0-c))-hi);
-       if(k >= -1021) {
-           __uint32_t hy;
-           GET_HIGH_WORD(hy,y);
-           SET_HIGH_WORD(y,hy+(k<<20));        /* add k to y's exponent */
-           return y;
-       } else {
-           __uint32_t hy;
-           GET_HIGH_WORD(hy,y);
-           SET_HIGH_WORD(y,hy+((k+1000)<<20)); /* add k to y's exponent */
-           return y*twom1000;
+ * software is freely granted, provided that this notice
+ *               x = k*ln2 + r,  |r| <= 0.5*ln2.
+ *      Here r will be represented as r = hi-lo for better
+ *      We use a special Reme algorithm on [0,0.34658] to generate
+ *     a polynomial of degree 5 to approximate R. The maximum error
+ *         | 2.0+P1*z+...+P5*z   -  R(z) | <= 2
+ *                                 r*R1(r)
+ *
+ *     For IEEE double
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+       int32_t k,xsb;
+       uint32_t hx;
+               uint32_t lx;
+               if(((hx&0xfffff)|lx)!=0)
+       if(hx > 0x3fd62e42) {           /* if  |x| > 0.5 ln2 */
        }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+       if(k==0)        return one-((x*c)/(c-2.0)-x);
+           uint32_t hy;
+           uint32_t hy;
index f9739eec25d7108e404e9cf967e6fa9b35d90ee5..f64e9c4c0f35e76a4ffbab32a668a1378256ec99 100644 (file)
-
-/* @(#)e_fmod.c 5.1 93/09/24 */
+ * software is freely granted, provided that this notice
 /*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* 
- * __ieee754_fmod(x,y)
- * Return x mod y in exact arithmetic
- * Method: shift and subtract
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double one = 1.0, Zero[] = {0.0, -0.0,};
-#else
-static double one = 1.0, Zero[] = {0.0, -0.0,};
-#endif
-
-#ifdef __STDC__
-       double __ieee754_fmod(double x, double y)
-#else
-       double __ieee754_fmod(x,y)
-       double x,y ;
-#endif
-{
-       __int32_t n,hx,hy,hz,ix,iy,sx,i;
-       __uint32_t lx,ly,lz;
-
-       EXTRACT_WORDS(hx,lx,x);
-       EXTRACT_WORDS(hy,ly,y);
-       sx = hx&0x80000000;             /* sign of x */
-       hx ^=sx;                /* |x| */
-       hy &= 0x7fffffff;       /* |y| */
-
-    /* purge off exception values */
-       if((hy|ly)==0||(hx>=0x7ff00000)||       /* y=0,or x not finite */
-         ((hy|((ly|-ly)>>31))>0x7ff00000))     /* or y is NaN */
-           return (x*y)/(x*y);
-       if(hx<=hy) {
-           if((hx<hy)||(lx<ly)) return x;      /* |x|<|y| return x */
-           if(lx==ly) 
-               return Zero[(__uint32_t)sx>>31];        /* |x|=|y| return x*0*/
-       }
-
-    /* determine ix = ilogb(x) */
-       if(hx<0x00100000) {     /* subnormal x */
-           if(hx==0) {
-               for (ix = -1043, i=lx; i>0; i<<=1) ix -=1;
-           } else {
-               for (ix = -1022,i=(hx<<11); i>0; i<<=1) ix -=1;
-           }
-       } else ix = (hx>>20)-1023;
-
-    /* determine iy = ilogb(y) */
-       if(hy<0x00100000) {     /* subnormal y */
-           if(hy==0) {
-               for (iy = -1043, i=ly; i>0; i<<=1) iy -=1;
-           } else {
-               for (iy = -1022,i=(hy<<11); i>0; i<<=1) iy -=1;
-           }
-       } else iy = (hy>>20)-1023;
-
-    /* set up {hx,lx}, {hy,ly} and align y to x */
-       if(ix >= -1022) 
-           hx = 0x00100000|(0x000fffff&hx);
-       else {          /* subnormal x, shift x to normal */
-           n = -1022-ix;
-           if(n<=31) {
-               hx = (hx<<n)|(lx>>(32-n));
-               lx <<= n;
-           } else {
-               hx = lx<<(n-32);
-               lx = 0;
-           }
-       }
-       if(iy >= -1022) 
-           hy = 0x00100000|(0x000fffff&hy);
-       else {          /* subnormal y, shift y to normal */
-           n = -1022-iy;
-           if(n<=31) {
-               hy = (hy<<n)|(ly>>(32-n));
-               ly <<= n;
-           } else {
-               hy = ly<<(n-32);
-               ly = 0;
-           }
-       }
-
-    /* fix point fmod */
-       n = ix - iy;
-       while(n--) {
-           hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
-           if(hz<0){hx = hx+hx+(lx>>31); lx = lx+lx;}
-           else {
-               if((hz|lz)==0)          /* return sign(x)*0 */
-                   return Zero[(__uint32_t)sx>>31];
-               hx = hz+hz+(lz>>31); lx = lz+lz;
-           }
-       }
-       hz=hx-hy;lz=lx-ly; if(lx<ly) hz -= 1;
-       if(hz>=0) {hx=hz;lx=lz;}
-
-    /* convert back to floating value and restore the sign */
-       if((hx|lx)==0)                  /* return sign(x)*0 */
-           return Zero[(__uint32_t)sx>>31];    
-       while(hx<0x00100000) {          /* normalize x */
-           hx = hx+hx+(lx>>31); lx = lx+lx;
-           iy -= 1;
-       }
-       if(iy>= -1022) {        /* normalize output */
-           hx = ((hx-0x00100000)|((iy+1023)<<20));
-           INSERT_WORDS(x,hx|sx,lx);
-       } else {                /* subnormal output */
-           n = -1022 - iy;
-           if(n<=20) {
-               lx = (lx>>n)|((__uint32_t)hx<<(32-n));
-               hx >>= n;
-           } else if (n<=31) {
-               lx = (hx<<(32-n))|(lx>>n); hx = sx;
-           } else {
-               lx = hx>>(n-32); hx = sx;
-           }
-           INSERT_WORDS(x,hx|sx,lx);
-           x *= one;           /* create necessary signal */
-       }
-       return x;               /* exact output */
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+       int32_t n,hx,hy,hz,ix,iy,sx,i;
+       uint32_t lx,ly,lz;
+           if(lx==ly)
+               return Zero[(uint32_t)sx>>31];  /* |x|=|y| return x*0*/
+       if(ix >= -1022)
+       if(iy >= -1022)
+                   return Zero[(uint32_t)sx>>31];
+           return Zero[(uint32_t)sx>>31];
+               lx = (lx>>n)|((uint32_t)hx<<(32-n));
index ea6c55f6c36ff14e7012c7b750dd189e3571fd02..fbeb13a90012b3560c81a221706bfbf66944cb2a 100644 (file)
-
-/* @(#)e_log.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Method :
+ *   1. Argument Reduction: find k and f such that
+ *                     x = 2^k * (1+f),
+ *      We use a special Reme algorithm on [0,0.1716] to generate
+ *     a polynomial of degree 14 to approximate R The maximum error
+ *         | Lg1*s +...+Lg7*s    -  R(z) | <= 2
  *
- * 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.
- * ====================================================
- */
-
-/* __ieee754_log(x)
- * Return the logrithm of x
- *
- * Method :                  
- *   1. Argument Reduction: find k and f such that 
- *                     x = 2^k * (1+f), 
- *        where  sqrt(2)/2 < 1+f < sqrt(2) .
- *
- *   2. Approximation of log(1+f).
- *     Let s = f/(2+f) ; based on log(1+f) = log(1+s) - log(1-s)
- *              = 2s + 2/3 s**3 + 2/5 s**5 + .....,
- *              = 2s + s*R
- *      We use a special Reme algorithm on [0,0.1716] to generate 
- *     a polynomial of degree 14 to approximate R The maximum error 
- *     of this polynomial approximation is bounded by 2**-58.45. In
- *     other words,
- *                     2      4      6      8      10      12      14
- *         R(z) ~ Lg1*s +Lg2*s +Lg3*s +Lg4*s +Lg5*s  +Lg6*s  +Lg7*s
- *     (the values of Lg1 to Lg7 are listed in the program)
- *     and
- *         |      2          14          |     -58.45
- *         | Lg1*s +...+Lg7*s    -  R(z) | <= 2 
- *         |                             |
- *     Note that 2s = f - s*f = f - hfsq + s*hfsq, where hfsq = f*f/2.
- *     In order to guarantee error in log below 1ulp, we compute log
- *     by
- *             log(1+f) = f - s*(f - R)        (if f is not too large)
- *             log(1+f) = f - (hfsq - s*(hfsq+R)).     (better accuracy)
- *     
- *     3. Finally,  log(x) = k*ln2 + log(1+f).  
- *                         = k*ln2_hi+(f-(hfsq-(s*(hfsq+R)+k*ln2_lo)))
- *        Here ln2 is split into two floating point number: 
- *                     ln2_hi + ln2_lo,
- *        where n*ln2_hi is always exact for |n| < 2000.
- *
- * Special cases:
- *     log(x) is NaN with signal if x < 0 (including -INF) ; 
- *     log(+INF) is +INF; log(0) is -INF with signal;
- *     log(NaN) is that NaN with no signal.
- *
- * Accuracy:
- *     according to an error analysis, the error is always less than
- *     1 ulp (unit in the last place).
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-ln2_hi  =  6.93147180369123816490e-01, /* 3fe62e42 fee00000 */
-ln2_lo  =  1.90821492927058770002e-10, /* 3dea39ef 35793c76 */
-two54   =  1.80143985094819840000e+16,  /* 43500000 00000000 */
-Lg1 = 6.666666666666735130e-01,  /* 3FE55555 55555593 */
-Lg2 = 3.999999999940941908e-01,  /* 3FD99999 9997FA04 */
-Lg3 = 2.857142874366239149e-01,  /* 3FD24924 94229359 */
-Lg4 = 2.222219843214978396e-01,  /* 3FCC71C5 1D8E78AF */
-Lg5 = 1.818357216161805012e-01,  /* 3FC74664 96CB03DE */
-Lg6 = 1.531383769920937332e-01,  /* 3FC39A09 D078C69F */
-Lg7 = 1.479819860511658591e-01;  /* 3FC2F112 DF3E5244 */
-
-#ifdef __STDC__
-static const double zero   =  0.0;
-#else
-static double zero   =  0.0;
-#endif
-
-#ifdef __STDC__
-       double __ieee754_log(double x)
-#else
-       double __ieee754_log(x)
-       double x;
-#endif
-{
-       double hfsq,f,s,z,R,w,t1,t2,dk;
-       __int32_t k,hx,i,j;
-       __uint32_t lx;
-
-       EXTRACT_WORDS(hx,lx,x);
-
-       k=0;
-       if (hx < 0x00100000) {                  /* x < 2**-1022  */
-           if (((hx&0x7fffffff)|lx)==0) 
-               return -two54/zero;             /* log(+-0)=-inf */
-           if (hx<0) return (x-x)/zero;        /* log(-#) = NaN */
-           k -= 54; x *= two54; /* subnormal number, scale up x */
-           GET_HIGH_WORD(hx,x);
-       } 
-       if (hx >= 0x7ff00000) return x+x;
-       k += (hx>>20)-1023;
-       hx &= 0x000fffff;
-       i = (hx+0x95f64)&0x100000;
-       SET_HIGH_WORD(x,hx|(i^0x3ff00000));     /* normalize x or x/2 */
-       k += (i>>20);
-       f = x-1.0;
-       if((0x000fffff&(2+hx))<3) {     /* |f| < 2**-20 */
-           if(f==zero) {
-             if(k==0)
-               return zero;
-             else {
-               dk=(double)k;
-               return dk*ln2_hi+dk*ln2_lo;
-             }
-           }
-           R = f*f*(0.5-0.33333333333333333*f);
-           if(k==0) return f-R; else {dk=(double)k;
-                    return dk*ln2_hi-((R-dk*ln2_lo)-f);}
-       }
-       s = f/(2.0+f); 
-       dk = (double)k;
-       z = s*s;
-       i = hx-0x6147a;
-       w = z*z;
-       j = 0x6b851-hx;
-       t1= w*(Lg2+w*(Lg4+w*Lg6)); 
-       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7))); 
-       i |= j;
-       R = t2+t1;
-       if(i>0) {
-           hfsq=0.5*f*f;
-           if(k==0) return f-(hfsq-s*(hfsq+R)); else
-                    return dk*ln2_hi-((hfsq-(s*(hfsq+R)+dk*ln2_lo))-f);
-       } else {
-           if(k==0) return f-s*(f-R); else
-                    return dk*ln2_hi-((s*(f-R)-dk*ln2_lo)-f);
+ *     3. Finally,  log(x) = k*ln2 + log(1+f).
+ *        Here ln2 is split into two floating point number:
+ *     log(x) is NaN with signal if x < 0 (including -INF) ;
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+       int32_t k,hx,i,j;
+       uint32_t lx;
+           if (((hx&0x7fffffff)|lx)==0)
        }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+       s = f/(2.0+f);
+       t1= w*(Lg2+w*(Lg4+w*Lg6));
+       t2= z*(Lg1+w*(Lg3+w*(Lg5+w*Lg7)));
index f078dff344db6c159d70da9df2463805fc197d30..705794bb19507f845462a76624d4ff2b6bc43799 100644 (file)
-
-/* @(#)e_pow.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* __ieee754_pow(x,y) return x**y
- *
- *                   n
- * Method:  Let x =  2   * (1+f)
- *     1. Compute and return log2(x) in two pieces:
- *             log2(x) = w1 + w2,
- *        where w1 has 53-24 = 29 bit trailing zeros.
- *     2. Perform y*log2(x) = n+y' by simulating muti-precision 
- *        arithmetic, where |y'|<=0.5.
- *     3. Return x**y = 2**n*exp(y'*log2)
- *
- * Special cases:
- *     1.  (anything) ** 0  is 1
- *     2.  (anything) ** 1  is itself
- *     3.  (anything) ** NAN is NAN
- *     4.  NAN ** (anything except 0) is NAN
- *     5.  +-(|x| > 1) **  +INF is +INF
- *     6.  +-(|x| > 1) **  -INF is +0
- *     7.  +-(|x| < 1) **  +INF is +0
- *     8.  +-(|x| < 1) **  -INF is +INF
- *     9.  +-1         ** +-INF is NAN
- *     10. +0 ** (+anything except 0, NAN)               is +0
- *     11. -0 ** (+anything except 0, NAN, odd integer)  is +0
- *     12. +0 ** (-anything except 0, NAN)               is +INF
- *     13. -0 ** (-anything except 0, NAN, odd integer)  is +INF
- *     14. -0 ** (odd integer) = -( +0 ** (odd integer) )
- *     15. +INF ** (+anything except 0,NAN) is +INF
- *     16. +INF ** (-anything except 0,NAN) is +0
- *     17. -INF ** (anything)  = -0 ** (-anything)
- *     18. (-anything) ** (integer) is (-1)**(integer)*(+anything**integer)
- *     19. (-anything except 0 and inf) ** (non-integer) is NAN
- *
- * Accuracy:
- *     pow(x,y) returns x**y nearly rounded. In particular
- *                     pow(integer,integer)
- *     always returns the correct integer provided it is 
- *     representable.
- *
- * Constants :
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-bp[] = {1.0, 1.5,},
-dp_h[] = { 0.0, 5.84962487220764160156e-01,}, /* 0x3FE2B803, 0x40000000 */
-dp_l[] = { 0.0, 1.35003920212974897128e-08,}, /* 0x3E4CFDEB, 0x43CFD006 */
-zero    =  0.0,
-one    =  1.0,
-two    =  2.0,
-two53  =  9007199254740992.0,  /* 0x43400000, 0x00000000 */
-huge   =  1.0e300,
-tiny    =  1.0e-300,
-       /* poly coefs for (3/2)*(log(x)-2s-2/3*s**3 */
-L1  =  5.99999999999994648725e-01, /* 0x3FE33333, 0x33333303 */
-L2  =  4.28571428578550184252e-01, /* 0x3FDB6DB6, 0xDB6FABFF */
-L3  =  3.33333329818377432918e-01, /* 0x3FD55555, 0x518F264D */
-L4  =  2.72728123808534006489e-01, /* 0x3FD17460, 0xA91D4101 */
-L5  =  2.30660745775561754067e-01, /* 0x3FCD864A, 0x93C9DB65 */
-L6  =  2.06975017800338417784e-01, /* 0x3FCA7E28, 0x4A454EEF */
-P1   =  1.66666666666666019037e-01, /* 0x3FC55555, 0x5555553E */
-P2   = -2.77777777770155933842e-03, /* 0xBF66C16C, 0x16BEBD93 */
-P3   =  6.61375632143793436117e-05, /* 0x3F11566A, 0xAF25DE2C */
-P4   = -1.65339022054652515390e-06, /* 0xBEBBBD41, 0xC5D26BF1 */
-P5   =  4.13813679705723846039e-08, /* 0x3E663769, 0x72BEA4D0 */
-lg2  =  6.93147180559945286227e-01, /* 0x3FE62E42, 0xFEFA39EF */
-lg2_h  =  6.93147182464599609375e-01, /* 0x3FE62E43, 0x00000000 */
-lg2_l  = -1.90465429995776804525e-09, /* 0xBE205C61, 0x0CA86C39 */
-ovt =  8.0085662595372944372e-0017, /* -(1024-log2(ovfl+.5ulp)) */
-cp    =  9.61796693925975554329e-01, /* 0x3FEEC709, 0xDC3A03FD =2/(3ln2) */
-cp_h  =  9.61796700954437255859e-01, /* 0x3FEEC709, 0xE0000000 =(float)cp */
-cp_l  = -7.02846165095275826516e-09, /* 0xBE3E2FE0, 0x145B01F5 =tail of cp_h*/
-ivln2    =  1.44269504088896338700e+00, /* 0x3FF71547, 0x652B82FE =1/ln2 */
-ivln2_h  =  1.44269502162933349609e+00, /* 0x3FF71547, 0x60000000 =24b 1/ln2*/
-ivln2_l  =  1.92596299112661746887e-08; /* 0x3E54AE0B, 0xF85DDF44 =1/ln2 tail*/
-
-#ifdef __STDC__
-       double __ieee754_pow(double x, double y)
-#else
-       double __ieee754_pow(x,y)
-       double x, y;
-#endif
-{
-       double z,ax,z_h,z_l,p_h,p_l;
-       double y1,t1,t2,r,s,t,u,v,w;
-       __int32_t i,j,k,yisint,n;
-       __int32_t hx,hy,ix,iy;
-       __uint32_t lx,ly;
-
-       EXTRACT_WORDS(hx,lx,x);
-       EXTRACT_WORDS(hy,ly,y);
-       ix = hx&0x7fffffff;  iy = hy&0x7fffffff;
-
-    /* y==zero: x**0 = 1 */
-       if((iy|ly)==0) return one;      
-
-    /* +-NaN return x+y */
-       if(ix > 0x7ff00000 || ((ix==0x7ff00000)&&(lx!=0)) ||
-          iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0))) 
-               return x+y;     
-
-    /* determine if y is an odd int when x < 0
-     * yisint = 0      ... y is not an integer
-     * yisint = 1      ... y is an odd int
-     * yisint = 2      ... y is an even int
-     */
-       yisint  = 0;
-       if(hx<0) {      
-           if(iy>=0x43400000) yisint = 2; /* even integer y */
-           else if(iy>=0x3ff00000) {
-               k = (iy>>20)-0x3ff;        /* exponent */
-               if(k>20) {
-                   j = ly>>(52-k);
-                   if((__uint32_t)(j<<(52-k))==ly) yisint = 2-(j&1);
-               } else if(ly==0) {
-                   j = iy>>(20-k);
-                   if((j<<(20-k))==iy) yisint = 2-(j&1);
-               }
-           }           
-       } 
-
-    /* special value of y */
-       if(ly==0) {     
-           if (iy==0x7ff00000) {       /* y is +-inf */
-               if(((ix-0x3ff00000)|lx)==0)
-                   return  y - y;      /* inf**+-1 is NaN */
-               else if (ix >= 0x3ff00000)/* (|x|>1)**+-inf = inf,0 */
-                   return (hy>=0)? y: zero;
-               else                    /* (|x|<1)**-,+inf = inf,0 */
-                   return (hy<0)?-y: zero;
-           } 
-           if(iy==0x3ff00000) {        /* y is  +-1 */
-               if(hy<0) return one/x; else return x;
-           }
-           if(hy==0x40000000) return x*x; /* y is  2 */
-           if(hy==0x3fe00000) {        /* y is  0.5 */
-               if(hx>=0)       /* x >= +0 */
-               return __ieee754_sqrt(x);       
-           }
-       }
-
-       ax   = fabs(x);
-    /* special value of x */
-       if(lx==0) {
-           if(ix==0x7ff00000||ix==0||ix==0x3ff00000){
-               z = ax;                 /*x is +-0,+-inf,+-1*/
-               if(hy<0) z = one/z;     /* z = (1/|x|) */
-               if(hx<0) {
-                   if(((ix-0x3ff00000)|yisint)==0) {
-                       z = (z-z)/(z-z); /* (-1)**non-int is NaN */
-                   } else if(yisint==1) 
-                       z = -z;         /* (x<0)**odd = -(|x|**odd) */
-               }
-               return z;
+ * software is freely granted, provided that this notice
+ *     2. Perform y*log2(x) = n+y' by simulating muti-precision
+ *     always returns the correct integer provided it is
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static const double
+static double
+       int32_t i,j,k,yisint,n;
+       int32_t hx,hy,ix,iy;
+       uint32_t lx,ly;
+       if((iy|ly)==0) return one;
+          iy > 0x7ff00000 || ((iy==0x7ff00000)&&(ly!=0)))
+               return x+y;
+       if(hx<0) {
+                   if((uint32_t)(j<<(52-k))==ly) yisint = 2-(j&1);
            }
        }
-    
-    /* (x<0)**(non-int) is NaN */
-    /* CYGNUS LOCAL: This used to be
-       if((((hx>>31)+1)|yisint)==0) return (x-x)/(x-x);
-       but ANSI C says a right shift of a signed negative quantity is
-       implementation defined.  */
-       if(((((__uint32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
-
-    /* |y| is huge */
-       if(iy>0x41e00000) { /* if |y| > 2**31 */
-           if(iy>0x43f00000){  /* if |y| > 2**64, must o/uflow */
-               if(ix<=0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
-               if(ix>=0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
+       if(ly==0) {
            }
-       /* over/underflow if x is not close to one */
-           if(ix<0x3fefffff) return (hy<0)? huge*huge:tiny*tiny;
-           if(ix>0x3ff00000) return (hy>0)? huge*huge:tiny*tiny;
-       /* now |1-x| is tiny <= 2**-20, suffice to compute 
-          log(x) by x-x^2/2+x^3/3-x^4/4 */
-           t = x-1;            /* t has 20 trailing zeros */
-           w = (t*t)*(0.5-t*(0.3333333333333333333333-t*0.25));
-           u = ivln2_h*t;      /* ivln2_h has 21 sig. bits */
-           v = t*ivln2_l-w*ivln2;
-           t1 = u+v;
-           SET_LOW_WORD(t1,0);
-           t2 = v-(t1-u);
-       } else {
-           double s2,s_h,s_l,t_h,t_l;
-           n = 0;
-       /* take care subnormal number */
-           if(ix<0x00100000)
-               {ax *= two53; n -= 53; GET_HIGH_WORD(ix,ax); }
-           n  += ((ix)>>20)-0x3ff;
-           j  = ix&0x000fffff;
-       /* determine interval */
-           ix = j|0x3ff00000;          /* normalize ix */
-           if(j<=0x3988E) k=0;         /* |x|<sqrt(3/2) */
-           else if(j<0xBB67A) k=1;     /* |x|<sqrt(3)   */
-           else {k=0;n+=1;ix -= 0x00100000;}
-           SET_HIGH_WORD(ax,ix);
+               return __ieee754_sqrt(x);
+                   } else if(yisint==1)
 
-       /* compute s = s_h+s_l = (x-1)/(x+1) or (x-1.5)/(x+1.5) */
-           u = ax-bp[k];               /* bp[0]=1.0, bp[1]=1.5 */
-           v = one/(ax+bp[k]);
-           s = u*v;
-           s_h = s;
-           SET_LOW_WORD(s_h,0);
-       /* t_h=ax+bp[k] High */
-           t_h = zero;
-           SET_HIGH_WORD(t_h,((ix>>1)|0x20000000)+0x00080000+(k<<18));
-           t_l = ax - (t_h-bp[k]);
-           s_l = v*((u-s_h*t_h)-s_h*t_l);
-       /* compute log(ax) */
-           s2 = s*s;
-           r = s2*s2*(L1+s2*(L2+s2*(L3+s2*(L4+s2*(L5+s2*L6)))));
-           r += s_l*(s_h+s);
-           s2  = s_h*s_h;
-           t_h = 3.0+s2+r;
-           SET_LOW_WORD(t_h,0);
-           t_l = r-((t_h-3.0)-s2);
-       /* u+v = s*(1+...) */
-           u = s_h*t_h;
-           v = s_l*t_h+t_l*s;
-       /* 2/(3log2)*(s+...) */
-           p_h = u+v;
-           SET_LOW_WORD(p_h,0);
-           p_l = v-(p_h-u);
-           z_h = cp_h*p_h;             /* cp_h+cp_l = 2/(3*log2) */
-           z_l = cp_l*p_h+p_l*cp+dp_l[k];
-       /* log2(ax) = (s+..)*2/(3*log2) = n + dp_h + z_h + z_l */
-           t = (double)n;
-           t1 = (((z_h+z_l)+dp_h[k])+t);
-           SET_LOW_WORD(t1,0);
-           t2 = z_l-(((t1-t)-dp_h[k])-z_h);
+       if(((((uint32_t)hx>>31)-1)|yisint)==0) return (x-x)/(x-x);
+       /* now |1-x| is tiny <= 2**-20, suffice to compute
+       if(((((uint32_t)hx>>31)-1)|(yisint-1))==0)
        }
-
-       s = one; /* s (sign of result -ve**odd) = -1 else = 1 */
-       if(((((__uint32_t)hx>>31)-1)|(yisint-1))==0)
-           s = -one;/* (-ve)**(odd int) */
-
-    /* split up y into y1+y2 and compute (y1+y2)*(t1+t2) */
-       y1  = y;
-       SET_LOW_WORD(y1,0);
-       p_l = (y-y1)*t1+y*t2;
-       p_h = y1*t1;
-       z = p_l+p_h;
-       EXTRACT_WORDS(j,i,z);
-       if (j>=0x40900000) {                            /* z >= 1024 */
-           if(((j-0x40900000)|i)!=0)                   /* if z > 1024 */
-               return s*huge*huge;                     /* overflow */
-           else {
-               if(p_l+ovt>z-p_h) return s*huge*huge;   /* overflow */
-           }
-       } else if((j&0x7fffffff)>=0x4090cc00 ) {        /* z <= -1075 */
-           if(((j-0xc090cc00)|i)!=0)           /* z < -1075 */
-               return s*tiny*tiny;             /* underflow */
-           else {
-               if(p_l<=z-p_h) return s*tiny*tiny;      /* underflow */
-           }
-       }
-    /*
-     * compute 2**(p_h+p_l)
-     */
-       i = j&0x7fffffff;
-       k = (i>>20)-0x3ff;
-       n = 0;
-       if(i>0x3fe00000) {              /* if |z| > 0.5, set n = [z+0.5] */
-           n = j+(0x00100000>>(k+1));
-           k = ((n&0x7fffffff)>>20)-0x3ff;     /* new k for n */
-           t = zero;
-           SET_HIGH_WORD(t,n&~(0x000fffff>>k));
-           n = ((n&0x000fffff)|0x00100000)>>(20-k);
-           if(j<0) n = -n;
-           p_h -= t;
-       } 
-       t = p_l+p_h;
-       SET_LOW_WORD(t,0);
-       u = t*lg2_h;
-       v = (p_l-(t-p_h))*lg2+t*lg2_l;
-       z = u+v;
-       w = v-(z-u);
-       t  = z*z;
-       t1  = z - t*(P1+t*(P2+t*(P3+t*(P4+t*P5))));
-       r  = (z*t1)/(t1-two)-(w+z*w);
-       z  = one-(r-z);
-       GET_HIGH_WORD(j,z);
-       j += (n<<20);
-       if((j>>20)<=0) z = scalbn(z,(int)n);    /* subnormal output */
-       else SET_HIGH_WORD(z,j);
-       return s*z;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
index 3e5d0f7a2277ff41563a79cc544f93871c4d2309..04665fb35bf3ab27183d096e16783bff72d2114a 100644 (file)
-
-/* @(#)e_rem_pio2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
  *
- * 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.
- * ====================================================
- *
- */
-
-/* __ieee754_rem_pio2(x,y)
- * 
- * return the remainder of x rem pi/2 in y[0]+y[1] 
- * use __kernel_rem_pio2()
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-/*
- * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi 
- */
-#ifdef __STDC__
-static const __int32_t two_over_pi[] = {
-#else
-static __int32_t two_over_pi[] = {
-#endif
-0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62, 
-0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A, 
-0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129, 
-0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41, 
-0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8, 
-0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF, 
-0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5, 
-0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08, 
-0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3, 
-0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880, 
-0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B, 
-};
-
-#ifdef __STDC__
-static const __int32_t npio2_hw[] = {
-#else
-static __int32_t npio2_hw[] = {
-#endif
-0x3FF921FB, 0x400921FB, 0x4012D97C, 0x401921FB, 0x401F6A7A, 0x4022D97C,
-0x4025FDBB, 0x402921FB, 0x402C463A, 0x402F6A7A, 0x4031475C, 0x4032D97C,
-0x40346B9C, 0x4035FDBB, 0x40378FDB, 0x403921FB, 0x403AB41B, 0x403C463A,
-0x403DD85A, 0x403F6A7A, 0x40407E4C, 0x4041475C, 0x4042106C, 0x4042D97C,
-0x4043A28C, 0x40446B9C, 0x404534AC, 0x4045FDBB, 0x4046C6CB, 0x40478FDB,
-0x404858EB, 0x404921FB,
-};
-
-/*
- * invpio2:  53 bits of 2/pi
- * pio2_1:   first  33 bit of pi/2
- * pio2_1t:  pi/2 - pio2_1
- * pio2_2:   second 33 bit of pi/2
- * pio2_2t:  pi/2 - (pio2_1+pio2_2)
- * pio2_3:   third  33 bit of pi/2
- * pio2_3t:  pi/2 - (pio2_1+pio2_2+pio2_3)
- */
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-zero =  0.00000000000000000000e+00, /* 0x00000000, 0x00000000 */
-half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
-two24 =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
-invpio2 =  6.36619772367581382433e-01, /* 0x3FE45F30, 0x6DC9C883 */
-pio2_1  =  1.57079632673412561417e+00, /* 0x3FF921FB, 0x54400000 */
-pio2_1t =  6.07710050650619224932e-11, /* 0x3DD0B461, 0x1A626331 */
-pio2_2  =  6.07710050630396597660e-11, /* 0x3DD0B461, 0x1A600000 */
-pio2_2t =  2.02226624879595063154e-21, /* 0x3BA3198A, 0x2E037073 */
-pio2_3  =  2.02226624871116645580e-21, /* 0x3BA3198A, 0x2E000000 */
-pio2_3t =  8.47842766036889956997e-32; /* 0x397B839A, 0x252049C1 */
-
-#ifdef __STDC__
-       __int32_t __ieee754_rem_pio2(double x, double *y)
-#else
-       __int32_t __ieee754_rem_pio2(x,y)
-       double x,y[];
-#endif
-{
-       double z,w,t,r,fn;
-       double tx[3];
-       __int32_t i,j,n,ix,hx;
-       int e0,nx;
-       __uint32_t low;
-
-       GET_HIGH_WORD(hx,x);            /* high word of x */
-       ix = hx&0x7fffffff;
-       if(ix<=0x3fe921fb)   /* |x| ~<= pi/4 , no need for reduction */
-           {y[0] = x; y[1] = 0; return 0;}
-       if(ix<0x4002d97c) {  /* |x| < 3pi/4, special case with n=+-1 */
-           if(hx>0) { 
-               z = x - pio2_1;
-               if(ix!=0x3ff921fb) {    /* 33+53 bit pi is good enough */
-                   y[0] = z - pio2_1t;
-                   y[1] = (z-y[0])-pio2_1t;
-               } else {                /* near pi/2, use 33+33+53 bit pi */
-                   z -= pio2_2;
-                   y[0] = z - pio2_2t;
-                   y[1] = (z-y[0])-pio2_2t;
-               }
-               return 1;
-           } else {    /* negative x */
-               z = x + pio2_1;
-               if(ix!=0x3ff921fb) {    /* 33+53 bit pi is good enough */
-                   y[0] = z + pio2_1t;
-                   y[1] = (z-y[0])+pio2_1t;
-               } else {                /* near pi/2, use 33+33+53 bit pi */
-                   z += pio2_2;
-                   y[0] = z + pio2_2t;
-                   y[1] = (z-y[0])+pio2_2t;
-               }
-               return -1;
-           }
-       }
-       if(ix<=0x413921fb) { /* |x| ~<= 2^19*(pi/2), medium size */
-           t  = fabs(x);
-           n  = (__int32_t) (t*invpio2+half);
-           fn = (double)n;
-           r  = t-fn*pio2_1;
-           w  = fn*pio2_1t;    /* 1st round good to 85 bit */
-           if(n<32&&ix!=npio2_hw[n-1]) {       
-               y[0] = r-w;     /* quick check no cancellation */
-           } else {
-               __uint32_t high;
-               j  = ix>>20;
-               y[0] = r-w; 
-               GET_HIGH_WORD(high,y[0]);
-               i = j-((high>>20)&0x7ff);
-               if(i>16) {  /* 2nd iteration needed, good to 118 */
-                   t  = r;
-                   w  = fn*pio2_2;     
-                   r  = t-w;
-                   w  = fn*pio2_2t-((t-r)-w);  
-                   y[0] = r-w;
-                   GET_HIGH_WORD(high,y[0]);
-                   i = j-((high>>20)&0x7ff);
-                   if(i>49)  { /* 3rd iteration need, 151 bits acc */
-                       t  = r; /* will cover all possible cases */
-                       w  = fn*pio2_3; 
-                       r  = t-w;
-                       w  = fn*pio2_3t-((t-r)-w);      
-                       y[0] = r-w;
-                   }
-               }
-           }
-           y[1] = (r-y[0])-w;
-           if(hx<0)    {y[0] = -y[0]; y[1] = -y[1]; return -n;}
-           else         return n;
-       }
-    /* 
-     * all other (large) arguments
-     */
-       if(ix>=0x7ff00000) {            /* x is inf or NaN */
-           y[0]=y[1]=x-x; return 0;
-       }
-    /* set z = scalbn(|x|,ilogb(x)-23) */
-       GET_LOW_WORD(low,x);
-       SET_LOW_WORD(z,low);
-       e0      = (int)((ix>>20)-1046); /* e0 = ilogb(z)-23; */
-       SET_HIGH_WORD(z, ix - ((__int32_t)e0<<20));
-       for(i=0;i<2;i++) {
-               tx[i] = (double)((__int32_t)(z));
-               z     = (z-tx[i])*two24;
-       }
-       tx[2] = z;
-       nx = 3;
-       while(tx[nx-1]==zero) nx--;     /* skip zero term */
-       n  =  __kernel_rem_pio2(tx,y,e0,nx,2,two_over_pi);
-       if(hx<0) {y[0] = -y[0]; y[1] = -y[1]; return -n;}
-       return n;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * return the remainder of x rem pi/2 in y[0]+y[1]
+ * Table of constants for 2/pi, 396 Hex digits (476 decimal) of 2/pi
+static const int32_t two_over_pi[] = {
+static int32_t two_over_pi[] = {
+0xA2F983, 0x6E4E44, 0x1529FC, 0x2757D1, 0xF534DD, 0xC0DB62,
+0x95993C, 0x439041, 0xFE5163, 0xABDEBB, 0xC561B7, 0x246E3A,
+0x424DD2, 0xE00649, 0x2EEA09, 0xD1921C, 0xFE1DEB, 0x1CB129,
+0xA73EE8, 0x8235F5, 0x2EBB44, 0x84E99C, 0x7026B4, 0x5F7E41,
+0x3991D6, 0x398353, 0x39F49C, 0x845F8B, 0xBDF928, 0x3B1FF8,
+0x97FFDE, 0x05980F, 0xEF2F11, 0x8B5A0A, 0x6D1F6D, 0x367ECF,
+0x27CB09, 0xB74F46, 0x3F669E, 0x5FEA2D, 0x7527BA, 0xC7EBE5,
+0xF17B3D, 0x0739F7, 0x8A5292, 0xEA6BFB, 0x5FB11F, 0x8D5D08,
+0x560330, 0x46FC7B, 0x6BABF0, 0xCFBC20, 0x9AF436, 0x1DA9E3,
+0x91615E, 0xE61B08, 0x659985, 0x5F14A0, 0x68408D, 0xFFD880,
+0x4D7327, 0x310606, 0x1556CA, 0x73A8C9, 0x60E27B, 0xC08C6B,
+static const int32_t npio2_hw[] = {
+static int32_t npio2_hw[] = {
+static const double
+static double
+       int32_t __ieee754_rem_pio2(double x, double *y)
+       int32_t __ieee754_rem_pio2(x,y)
+       int32_t i,j,n,ix,hx;
+       uint32_t low;
+           if(hx>0) {
+           n  = (int32_t) (t*invpio2+half);
+           if(n<32&&ix!=npio2_hw[n-1]) {
+               uint32_t high;
+               y[0] = r-w;
+                   w  = fn*pio2_2;
+                   w  = fn*pio2_2t-((t-r)-w);
+                       w  = fn*pio2_3;
+                       w  = fn*pio2_3t-((t-r)-w);
+    /*
+       SET_HIGH_WORD(z, ix - ((int32_t)e0<<20));
+               tx[i] = (double)((int32_t)(z));
index ae7ce649ad5bbe5a67bdc3d2dfcb300ea1f25c8d..0c72a6bd8618cabcf70226924abbdf05882f94c5 100644 (file)
@@ -1,80 +1,7 @@
-
-/* @(#)e_remainder.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* __ieee754_remainder(x,p)
- * Return :                  
- *     returns  x REM p  =  x - [x/p]*p as if in infinite 
- *     precise arithmetic, where [x/p] is the (infinite bit) 
- *     integer nearest x/p (in half way case choose the even one).
- * Method : 
- *     Based on fmod() return x-[x/p]chopped*p exactlp.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double zero = 0.0;
-#else
-static double zero = 0.0;
-#endif
-
-
-#ifdef __STDC__
-       double __ieee754_remainder(double x, double p)
-#else
-       double __ieee754_remainder(x,p)
-       double x,p;
-#endif
-{
-       __int32_t hx,hp;
-       __uint32_t sx,lx,lp;
-       double p_half;
-
-       EXTRACT_WORDS(hx,lx,x);
-       EXTRACT_WORDS(hp,lp,p);
-       sx = hx&0x80000000;
-       hp &= 0x7fffffff;
-       hx &= 0x7fffffff;
-
-    /* purge off exception values */
-       if((hp|lp)==0) return (x*p)/(x*p);      /* p = 0 */
-       if((hx>=0x7ff00000)||                   /* x not finite */
-         ((hp>=0x7ff00000)&&                   /* p is NaN */
-         (((hp-0x7ff00000)|lp)!=0)))
-           return (x*p)/(x*p);
-
-
-       if (hp<=0x7fdfffff) x = __ieee754_fmod(x,p+p);  /* now x < 2p */
-       if (((hx-hp)|(lx-lp))==0) return zero*x;
-       x  = fabs(x);
-       p  = fabs(p);
-       if (hp<0x00200000) {
-           if(x+x>p) {
-               x-=p;
-               if(x+x>=p) x -= p;
-           }
-       } else {
-           p_half = 0.5*p;
-           if(x>p_half) {
-               x-=p;
-               if(x>=p_half) x -= p;
-           }
-       }
-       GET_HIGH_WORD(hx,x);
-       SET_HIGH_WORD(x,hx^sx);
-       return x;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+ * Return :
+ *     returns  x REM p  =  x - [x/p]*p as if in infinite
+ *     precise arithmetic, where [x/p] is the (infinite bit)
+ * Method :
+       int32_t hx,hp;
+       uint32_t sx,lx,lp;
index b56b1eedc94c0022c05c70fce2df16e5310dc0d2..5a1225fbff7ce8750ec9c5e71b35a9902e3958a7 100644 (file)
-
-/* @(#)e_sqrt.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* __ieee754_sqrt(x)
- * Return correctly rounded sqrt.
- *           ------------------------------------------
- *          |  Use the hardware sqrt if you have one |
- *           ------------------------------------------
- * Method: 
- *   Bit by bit method using integer arithmetic. (Slow, but portable) 
- *   1. Normalization
- *     Scale x to y in [1,4) with even powers of 2: 
- *     find an integer k such that  1 <= (y=x*2^(2k)) < 4, then
- *             sqrt(x) = 2^k * sqrt(y)
- *   2. Bit by bit computation
- *     Let q  = sqrt(y) truncated to i bit after binary point (q = 1),
- *          i                                                   0
- *                                     i+1         2
- *         s  = 2*q , and      y  =  2   * ( y - q  ).         (1)
- *          i      i            i                 i
- *                                                        
- *     To compute q    from q , one checks whether 
- *                 i+1       i                       
- *
- *                           -(i+1) 2
- *                     (q + 2      ) <= y.                     (2)
- *                               i
- *                                                           -(i+1)
- *     If (2) is false, then q   = q ; otherwise q   = q  + 2      .
- *                            i+1   i             i+1   i
- *
- *     With some algebric manipulation, it is not difficult to see
- *     that (2) is equivalent to 
- *                             -(i+1)
- *                     s  +  2       <= y                      (3)
- *                      i                i
+ * software is freely granted, provided that this notice
+ * Method:
+ *   Bit by bit method using integer arithmetic. (Slow, but portable)
+ *     Scale x to y in [1,4) with even powers of 2:
  *
- *     The advantage of (3) is that s  and y  can be computed by 
- *                                   i      i
- *     the following recurrence formula:
- *         if (3) is false
+ *     To compute q    from q , one checks whether
+ *                 i+1       i
+ *     that (2) is equivalent to
+ *     The advantage of (3) is that s  and y  can be computed by
  *
- *         s     =  s  ,       y    = y   ;                    (4)
- *          i+1      i          i+1    i
+ *     One may easily use induction to prove (4) and (5).
+ *           it does not necessary to do a full (53-bit) comparison
  *
- *         otherwise,
- *                         -i                     -(i+1)
- *         s     =  s  + 2  ,  y    = y  -  s  - 2             (5)
- *           i+1      i          i+1    i     i
- *                             
- *     One may easily use induction to prove (4) and (5). 
- *     Note. Since the left hand side of (3) contain only i+2 bits,
- *           it does not necessary to do a full (53-bit) comparison 
- *           in (3).
- *   3. Final rounding
- *     After generating the 53 bits result, we compute one more bit.
- *     Together with the remainder, we can decide whether the
- *     result is exact, bigger than 1/2ulp, or less than 1/2ulp
- *     (it will never equal to 1/2ulp).
- *     The rounding mode can be detected by checking whether
- *     huge + tiny is equal to huge, and whether huge - tiny is
- *     equal to huge for some floating point number "huge" and "tiny".
- *             
- * Special cases:
- *     sqrt(+-0) = +-0         ... exact
- *     sqrt(inf) = inf
- *     sqrt(-ve) = NaN         ... with invalid signal
- *     sqrt(NaN) = NaN         ... with invalid signal for signaling NaN
- *
- * Other methods : see the appended file at the end of the program below.
- *---------------
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double    one     = 1.0, tiny=1.0e-300;
-#else
-static double  one     = 1.0, tiny=1.0e-300;
-#endif
-
-#ifdef __STDC__
-       double __ieee754_sqrt(double x)
-#else
-       double __ieee754_sqrt(x)
-       double x;
-#endif
-{
-       double z;
-       __int32_t sign = (int)0x80000000; 
-       __uint32_t r,t1,s1,ix1,q1;
-       __int32_t ix0,s0,q,m,t,i;
-
-       EXTRACT_WORDS(ix0,ix1,x);
-
-    /* take care of Inf and NaN */
-       if((ix0&0x7ff00000)==0x7ff00000) {                      
-           return x*x+x;               /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
-                                          sqrt(-inf)=sNaN */
-       } 
-    /* take care of zero */
-       if(ix0<=0) {
-           if(((ix0&(~sign))|ix1)==0) return x;/* sqrt(+-0) = +-0 */
-           else if(ix0<0)
-               return (x-x)/(x-x);             /* sqrt(-ve) = sNaN */
-       }
-    /* normalize x */
-       m = (ix0>>20);
-       if(m==0) {                              /* subnormal x */
-           while(ix0==0) {
-               m -= 21;
-               ix0 |= (ix1>>11); ix1 <<= 21;
-           }
-           for(i=0;(ix0&0x00100000)==0;i++) ix0<<=1;
-           m -= i-1;
-           ix0 |= (ix1>>(32-i));
-           ix1 <<= i;
-       }
-       m -= 1023;      /* unbias exponent */
-       ix0 = (ix0&0x000fffff)|0x00100000;
-       if(m&1){        /* odd m, double x to make it even */
-           ix0 += ix0 + ((ix1&sign)>>31);
-           ix1 += ix1;
-       }
-       m >>= 1;        /* m = [m/2] */
-
-    /* generate sqrt(x) bit by bit */
-       ix0 += ix0 + ((ix1&sign)>>31);
-       ix1 += ix1;
-       q = q1 = s0 = s1 = 0;   /* [q,q1] = sqrt(x) */
-       r = 0x00200000;         /* r = moving bit from right to left */
-
-       while(r!=0) {
-           t = s0+r; 
-           if(t<=ix0) { 
-               s0   = t+r; 
-               ix0 -= t; 
-               q   += r; 
-           } 
-           ix0 += ix0 + ((ix1&sign)>>31);
-           ix1 += ix1;
-           r>>=1;
-       }
-
-       r = sign;
-       while(r!=0) {
-           t1 = s1+r; 
-           t  = s0;
-           if((t<ix0)||((t==ix0)&&(t1<=ix1))) { 
-               s1  = t1+r;
-               if(((t1&sign)==(__uint32_t)sign)&&(s1&sign)==0) s0 += 1;
+       int32_t sign = (int)0x80000000;
+       uint32_t r,t1,s1,ix1,q1;
+       int32_t ix0,s0,q,m,t,i;
+       if((ix0&0x7ff00000)==0x7ff00000) {
+       }
+           t = s0+r;
+           if(t<=ix0) {
+               s0   = t+r;
                ix0 -= t;
-               if (ix1 < t1) ix0 -= 1;
-               ix1 -= t1;
-               q1  += r;
-           }
-           ix0 += ix0 + ((ix1&sign)>>31);
-           ix1 += ix1;
-           r>>=1;
-       }
-
-    /* use floating add to find out rounding direction */
-       if((ix0|ix1)!=0) {
-           z = one-tiny; /* trigger inexact flag */
-           if (z>=one) {
-               z = one+tiny;
-               if (q1==(__uint32_t)0xffffffff) { q1=0; q += 1;}
-               else if (z>one) {
-                   if (q1==(__uint32_t)0xfffffffe) q+=1;
-                   q1+=2; 
-               } else
-                   q1 += (q1&1);
+               q   += r;
            }
-       }
-       ix0 = (q>>1)+0x3fe00000;
-       ix1 =  q1>>1;
-       if ((q&1)==1) ix1 |= sign;
-       ix0 += (m <<20);
-       INSERT_WORDS(z,ix0,ix1);
-       return z;
-}
-#endif /* defined(_DOUBLE_IS_32BITS) */
-
-/*
-Other methods  (use floating-point arithmetic)
--------------
-(This is a copy of a drafted paper by Prof W. Kahan 
-and K.C. Ng, written in May, 1986)
-
-       Two algorithms are given here to implement sqrt(x) 
-       (IEEE double precision arithmetic) in software.
-       Both supply sqrt(x) correctly rounded. The first algorithm (in
-       Section A) uses newton iterations and involves four divisions.
-       The second one uses reciproot iterations to avoid division, but
-       requires more multiplications. Both algorithms need the ability
-       to chop results of arithmetic operations instead of round them, 
-       and the INEXACT flag to indicate when an arithmetic operation
-       is executed exactly with no roundoff error, all part of the 
-       standard (IEEE 754-1985). The ability to perform shift, add,
-       subtract and logical AND operations upon 32-bit words is needed
-       too, though not part of the standard.
-
-A.  sqrt(x) by Newton Iteration
-
-   (1) Initial approximation
-
-       Let x0 and x1 be the leading and the trailing 32-bit words of
-       a floating point number x (in IEEE double format) respectively 
-
-           1    11                  52                           ...widths
-          ------------------------------------------------------
-       x: |s|    e     |             f                         |
-          ------------------------------------------------------
-             msb    lsb  msb                                 lsb ...order
-
-            ------------------------        ------------------------
-       x0:  |s|   e    |    f1     |    x1: |          f2           |
-            ------------------------        ------------------------
-
-       By performing shifts and subtracts on x0 and x1 (both regarded
-       as integers), we obtain an 8-bit approximation of sqrt(x) as
-       follows.
-
-               k  := (x0>>1) + 0x1ff80000;
-               y0 := k - T1[31&(k>>15)].       ... y ~ sqrt(x) to 8 bits
-       Here k is a 32-bit integer and T1[] is an integer array containing
-       correction terms. Now magically the floating value of y (y's
-       leading 32-bit word is y0, the value of its trailing word is 0)
-       approximates sqrt(x) to almost 8-bit.
-
-       Value of T1:
-       static int T1[32]= {
-       0,      1024,   3062,   5746,   9193,   13348,  18162,  23592,
-       29598,  36145,  43202,  50740,  58733,  67158,  75992,  85215,
-       83599,  71378,  60428,  50647,  41945,  34246,  27478,  21581,
-       16499,  12183,  8588,   5674,   3403,   1742,   661,    130,};
-
-    (2)        Iterative refinement
-
-       Apply Heron's rule three times to y, we have y approximates 
-       sqrt(x) to within 1 ulp (Unit in the Last Place):
-
-               y := (y+x/y)/2          ... almost 17 sig. bits
-               y := (y+x/y)/2          ... almost 35 sig. bits
-               y := y-(y-x/y)/2        ... within 1 ulp
-
-
-       Remark 1.
-           Another way to improve y to within 1 ulp is:
-
-               y := (y+x/y)            ... almost 17 sig. bits to 2*sqrt(x)
-               y := y - 0x00100006     ... almost 18 sig. bits to sqrt(x)
-
-                               2
-                           (x-y )*y
-               y := y + 2* ----------  ...within 1 ulp
-                              2
-                            3y  + x
-
-
-       This formula has one division fewer than the one above; however,
-       it requires more multiplications and additions. Also x must be
-       scaled in advance to avoid spurious overflow in evaluating the
-       expression 3y*y+x. Hence it is not recommended uless division
-       is slow. If division is very slow, then one should use the 
-       reciproot algorithm given in section B.
-
-    (3) Final adjustment
-
-       By twiddling y's last bit it is possible to force y to be 
-       correctly rounded according to the prevailing rounding mode
-       as follows. Let r and i be copies of the rounding mode and
-       inexact flag before entering the square root program. Also we
-       use the expression y+-ulp for the next representable floating
-       numbers (up and down) of y. Note that y+-ulp = either fixed
-       point y+-1, or multiply y by nextafter(1,+-inf) in chopped
-       mode.
-
-               I := FALSE;     ... reset INEXACT flag I
-               R := RZ;        ... set rounding mode to round-toward-zero
-               z := x/y;       ... chopped quotient, possibly inexact
-               If(not I) then {        ... if the quotient is exact
-                   if(z=y) {
-                       I := i;  ... restore inexact flag
-                       R := r;  ... restore rounded mode
-                       return sqrt(x):=y.
-                   } else {
-                       z := z - ulp;   ... special rounding
-                   }
-               }
-               i := TRUE;              ... sqrt(x) is inexact
-               If (r=RN) then z=z+ulp  ... rounded-to-nearest
-               If (r=RP) then {        ... round-toward-+inf
-                   y = y+ulp; z=z+ulp;
-               }
-               y := y+z;               ... chopped sum
-               y0:=y0-0x00100000;      ... y := y/2 is correctly rounded.
-               I := i;                 ... restore inexact flag
-               R := r;                 ... restore rounded mode
-               return sqrt(x):=y.
-                   
-    (4)        Special cases
-
-       Square root of +inf, +-0, or NaN is itself;
-       Square root of a negative number is NaN with invalid signal.
-
-
-B.  sqrt(x) by Reciproot Iteration
-
-   (1) Initial approximation
-
-       Let x0 and x1 be the leading and the trailing 32-bit words of
+           t1 = s1+r;
+           if((t<ix0)||((t==ix0)&&(t1<=ix1))) {
+               if(((t1&sign)==(uint32_t)sign)&&(s1&sign)==0) s0 += 1;
+               if (q1==(uint32_t)0xffffffff) { q1=0; q += 1;}
+                   if (q1==(uint32_t)0xfffffffe) q+=1;
+                   q1+=2;
+
+(This is a copy of a drafted paper by Prof W. Kahan
+       Two algorithms are given here to implement sqrt(x)
+       to chop results of arithmetic operations instead of round them,
+       is executed exactly with no roundoff error, all part of the
        a floating point number x (in IEEE double format) respectively
-       (see section A). By performing shifs and subtracts on x0 and y0,
-       we obtain a 7.8-bit approximation of 1/sqrt(x) as follows.
-
-           k := 0x5fe80000 - (x0>>1);
-           y0:= k - T2[63&(k>>14)].    ... y ~ 1/sqrt(x) to 7.8 bits
-
-       Here k is a 32-bit integer and T2[] is an integer array 
-       containing correction terms. Now magically the floating
-       value of y (y's leading 32-bit word is y0, the value of
-       its trailing word y1 is set to zero) approximates 1/sqrt(x)
-       to almost 7.8-bit.
-
-       Value of T2:
-       static int T2[64]= {
-       0x1500, 0x2ef8, 0x4d67, 0x6b02, 0x87be, 0xa395, 0xbe7a, 0xd866,
-       0xf14a, 0x1091b,0x11fcd,0x13552,0x14999,0x15c98,0x16e34,0x17e5f,
-       0x18d03,0x19a01,0x1a545,0x1ae8a,0x1b5c4,0x1bb01,0x1bfde,0x1c28d,
-       0x1c2de,0x1c0db,0x1ba73,0x1b11c,0x1a4b5,0x1953d,0x18266,0x16be0,
-       0x1683e,0x179d8,0x18a4d,0x19992,0x1a789,0x1b445,0x1bf61,0x1c989,
-       0x1d16d,0x1d77b,0x1dddf,0x1e2ad,0x1e5bf,0x1e6e8,0x1e654,0x1e3cd,
-       0x1df2a,0x1d635,0x1cb16,0x1be2c,0x1ae4e,0x19bde,0x1868e,0x16e2e,
-       0x1527f,0x1334a,0x11051,0xe951, 0xbe01, 0x8e0d, 0x5924, 0x1edd,};
-
-    (2)        Iterative refinement
-
-       Apply Reciproot iteration three times to y and multiply the
-       result by x to get an approximation z that matches sqrt(x)
-       to about 1 ulp. To be exact, we will have 
-               -1ulp < sqrt(x)-z<1.0625ulp.
-       
-       ... set rounding mode to Round-to-nearest
-          y := y*(1.5-0.5*x*y*y)       ... almost 15 sig. bits to 1/sqrt(x)
-          y := y*((1.5-2^-30)+0.5*x*y*y)... about 29 sig. bits to 1/sqrt(x)
-       ... special arrangement for better accuracy
-          z := x*y                     ... 29 bits to sqrt(x), with z*y<1
-          z := z + 0.5*z*(1-z*y)       ... about 1 ulp to sqrt(x)
-
-       Remark 2. The constant 1.5-2^-30 is chosen to bias the error so that
-       (a) the term z*y in the final iteration is always less than 1; 
-       (b) the error in the final result is biased upward so that
-               -1 ulp < sqrt(x) - z < 1.0625 ulp
-           instead of |sqrt(x)-z|<1.03125ulp.
-
-    (3)        Final adjustment
-
-       By twiddling y's last bit it is possible to force y to be 
-       correctly rounded according to the prevailing rounding mode
-       as follows. Let r and i be copies of the rounding mode and
-       inexact flag before entering the square root program. Also we
-       use the expression y+-ulp for the next representable floating
-       numbers (up and down) of y. Note that y+-ulp = either fixed
-       point y+-1, or multiply y by nextafter(1,+-inf) in chopped
-       mode.
-
-       R := RZ;                ... set rounding mode to round-toward-zero
-       switch(r) {
-           case RN:            ... round-to-nearest
-              if(x<= z*(z-ulp)...chopped) z = z - ulp; else
-              if(x<= z*(z+ulp)...chopped) z = z; else z = z+ulp;
-              break;
-           case RZ:case RM:    ... round-to-zero or round-to--inf
-              R:=RP;           ... reset rounding mod to round-to-+inf
-              if(x<z*z ... rounded up) z = z - ulp; else
-              if(x>=(z+ulp)*(z+ulp) ...rounded up) z = z+ulp;
-              break;
-           case RP:            ... round-to-+inf
-              if(x>(z+ulp)*(z+ulp)...chopped) z = z+2*ulp; else
-              if(x>z*z ...chopped) z = z+ulp;
-              break;
-       }
-
-       Remark 3. The above comparisons can be done in fixed point. For
-       example, to compare x and w=z*z chopped, it suffices to compare
-       x1 and w1 (the trailing parts of x and w), regarding them as
-       two's complement integers.
-
-       ...Is z an exact square root?
-       To determine whether z is an exact square root of x, let z1 be the
-       trailing part of z, and also let x0 and x1 be the leading and
-       trailing parts of x.
-
-       If ((z1&0x03ffffff)!=0) ... not exact if trailing 26 bits of z!=0
-           I := 1;             ... Raise Inexact flag: z is not exact
-       else {
-           j := 1 - [(x0>>20)&1]       ... j = logb(x) mod 2
-           k := z1 >> 26;              ... get z's 25-th and 26-th 
-                                           fraction bits
-           I := i or (k&j) or ((k&(j+j+1))!=(x1&3));
-       }
-       R:= r           ... restore rounded mode
-       return sqrt(x):=z.
-
-       If multiplication is cheaper then the foregoing red tape, the 
-       Inexact flag can be evaluated by
-
-           I := i;
-           I := (z*z!=x) or I.
-
-       Note that z*z can overwrite I; this value must be sensed if it is 
-       True.
-
-       Remark 4. If z*z = x exactly, then bit 25 to bit 0 of z1 must be
-       zero.
 
-                   --------------------
-               z1: |        f2        | 
-                   --------------------
-               bit 31             bit 0
+       Apply Heron's rule three times to y, we have y approximates
+       is slow. If division is very slow, then one should use the
+       By twiddling y's last bit it is possible to force y to be
 
-       Further more, bit 27 and 26 of z1, bit 0 and 1 of x1, and the odd
-       or even of logb(x) have the following relations:
+       Here k is a 32-bit integer and T2[] is an integer array
+       to about 1 ulp. To be exact, we will have
 
-       -------------------------------------------------
-       bit 27,26 of z1         bit 1,0 of x1   logb(x)
-       -------------------------------------------------
-       00                      00              odd and even
-       01                      01              even
-       10                      10              odd
-       10                      00              even
-       11                      01              even
-       -------------------------------------------------
+       (a) the term z*y in the final iteration is always less than 1;
+       By twiddling y's last bit it is possible to force y to be
+           k := z1 >> 26;              ... get z's 25-th and 26-th
+       If multiplication is cheaper then the foregoing red tape, the
+       Note that z*z can overwrite I; this value must be sensed if it is
+               z1: |        f2        |
+    (4)        Special cases (see (4) of Section A).
 
-    (4)        Special cases (see (4) of Section A).   
- */
index 6c60c243856e5e65df87ca45c4efd8bd1e6ce745..0cb566ea2eed4a3ea080f93e3c0089ee7199e351 100644 (file)
@@ -1,96 +1,11 @@
-
-/* @(#)k_cos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input y is the tail of x.
  *
- * 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.
- * ====================================================
- */
-
-/*
- * __kernel_cos( x,  y )
- * kernel cos function on [-pi/4, pi/4], pi/4 ~ 0.785398164
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x. 
+ *     |                                                      |
  *
- * Algorithm
- *     1. Since cos(-x) = cos(x), we need only to consider positive x.
- *     2. if x < 2^-27 (hx<0x3e400000 0), return 1 with inexact if x!=0.
- *     3. cos(x) is approximated by a polynomial of degree 14 on
- *        [0,pi/4]
- *                                      4            14
- *             cos(x) ~ 1 - x*x/2 + C1*x + ... + C6*x
- *        where the remez error is
- *     
- *     |              2     4     6     8     10    12     14 |     -58
- *     |cos(x)-(1-.5*x +C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  )| <= 2
- *     |                                                      | 
- * 
- *                    4     6     8     10    12     14 
- *     4. let r = C1*x +C2*x +C3*x +C4*x +C5*x  +C6*x  , then
- *            cos(x) = 1 - x*x/2 + r
- *        since cos(x+y) ~ cos(x) - sin(x)*y 
- *                       ~ cos(x) - x*y,
- *        a correction term is necessary in cos(x) and hence
- *             cos(x+y) = 1 - (x*x/2 - (r - x*y))
- *        For better accuracy when x > 0.3, let qx = |x|/4 with
- *        the last 32 bits mask off, and if x > 0.78125, let qx = 0.28125.
- *        Then
- *             cos(x+y) = (1-qx) - ((x*x/2-qx) - (r-x*y)).
- *        Note that 1-qx and (x*x/2-qx) is EXACT here, and the
- *        magnitude of the latter is at least a quarter of x*x/2,
- *        thus, reducing the rounding error in the subtraction.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-one =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-C1  =  4.16666666666666019037e-02, /* 0x3FA55555, 0x5555554C */
-C2  = -1.38888888888741095749e-03, /* 0xBF56C16C, 0x16C15177 */
-C3  =  2.48015872894767294178e-05, /* 0x3EFA01A0, 0x19CB1590 */
-C4  = -2.75573143513906633035e-07, /* 0xBE927E4F, 0x809C52AD */
-C5  =  2.08757232129817482790e-09, /* 0x3E21EE9E, 0xBDB4B1C4 */
-C6  = -1.13596475577881948265e-11; /* 0xBDA8FAE9, 0xBE8838D4 */
-
-#ifdef __STDC__
-       double __kernel_cos(double x, double y)
-#else
-       double __kernel_cos(x, y)
-       double x,y;
-#endif
-{
-       double a,hz,z,r,qx;
-       __int32_t ix;
-       GET_HIGH_WORD(ix,x);
-       ix &= 0x7fffffff;                       /* ix = |x|'s high word*/
-       if(ix<0x3e400000) {                     /* if x < 2**27 */
-           if(((int)x)==0) return one;         /* generate inexact */
-       }
-       z  = x*x;
-       r  = z*(C1+z*(C2+z*(C3+z*(C4+z*(C5+z*C6)))));
-       if(ix < 0x3FD33333)                     /* if |x| < 0.3 */ 
-           return one - (0.5*z - (z*r - x*y));
-       else {
-           if(ix > 0x3fe90000) {               /* x > 0.78125 */
-               qx = 0.28125;
-           } else {
-               INSERT_WORDS(qx,ix-0x00200000,0);       /* x/4 */
-           }
-           hz = 0.5*z-qx;
-           a  = one-qx;
-           return a - (hz - (z*r-x*y));
-       }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ *                    4     6     8     10    12     14
+ *        since cos(x+y) ~ cos(x) - sin(x)*y
+static const double
+static double
+       int32_t ix;
+       if(ix < 0x3FD33333)                     /* if |x| < 0.3 */
index 8569256686c848cdd5f63eb19e6f63ab73861e70..438e85134180edcabe616396065d895af8ab662b 100644 (file)
-
-/* @(#)k_rem_pio2.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
- * __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
- * double x[],y[]; int e0,nx,prec; int ipio2[];
- * 
- * __kernel_rem_pio2 return the last three digits of N with 
- *             y = x - N*pi/2
- * so that |y| < pi/2.
- *
- * The method is to compute the integer (mod 8) and fraction parts of 
- * (2/pi)*x without doing the full multiplication. In general we
- * skip the part of the product that are known to be a huge integer (
- * more accurately, = 0 mod 8 ). Thus the number of operations are
- * independent of the exponent of the input.
- *
- * (2/pi) is represented by an array of 24-bit integers in ipio2[].
- *
- * Input parameters:
- *     x[]     The input value (must be positive) is broken into nx 
- *             pieces of 24-bit integers in double precision format.
- *             x[i] will be the i-th 24 bit of x. The scaled exponent 
- *             of x[0] is given in input parameter e0 (i.e., x[0]*2^e0 
- *             match x's up to 24 bits.
- *
- *             Example of breaking a double positive z into x[0]+x[1]+x[2]:
- *                     e0 = ilogb(z)-23
- *                     z  = scalbn(z,-e0)
- *             for i = 0,1,2
- *                     x[i] = floor(z)
- *                     z    = (z-x[i])*2**24
- *
- *
- *     y[]     ouput result in an array of double precision numbers.
- *             The dimension of y[] is:
- *                     24-bit  precision       1
- *                     53-bit  precision       2
- *                     64-bit  precision       2
- *                     113-bit precision       3
- *             The actual value is the sum of them. Thus for 113-bit
- *             precison, one may have to do something like:
- *
- *             long double t,w,r_head, r_tail;
- *             t = (long double)y[2] + (long double)y[1];
- *             w = (long double)y[0];
- *             r_head = t+w;
- *             r_tail = w - (r_head - t);
- *
- *     e0      The exponent of x[0]
- *
- *     nx      dimension of x[]
- *
- *     prec    an integer indicating the precision:
- *                     0       24  bits (single)
- *                     1       53  bits (double)
- *                     2       64  bits (extended)
- *                     3       113 bits (quad)
- *
- *     ipio2[]
- *             integer array, contains the (24*i)-th to (24*i+23)-th 
- *             bit of 2/pi after binary point. The corresponding 
- *             floating value is
- *
- *                     ipio2[i] * 2^(-24(i+1)).
- *
- * External function:
- *     double scalbn(), floor();
- *
- *
- * Here is the description of some local variables:
- *
- *     jk      jk+1 is the initial number of terms of ipio2[] needed
- *             in the computation. The recommended value is 2,3,4,
- *             6 for single, double, extended,and quad.
- *
- *     jz      local integer variable indicating the number of 
- *             terms of ipio2[] used. 
- *
- *     jx      nx - 1
- *
- *     jv      index for pointing to the suitable ipio2[] for the
- *             computation. In general, we want
- *                     ( 2^e0*x[0] * ipio2[jv-1]*2^(-24jv) )/8
- *             is an integer. Thus
- *                     e0-3-24*jv >= 0 or (e0-3)/24 >= jv
- *             Hence jv = max(0,(e0-3)/24).
- *
- *     jp      jp+1 is the number of terms in PIo2[] needed, jp = jk.
- *
- *     q[]     double array with integral value, representing the
- *             24-bits chunk of the product of x and 2/pi.
- *
- *     q0      the corresponding exponent of q[0]. Note that the
- *             exponent for q[i] would be q0-24*i.
- *
- *     PIo2[]  double precision array, obtained by cutting pi/2
- *             into 24 bits chunks. 
- *
- *     f[]     ipio2[] in floating point 
- *
- *     iq[]    integer array by breaking up q[] in 24-bits chunk.
- *
- *     fq[]    final product of x*(2/pi) in fq[0],..,fq[jk]
- *
- *     ih      integer. If >0 it indicates q[] is >= 0.5, hence
- *             it also indicates the *sign* of the result.
- *
- */
-
-
-/*
- * Constants:
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const int init_jk[] = {2,3,4,6}; /* initial value for jk */
-#else
-static int init_jk[] = {2,3,4,6}; 
-#endif
-
-#ifdef __STDC__
-static const double PIo2[] = {
-#else
-static double PIo2[] = {
-#endif
-  1.57079625129699707031e+00, /* 0x3FF921FB, 0x40000000 */
-  7.54978941586159635335e-08, /* 0x3E74442D, 0x00000000 */
-  5.39030252995776476554e-15, /* 0x3CF84698, 0x80000000 */
-  3.28200341580791294123e-22, /* 0x3B78CC51, 0x60000000 */
-  1.27065575308067607349e-29, /* 0x39F01B83, 0x80000000 */
-  1.22933308981111328932e-36, /* 0x387A2520, 0x40000000 */
-  2.73370053816464559624e-44, /* 0x36E38222, 0x80000000 */
-  2.16741683877804819444e-51, /* 0x3569F31D, 0x00000000 */
-};
-
-#ifdef __STDC__
-static const double                    
-#else
-static double                  
-#endif
-zero   = 0.0,
-one    = 1.0,
-two24   =  1.67772160000000000000e+07, /* 0x41700000, 0x00000000 */
-twon24  =  5.96046447753906250000e-08; /* 0x3E700000, 0x00000000 */
-
-#ifdef __STDC__
-       int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const __int32_t *ipio2) 
-#else
-       int __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)     
-       double x[], y[]; int e0,nx,prec; __int32_t ipio2[];
-#endif
-{
-       __int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
-       double z,fw,f[20],fq[20],q[20];
-
-    /* initialize jk*/
-       jk = init_jk[prec];
-       jp = jk;
-
-    /* determine jx,jv,q0, note that 3>q0 */
-       jx =  nx-1;
-       jv = (e0-3)/24; if(jv<0) jv=0;
-       q0 =  e0-24*(jv+1);
-
-    /* set up f[0] to f[jx+jk] where f[jx+jk] = ipio2[jv+jk] */
-       j = jv-jx; m = jx+jk;
-       for(i=0;i<=m;i++,j++) f[i] = (j<0)? zero : (double) ipio2[j];
-
-    /* compute q[0],q[1],...q[jk] */
-       for (i=0;i<=jk;i++) {
-           for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j]; q[i] = fw;
-       }
-
-       jz = jk;
-recompute:
-    /* distill q[] into iq[] reversingly */
-       for(i=0,j=jz,z=q[jz];j>0;i++,j--) {
-           fw    =  (double)((__int32_t)(twon24* z));
-           iq[i] =  (__int32_t)(z-two24*fw);
-           z     =  q[j-1]+fw;
-       }
-
-    /* compute n */
-       z  = scalbn(z,(int)q0);         /* actual value of z */
-       z -= 8.0*floor(z*0.125);                /* trim off integer >= 8 */
-       n  = (__int32_t) z;
-       z -= (double)n;
-       ih = 0;
-       if(q0>0) {      /* need iq[jz-1] to determine n */
-           i  = (iq[jz-1]>>(24-q0)); n += i;
-           iq[jz-1] -= i<<(24-q0);
-           ih = iq[jz-1]>>(23-q0);
-       } 
-       else if(q0==0) ih = iq[jz-1]>>23;
-       else if(z>=0.5) ih=2;
-
-       if(ih>0) {      /* q > 0.5 */
-           n += 1; carry = 0;
-           for(i=0;i<jz ;i++) {        /* compute 1-q */
-               j = iq[i];
-               if(carry==0) {
-                   if(j!=0) {
-                       carry = 1; iq[i] = 0x1000000- j;
-                   }
-               } else  iq[i] = 0xffffff - j;
-           }
-           if(q0>0) {          /* rare case: chance is 1 in 12 */
-               switch(q0) {
-               case 1:
-                  iq[jz-1] &= 0x7fffff; break;
-               case 2:
-                  iq[jz-1] &= 0x3fffff; break;
-               }
-           }
-           if(ih==2) {
-               z = one - z;
-               if(carry!=0) z -= scalbn(one,(int)q0);
-           }
-       }
-
-    /* check if recomputation is needed */
-       if(z==zero) {
-           j = 0;
-           for (i=jz-1;i>=jk;i--) j |= iq[i];
-           if(j==0) { /* need recomputation */
-               for(k=1;iq[jk-k]==0;k++);   /* k = no. of terms needed */
-
-               for(i=jz+1;i<=jz+k;i++) {   /* add q[jz+1] to q[jz+k] */
-                   f[jx+i] = (double) ipio2[jv+i];
-                   for(j=0,fw=0.0;j<=jx;j++) fw += x[j]*f[jx+i-j];
-                   q[i] = fw;
-               }
-               jz += k;
-               goto recompute;
-           }
-       }
-
-    /* chop off zero terms */
-       if(z==0.0) {
-           jz -= 1; q0 -= 24;
-           while(iq[jz]==0) { jz--; q0-=24;}
-       } else { /* break z into 24-bit if necessary */
-           z = scalbn(z,-(int)q0);
-           if(z>=two24) { 
-               fw = (double)((__int32_t)(twon24*z));
-               iq[jz] = (__int32_t)(z-two24*fw);
-               jz += 1; q0 += 24;
-               iq[jz] = (__int32_t) fw;
-           } else iq[jz] = (__int32_t) z ;
-       }
-
-    /* convert integer "bit" chunk to floating-point value */
-       fw = scalbn(one,(int)q0);
-       for(i=jz;i>=0;i--) {
-           q[i] = fw*(double)iq[i]; fw*=twon24;
-       }
-
-    /* compute PIo2[0,...,jp]*q[jz,...,0] */
-       for(i=jz;i>=0;i--) {
-           for(fw=0.0,k=0;k<=jp&&k<=jz-i;k++) fw += PIo2[k]*q[i+k];
-           fq[jz-i] = fw;
-       }
-
-    /* compress fq[] into y[] */
-       switch(prec) {
-           case 0:
-               fw = 0.0;
+ * software is freely granted, provided that this notice
+ *
+ * __kernel_rem_pio2 return the last three digits of N with
+ * The method is to compute the integer (mod 8) and fraction parts of
+ *     x[]     The input value (must be positive) is broken into nx
+ *             x[i] will be the i-th 24 bit of x. The scaled exponent
+ *             of x[0] is given in input parameter e0 (i.e., x[0]*2^e0
+ *             integer array, contains the (24*i)-th to (24*i+23)-th
+ *             bit of 2/pi after binary point. The corresponding
+ *     jz      local integer variable indicating the number of
+ *             terms of ipio2[] used.
+ *             into 24 bits chunks.
+ *     f[]     ipio2[] in floating point
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+static int init_jk[] = {2,3,4,6};
+static const double
+static double
+       int __kernel_rem_pio2(double *x, double *y, int e0, int nx, int prec, const int32_t *ipio2)
+       int __kernel_rem_pio2(x,y,e0,nx,prec,ipio2)
+       double x[], y[]; int e0,nx,prec; int32_t ipio2[];
+       int32_t jz,jx,jv,jp,jk,carry,n,iq[20],i,j,k,m,q0,ih;
+           fw    =  (double)((int32_t)(twon24* z));
+           iq[i] =  (int32_t)(z-two24*fw);
+       n  = (int32_t) z;
+       }
+           if(z>=two24) {
+               fw = (double)((int32_t)(twon24*z));
+               iq[jz] = (int32_t)(z-two24*fw);
+               iq[jz] = (int32_t) fw;
+           } else iq[jz] = (int32_t) z ;
+               y[0] = (ih==0)? fw: -fw;
                for (i=jz;i>=0;i--) fw += fq[i];
-               y[0] = (ih==0)? fw: -fw; 
-               break;
-           case 1:
-           case 2:
-               fw = 0.0;
-               for (i=jz;i>=0;i--) fw += fq[i]; 
-               y[0] = (ih==0)? fw: -fw; 
-               fw = fq[0]-fw;
-               for (i=1;i<=jz;i++) fw += fq[i];
-               y[1] = (ih==0)? fw: -fw; 
-               break;
-           case 3:     /* painful */
-               for (i=jz;i>0;i--) {
-                   fw      = fq[i-1]+fq[i]; 
-                   fq[i]  += fq[i-1]-fw;
-                   fq[i-1] = fw;
-               }
-               for (i=jz;i>1;i--) {
-                   fw      = fq[i-1]+fq[i]; 
-                   fq[i]  += fq[i-1]-fw;
-                   fq[i-1] = fw;
-               }
-               for (fw=0.0,i=jz;i>=2;i--) fw += fq[i]; 
-               if(ih==0) {
-                   y[0] =  fq[0]; y[1] =  fq[1]; y[2] =  fw;
-               } else {
-                   y[0] = -fq[0]; y[1] = -fq[1]; y[2] = -fw;
-               }
-       }
-       return n&7;
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+               y[0] = (ih==0)? fw: -fw;
+               y[1] = (ih==0)? fw: -fw;
+                   fw      = fq[i-1]+fq[i];
+                   fw      = fq[i-1]+fq[i];
+               for (fw=0.0,i=jz;i>=2;i--) fw += fq[i];
index f119916dfbc4a8fecf599e95045233d5bf400fcc..fbf2c22ea2cac8d835d041e9a8402a60efdf02f0 100644 (file)
@@ -1,79 +1,10 @@
-
-/* @(#)k_sin.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input iy indicates whether y is 0. (if iy=0, y assume to be 0).
+ *     1. Since sin(-x) = -sin(x), we need only to consider positive x.
  *
- * 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.
- * ====================================================
- */
-
-/* __kernel_sin( x, y, iy)
- * kernel sin function on [-pi/4, pi/4], pi/4 ~ 0.7854
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x.
- * Input iy indicates whether y is 0. (if iy=0, y assume to be 0). 
+ *     |  x                                               |
  *
- * Algorithm
- *     1. Since sin(-x) = -sin(x), we need only to consider positive x. 
- *     2. if x < 2^-27 (hx<0x3e400000 0), return x with inexact if x!=0.
- *     3. sin(x) is approximated by a polynomial of degree 13 on
- *        [0,pi/4]
- *                              3            13
- *             sin(x) ~ x + S1*x + ... + S6*x
- *        where
- *     
- *     |sin(x)         2     4     6     8     10     12  |     -58
- *     |----- - (1+S1*x +S2*x +S3*x +S4*x +S5*x  +S6*x   )| <= 2
- *     |  x                                               | 
- * 
- *     4. sin(x+y) = sin(x) + sin'(x')*y
- *                 ~ sin(x) + (1-x*x/2)*y
- *        For better accuracy, let 
- *                  3      2      2      2      2
- *             r = x *(S2+x *(S3+x *(S4+x *(S5+x *S6))))
- *        then                   3    2
- *             sin(x) = x + (S1*x + (x *(r-y/2)+y))
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-half =  5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
-S1  = -1.66666666666666324348e-01, /* 0xBFC55555, 0x55555549 */
-S2  =  8.33333333332248946124e-03, /* 0x3F811111, 0x1110F8A6 */
-S3  = -1.98412698298579493134e-04, /* 0xBF2A01A0, 0x19C161D5 */
-S4  =  2.75573137070700676789e-06, /* 0x3EC71DE3, 0x57B1FE7D */
-S5  = -2.50507602534068634195e-08, /* 0xBE5AE5E6, 0x8A2B9CEB */
-S6  =  1.58969099521155010221e-10; /* 0x3DE5D93A, 0x5ACFD57C */
-
-#ifdef __STDC__
-       double __kernel_sin(double x, double y, int iy)
-#else
-       double __kernel_sin(x, y, iy)
-       double x,y; int iy;             /* iy=0 if y is zero */
-#endif
-{
-       double z,r,v;
-       __int32_t ix;
-       GET_HIGH_WORD(ix,x);
-       ix &= 0x7fffffff;                       /* high word of x */
-       if(ix<0x3e400000)                       /* |x| < 2**-27 */
-          {if((int)x==0) return x;}            /* generate inexact */
-       z       =  x*x;
-       v       =  z*x;
-       r       =  S2+z*(S3+z*(S4+z*(S5+z*S6)));
-       if(iy==0) return x+v*(S1+z*r);
-       else      return x-((z*(half*y-v*r)-y)-v*S1);
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ *        For better accuracy, let
+static const double
+static double
+       int32_t ix;
index 9f5b307600cf9d7397575bd60781435e2894fad8..0520be60b1323871cd55c6fb21eb80dc976fcfcd 100644 (file)
-
-/* @(#)k_tan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ * software is freely granted, provided that this notice
+ * Input k indicates whether tan (if k=1) or
+ *     1. Since tan(-x) = -tan(x), we need only to consider positive x.
  *
- * 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.
- * ====================================================
- */
-
-/* __kernel_tan( x, y, k )
- * kernel tan function on [-pi/4, pi/4], pi/4 ~ 0.7854
- * Input x is assumed to be bounded by ~pi/4 in magnitude.
- * Input y is the tail of x.
- * Input k indicates whether tan (if k=1) or 
- * -1/tan (if k= -1) is returned.
+ *             |  x                                    |
  *
- * Algorithm
- *     1. Since tan(-x) = -tan(x), we need only to consider positive x. 
- *     2. if x < 2^-28 (hx<0x3e300000 0), return x with inexact if x!=0.
- *     3. tan(x) is approximated by a odd polynomial of degree 27 on
- *        [0,0.67434]
- *                              3             27
- *             tan(x) ~ x + T1*x + ... + T13*x
- *        where
- *     
- *             |tan(x)         2     4            26   |     -59.2
- *             |----- - (1+T1*x +T2*x +.... +T13*x    )| <= 2
- *             |  x                                    | 
- * 
- *        Note: tan(x+y) = tan(x) + tan'(x)*y
- *                       ~ tan(x) + (1+x*x)*y
- *        Therefore, for better accuracy in computing tan(x+y), let 
- *                  3      2      2       2       2
- *             r = x *(T2+x *(T3+x *(...+x *(T12+x *T13))))
- *        then
- *                                 3    2
- *             tan(x+y) = x + (T1*x + (x *(r+y)+y))
- *
- *      4. For x in [0.67434,pi/4],  let y = pi/4 - x, then
- *             tan(x) = tan(pi/4-y) = (1-tan(y))/(1+tan(y))
- *                    = 1 - 2*(tan(y) - (tan(y)^2)/(1+tan(y)))
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double 
-#else
-static double 
-#endif
-one   =  1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
-pio4  =  7.85398163397448278999e-01, /* 0x3FE921FB, 0x54442D18 */
-pio4lo=  3.06161699786838301793e-17, /* 0x3C81A626, 0x33145C07 */
-T[] =  {
-  3.33333333333334091986e-01, /* 0x3FD55555, 0x55555563 */
-  1.33333333333201242699e-01, /* 0x3FC11111, 0x1110FE7A */
-  5.39682539762260521377e-02, /* 0x3FABA1BA, 0x1BB341FE */
-  2.18694882948595424599e-02, /* 0x3F9664F4, 0x8406D637 */
-  8.86323982359930005737e-03, /* 0x3F8226E3, 0xE96E8493 */
-  3.59207910759131235356e-03, /* 0x3F6D6D22, 0xC9560328 */
-  1.45620945432529025516e-03, /* 0x3F57DBC8, 0xFEE08315 */
-  5.88041240820264096874e-04, /* 0x3F4344D8, 0xF2F26501 */
-  2.46463134818469906812e-04, /* 0x3F3026F7, 0x1A8D1068 */
-  7.81794442939557092300e-05, /* 0x3F147E88, 0xA03792A6 */
-  7.14072491382608190305e-05, /* 0x3F12B80F, 0x32F0A7E9 */
- -1.85586374855275456654e-05, /* 0xBEF375CB, 0xDB605373 */
-  2.59073051863633712884e-05, /* 0x3EFB2A70, 0x74BF7AD4 */
-};
-
-#ifdef __STDC__
-       double __kernel_tan(double x, double y, int iy)
-#else
-       double __kernel_tan(x, y, iy)
-       double x,y; int iy;
-#endif
-{
-       double z,r,v,w,s;
-       __int32_t ix,hx;
-       GET_HIGH_WORD(hx,x);
-       ix = hx&0x7fffffff;     /* high word of |x| */
-       if(ix<0x3e300000)                       /* x < 2**-28 */
-           {if((int)x==0) {                    /* generate inexact */
-               __uint32_t low;
-               GET_LOW_WORD(low,x);
-               if(((ix|low)|(iy+1))==0) return one/fabs(x);
-               else return (iy==1)? x: -one/x;
-           }
-           }
-       if(ix>=0x3FE59428) {                    /* |x|>=0.6744 */
-           if(hx<0) {x = -x; y = -y;}
-           z = pio4-x;
-           w = pio4lo-y;
-           x = z+w; y = 0.0;
-       }
-       z       =  x*x;
-       w       =  z*z;
-    /* Break x^5*(T[1]+x^2*T[2]+...) into
-     *   x^5(T[1]+x^4*T[3]+...+x^20*T[11]) +
-     *   x^5(x^2*(T[2]+x^4*T[4]+...+x^22*[T12]))
-     */
-       r = T[1]+w*(T[3]+w*(T[5]+w*(T[7]+w*(T[9]+w*T[11]))));
-       v = z*(T[2]+w*(T[4]+w*(T[6]+w*(T[8]+w*(T[10]+w*T[12])))));
-       s = z*x;
-       r = y + z*(s*(r+v)+y);
-       r += T[0]*s;
-       w = x+r;
-       if(ix>=0x3FE59428) {
-           v = (double)iy;
-           return (double)(1-((hx>>30)&2))*(v-2.0*(x-(w*w/(w+v)-r)));
-       }
-       if(iy==1) return w;
-       else {          /* if allow error up to 2 ulp, 
-                          simply return -1.0/(x+r) here */
-     /*  compute -1.0/(x+r) accurately */
-           double a,t;
-           z  = w;
-           SET_LOW_WORD(z,0);
-           v  = r-(z - x);     /* z+v = r+x */
-           t = a  = -1.0/w;    /* a = -1.0/w */
-           SET_LOW_WORD(t,0);
-           s  = 1.0+t*z;
-           return t+a*(s+t*v);
-       }
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ *        Therefore, for better accuracy in computing tan(x+y), let
+static const double
+static double
+       int32_t ix,hx;
+               uint32_t low;
+       else {          /* if allow error up to 2 ulp,
index 192243157dfa454db34b6e9c97fdad6ba77f8eab..8bc8aefb9ea9644631837c241a9bf07b8fb4b99c 100644 (file)
-/****************************************************************
- *
- * The author of this software is David M. Gay.
- *
- * Copyright (c) 1991 by AT&T.
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose without fee is hereby granted, provided that this entire notice
- * is included in all copies of any software which is or includes a copy
- * or modification of this software and in all copies of the supporting
- * documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
- * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
- * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- ***************************************************************/
-
-/* Please send bug reports to
-       David M. Gay
-       AT&T Bell Laboratories, Room 2C-463
-       600 Mountain Avenue
-       Murray Hill, NJ 07974-2070
-       U.S.A.
-       dmg@research.att.com or research!dmg
- */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <config.h>
-#include "ieeefp.h"
-
-#include <math.h>
-// #include <float.h>
-// #include <errno.h>
-
-/* These typedefs are true for the targets running Java. */
-
-#ifndef HAVE_INT32_DEFINED
-typedef int __int32_t;
-typedef unsigned int __uint32_t;
-#endif
-
-#ifdef __IEEE_LITTLE_ENDIAN
-#define IEEE_8087
-#endif
-
-#ifdef __IEEE_BIG_ENDIAN
-#define IEEE_MC68k
-#endif
-
-#ifdef __Z8000__
-#define Just_16
-#endif
-
-#ifdef DEBUG
-#include "stdio.h"
-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
-#endif
-
-
-#ifdef Unsigned_Shifts
-#define Sign_Extend(a,b) if (b < 0) a |= (__uint32_t)0xffff0000;
-#else
-#define Sign_Extend(a,b) /*no-op*/
-#endif
-
-#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
-Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
-#endif
-
-/* If we are going to examine or modify specific bits in a double using
-   the word0 and/or word1 macros, then we must wrap the double inside
-   a union.  This is necessary to avoid undefined behavior according to
-   the ANSI C spec.  */
-union double_union
-{
-  double d;
-  // FIXME: This should be some well-defined 32 bit type.
-  __uint32_t i[2];
-};
-
-#ifdef IEEE_8087
-#define word0(x) (x.i[1])
-#define word1(x) (x.i[0])
-#else
-#define word0(x) (x.i[0])
-#define word1(x) (x.i[1])
-#endif
-
-/* The following definition of Storeinc is appropriate for MIPS processors.
- * An alternative that might be better on some machines is
- * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
- */
-#if defined(IEEE_8087) + defined(VAX)
-#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
-((unsigned short *)a)[0] = (unsigned short)c, a++)
-#else
-#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
-((unsigned short *)a)[1] = (unsigned short)c, a++)
-#endif
-
-/* #define P DBL_MANT_DIG */
-/* Ten_pmax = floor(P*log(2)/log(5)) */
-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-
-#if defined(IEEE_8087) + defined(IEEE_MC68k)
-#if defined (_DOUBLE_IS_32BITS) 
-#define Exp_shift   23
-#define Exp_shift1  23
-#define Exp_msk1    ((__uint32_t)0x00800000L)
-#define Exp_msk11   ((__uint32_t)0x00800000L)
-#define Exp_mask    ((__uint32_t)0x7f800000L)
-#define P          24
-#define Bias       127
-#if 0
-#define IEEE_Arith  /* it is, but the code doesn't handle IEEE singles yet */
-#endif
-#define Emin        (-126)
-#define Exp_1       ((__uint32_t)0x3f800000L)
-#define Exp_11      ((__uint32_t)0x3f800000L)
-#define Ebits      8
-#define Frac_mask   ((__uint32_t)0x007fffffL)
-#define Frac_mask1  ((__uint32_t)0x007fffffL)
-#define Ten_pmax    10
-#define Sign_bit    ((__uint32_t)0x80000000L)
-#define Ten_pmax    10
-#define Bletch     2
-#define Bndry_mask  ((__uint32_t)0x007fffffL)
-#define Bndry_mask1 ((__uint32_t)0x007fffffL)
-#define LSB 1
-#define Sign_bit    ((__uint32_t)0x80000000L)
-#define Log2P      1
-#define Tiny0      0
-#define Tiny1      1
-#define Quick_max   5
-#define Int_max     6
-#define Infinite(x) (word0(x) == ((__uint32_t)0x7f800000L))
-#undef word0
-#undef word1
-
-#define word0(x) (x.i[0])
-#define word1(x) 0
-#else
-
-#define Exp_shift  20
-#define Exp_shift1 20
-#define Exp_msk1    ((__uint32_t)0x100000L)
-#define Exp_msk11   ((__uint32_t)0x100000L)
-#define Exp_mask  ((__uint32_t)0x7ff00000L)
-#define P 53
-#define Bias 1023
-#define IEEE_Arith
-#define Emin (-1022)
-#define Exp_1  ((__uint32_t)0x3ff00000L)
-#define Exp_11 ((__uint32_t)0x3ff00000L)
-#define Ebits 11
-#define Frac_mask  ((__uint32_t)0xfffffL)
-#define Frac_mask1 ((__uint32_t)0xfffffL)
-#define Ten_pmax 22
-#define Bletch 0x10
-#define Bndry_mask  ((__uint32_t)0xfffffL)
-#define Bndry_mask1 ((__uint32_t)0xfffffL)
-#define LSB 1
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 14
-#define Int_max 14
-#define Infinite(x) (word0(x) == ((__uint32_t)0x7ff00000L)) /* sufficient test for here */
-#endif
-
-#else
-#undef  Sudden_Underflow
-#define Sudden_Underflow
-#ifdef IBM
-#define Exp_shift  24
-#define Exp_shift1 24
-#define Exp_msk1   ((__uint32_t)0x1000000L)
-#define Exp_msk11  ((__uint32_t)0x1000000L)
-#define Exp_mask  ((__uint32_t)0x7f000000L)
-#define P 14
-#define Bias 65
-#define Exp_1  ((__uint32_t)0x41000000L)
-#define Exp_11 ((__uint32_t)0x41000000L)
-#define Ebits 8        /* exponent has 7 bits, but 8 is the right value in b2d */
-#define Frac_mask  ((__uint32_t)0xffffffL)
-#define Frac_mask1 ((__uint32_t)0xffffffL)
-#define Bletch 4
-#define Ten_pmax 22
-#define Bndry_mask  ((__uint32_t)0xefffffL)
-#define Bndry_mask1 ((__uint32_t)0xffffffL)
-#define LSB 1
-#define Sign_bit ((__uint32_t)0x80000000L)
-#define Log2P 4
-#define Tiny0 ((__uint32_t)0x100000L)
-#define Tiny1 0
-#define Quick_max 14
-#define Int_max 15
-#else /* VAX */
-#define Exp_shift  23
-#define Exp_shift1 7
-#define Exp_msk1    0x80
-#define Exp_msk11   ((__uint32_t)0x800000L)
-#define Exp_mask  ((__uint32_t)0x7f80L)
-#define P 56
-#define Bias 129
-#define Exp_1  ((__uint32_t)0x40800000L)
-#define Exp_11 ((__uint32_t)0x4080L)
-#define Ebits 8
-#define Frac_mask  ((__uint32_t)0x7fffffL)
-#define Frac_mask1 ((__uint32_t)0xffff007fL)
-#define Ten_pmax 24
-#define Bletch 2
-#define Bndry_mask  ((__uint32_t)0xffff007fL)
-#define Bndry_mask1 ((__uint32_t)0xffff007fL)
-#define LSB ((__uint32_t)0x10000L)
-#define Sign_bit ((__uint32_t)0x8000L)
-#define Log2P 1
-#define Tiny0 0x80
-#define Tiny1 0
-#define Quick_max 15
-#define Int_max 15
-#endif
-#endif
-
-#ifndef IEEE_Arith
-#define ROUND_BIASED
-#endif
-
-#ifdef RND_PRODQUOT
-#define rounded_product(a,b) a = rnd_prod(a, b)
-#define rounded_quotient(a,b) a = rnd_quot(a, b)
-#ifdef KR_headers
-extern double rnd_prod(), rnd_quot();
-#else
-extern double rnd_prod(double, double), rnd_quot(double, double);
-#endif
-#else
-#define rounded_product(a,b) a *= b
-#define rounded_quotient(a,b) a /= b
-#endif
-
-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
-#define Big1 ((__uint32_t)0xffffffffL)
-
-#ifndef Just_16
-/* When Pack_32 is not defined, we store 16 bits per 32-bit long.
- * This makes some inner loops simpler and sometimes saves work
- * during multiplications, but it often seems to make things slightly
- * slower.  Hence the default is now to store 32 bits per long.
- */
-
-#ifndef Pack_32
-#define Pack_32
-#endif
-#endif
-
-
-#define MAX_BIGNUMS 16
-#define MAX_BIGNUM_WDS 32
-
-struct _Jv_Bigint 
-{
-  struct _Jv_Bigint *_next;
-  int _k, _maxwds, _sign, _wds;
-  unsigned long _x[MAX_BIGNUM_WDS];
-};
-
-
-#define        _PTR            void *
-#define        _AND            ,
-#define        _NOARGS         void
-#define        _CONST          const
-#define        _VOLATILE       volatile
-#define        _SIGNED         signed
-#define        _DOTS           , ...
-#define _VOID void
-#define        _EXFUN(name, proto)             name proto
-#define        _DEFUN(name, arglist, args)     name(args)
-#define        _DEFUN_VOID(name)               name(_NOARGS)
-#define _CAST_VOID (void)
-
-
-struct _Jv_reent
-{
-  /* local copy of errno */
-  int _errno;
-
-  /* used by mprec routines */
-  struct _Jv_Bigint *_result;
-  int _result_k;
-  struct _Jv_Bigint *_p5s;
-
-  struct _Jv_Bigint _freelist[MAX_BIGNUMS];
-  int _allocation_map;
-
-  int num;
-};
-
-
-typedef struct _Jv_Bigint _Jv_Bigint;
-
-#define Balloc  _Jv_Balloc
-#define Bfree   _Jv_Bfree
-#define multadd _Jv_multadd
-#define s2b     _Jv_s2b
-#define lo0bits _Jv_lo0bits
-#define hi0bits _Jv_hi0bits
-#define i2b     _Jv_i2b
-#define mult    _Jv_mult
-#define pow5mult        _Jv_pow5mult
-#define lshift  _Jv_lshift
-#define cmp     _Jv__mcmp
-#define diff    _Jv__mdiff
-#define ulp     _Jv_ulp
-#define b2d     _Jv_b2d
-#define d2b     _Jv_d2b
-#define ratio   _Jv_ratio
-
-#define tens _Jv__mprec_tens
-#define bigtens _Jv__mprec_bigtens
-#define tinytens _Jv__mprec_tinytens
-
-#define _dtoa _Jv_dtoa
-#define _dtoa_r _Jv_dtoa_r
-#define _strtod_r _Jv_strtod_r
-
-extern double _EXFUN(_strtod_r, (struct _Jv_reent *ptr, const char *s00, char **se));
-extern char* _EXFUN(_dtoa_r, (struct _Jv_reent *ptr, double d, 
-                             int mode, int ndigits, int *decpt, int *sign, 
-                             char **rve, int float_type));
-void _EXFUN(_dtoa, (double d, int mode, int ndigits, int *decpt, int *sign, 
-                   char **rve, char *buf, int float_type));
-
-double                 _EXFUN(ulp,(double x));
-double         _EXFUN(b2d,(_Jv_Bigint *a , int *e));
-_Jv_Bigint *   _EXFUN(Balloc,(struct _Jv_reent *p, int k));
-void           _EXFUN(Bfree,(struct _Jv_reent *p, _Jv_Bigint *v));
-_Jv_Bigint *   _EXFUN(multadd,(struct _Jv_reent *p, _Jv_Bigint *, int, int));
-_Jv_Bigint *   _EXFUN(s2b,(struct _Jv_reent *, const char*, int, int, unsigned long));
-_Jv_Bigint *   _EXFUN(i2b,(struct _Jv_reent *,int));
-_Jv_Bigint *   _EXFUN(mult, (struct _Jv_reent *, _Jv_Bigint *, _Jv_Bigint *));
-_Jv_Bigint *   _EXFUN(pow5mult, (struct _Jv_reent *, _Jv_Bigint *, int k));
-int            _EXFUN(hi0bits,(unsigned long));
-int            _EXFUN(lo0bits,(unsigned long *));
-_Jv_Bigint *    _EXFUN(d2b,(struct _Jv_reent *p, double d, int *e, int *bits));
-_Jv_Bigint *    _EXFUN(lshift,(struct _Jv_reent *p, _Jv_Bigint *b, int k));
-_Jv_Bigint *    _EXFUN(diff,(struct _Jv_reent *p, _Jv_Bigint *a, _Jv_Bigint *b));
-int             _EXFUN(cmp,(_Jv_Bigint *a, _Jv_Bigint *b));
-
-double         _EXFUN(ratio,(_Jv_Bigint *a, _Jv_Bigint *b));
-#define Bcopy(x,y) memcpy((char *)&x->_sign, (char *)&y->_sign, y->_wds*sizeof(long) + 2*sizeof(int))
-
-#if defined(_DOUBLE_IS_32BITS) && defined(__v800)
-#define n_bigtens 2
-#else
-#define n_bigtens 5
-#endif
-
-extern _CONST double tinytens[];
-extern _CONST double bigtens[];
-extern _CONST double tens[];
-
-#ifdef __cplusplus
-}
-#endif
-
+#if defined HAVE_STDINT_H
+#include <stdint.h>
+#elif defined HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if defined HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#if defined HAVE_SYS_CONFIG_H
+#include <sys/config.h>
+
+/* ISO C9X int type declarations */
+
+#if !defined HAVE_INT32_DEFINED && defined HAVE_BSD_INT32_DEFINED
+typedef u_int32_t uint32_t;
+#endif
+
+#if !defined HAVE_BSD_INT32_DEFINED && !defined HAVE_INT32_DEFINED
+// FIXME -- this could have problems with systems that don't define SI to be 4
+typedef int int32_t __attribute__((mode(SI)));
+typedef unsigned int uint32_t __attribute__((mode(SI)));
+#endif
+
+  /* These typedefs are true for the targets running Java. */
+
+#define Sign_Extend(a,b) if (b < 0) a |= (uint32_t)0xffff0000;
+  uint32_t i[2];
+#if defined (_DOUBLE_IS_32BITS)
+#define Exp_msk1    ((uint32_t)0x00800000L)
+#define Exp_msk11   ((uint32_t)0x00800000L)
+#define Exp_mask    ((uint32_t)0x7f800000L)
+#define Exp_1       ((uint32_t)0x3f800000L)
+#define Exp_11      ((uint32_t)0x3f800000L)
+#define Frac_mask   ((uint32_t)0x007fffffL)
+#define Frac_mask1  ((uint32_t)0x007fffffL)
+#define Sign_bit    ((uint32_t)0x80000000L)
+#define Bndry_mask  ((uint32_t)0x007fffffL)
+#define Bndry_mask1 ((uint32_t)0x007fffffL)
+#define Sign_bit    ((uint32_t)0x80000000L)
+#define Infinite(x) (word0(x) == ((uint32_t)0x7f800000L))
+#define Exp_msk1    ((uint32_t)0x100000L)
+#define Exp_msk11   ((uint32_t)0x100000L)
+#define Exp_mask  ((uint32_t)0x7ff00000L)
+#define Exp_1  ((uint32_t)0x3ff00000L)
+#define Exp_11 ((uint32_t)0x3ff00000L)
+#define Frac_mask  ((uint32_t)0xfffffL)
+#define Frac_mask1 ((uint32_t)0xfffffL)
+#define Bndry_mask  ((uint32_t)0xfffffL)
+#define Bndry_mask1 ((uint32_t)0xfffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Infinite(x) (word0(x) == ((uint32_t)0x7ff00000L)) /* sufficient test for here */
+#define Exp_msk1   ((uint32_t)0x1000000L)
+#define Exp_msk11  ((uint32_t)0x1000000L)
+#define Exp_mask  ((uint32_t)0x7f000000L)
+#define Exp_1  ((uint32_t)0x41000000L)
+#define Exp_11 ((uint32_t)0x41000000L)
+#define Frac_mask  ((uint32_t)0xffffffL)
+#define Frac_mask1 ((uint32_t)0xffffffL)
+#define Bndry_mask  ((uint32_t)0xefffffL)
+#define Bndry_mask1 ((uint32_t)0xffffffL)
+#define Sign_bit ((uint32_t)0x80000000L)
+#define Tiny0 ((uint32_t)0x100000L)
+#define Exp_msk11   ((uint32_t)0x800000L)
+#define Exp_mask  ((uint32_t)0x7f80L)
+#define Exp_1  ((uint32_t)0x40800000L)
+#define Exp_11 ((uint32_t)0x4080L)
+#define Frac_mask  ((uint32_t)0x7fffffL)
+#define Frac_mask1 ((uint32_t)0xffff007fL)
+#define Bndry_mask  ((uint32_t)0xffff007fL)
+#define Bndry_mask1 ((uint32_t)0xffff007fL)
+#define LSB ((uint32_t)0x10000L)
+#define Sign_bit ((uint32_t)0x8000L)
+#define Big1 ((uint32_t)0xffffffffL)
+struct _Jv_Bigint
+extern char* _EXFUN(_dtoa_r, (struct _Jv_reent *ptr, double d,
+                             int mode, int ndigits, int *decpt, int *sign,
+void _EXFUN(_dtoa, (double d, int mode, int ndigits, int *decpt, int *sign,
index b1410ecca5576b59770eff5c01b00c5cc08e64a7..92f03286062eccb101ea81574ccb5f7fb617ec16 100644 (file)
-
-/* @(#)s_atan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- *
- */
-
-/*
-FUNCTION
-        <<atan>>, <<atanf>>---arc tangent
-
-INDEX
-   atan
-INDEX
-   atanf
-
-ANSI_SYNOPSIS
-        #include <math.h>
-        double atan(double <[x]>);
-        float atanf(float <[x]>);
-
-TRAD_SYNOPSIS
-        #include <math.h>
-        double atan(<[x]>);
-        double <[x]>;
-
-        float atanf(<[x]>);
-        float <[x]>;
-
-DESCRIPTION
-
-<<atan>> computes the inverse tangent (arc tangent) of the input value.
-
-<<atanf>> is identical to <<atan>>, save that it operates on <<floats>>.
-
-RETURNS
-@ifinfo
-<<atan>> returns a value in radians, in the range of -pi/2 to pi/2.
-@end ifinfo
-@tex
-<<atan>> returns a value in radians, in the range of $-\pi/2$ to $\pi/2$.
-@end tex
-
-PORTABILITY
-<<atan>> is ANSI C.  <<atanf>> is an extension.
-
-*/
-
-/* atan(x)
- * Method
- *   1. Reduce x to positive by atan(x) = -atan(-x).
- *   2. According to the integer k=4t+0.25 chopped, t=x, the argument
- *      is further reduced to one of the following intervals and the
- *      arctangent of t is evaluated by the corresponding formula:
- *
- *      [0,7/16]      atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
- *      [7/16,11/16]  atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
- *      [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
- *      [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
- *      [39/16,INF]   atan(x) = atan(INF) + atan( -1/t )
- *
- * Constants:
- * The hexadecimal values are the intended ones for the following 
- * constants. The decimal values may be used, provided that the 
- * compiler will convert from decimal to binary accurately enough 
- * to produce the hexadecimal values shown.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double atanhi[] = {
-#else
-static double atanhi[] = {
-#endif
-  4.63647609000806093515e-01, /* atan(0.5)hi 0x3FDDAC67, 0x0561BB4F */
-  7.85398163397448278999e-01, /* atan(1.0)hi 0x3FE921FB, 0x54442D18 */
-  9.82793723247329054082e-01, /* atan(1.5)hi 0x3FEF730B, 0xD281F69B */
-  1.57079632679489655800e+00, /* atan(inf)hi 0x3FF921FB, 0x54442D18 */
-};
-
-#ifdef __STDC__
-static const double atanlo[] = {
-#else
-static double atanlo[] = {
-#endif
-  2.26987774529616870924e-17, /* atan(0.5)lo 0x3C7A2B7F, 0x222F65E2 */
-  3.06161699786838301793e-17, /* atan(1.0)lo 0x3C81A626, 0x33145C07 */
-  1.39033110312309984516e-17, /* atan(1.5)lo 0x3C700788, 0x7AF0CBBD */
-  6.12323399573676603587e-17, /* atan(inf)lo 0x3C91A626, 0x33145C07 */
-};
-
-#ifdef __STDC__
-static const double aT[] = {
-#else
-static double aT[] = {
-#endif
-  3.33333333333329318027e-01, /* 0x3FD55555, 0x5555550D */
- -1.99999999998764832476e-01, /* 0xBFC99999, 0x9998EBC4 */
-  1.42857142725034663711e-01, /* 0x3FC24924, 0x920083FF */
- -1.11111104054623557880e-01, /* 0xBFBC71C6, 0xFE231671 */
-  9.09088713343650656196e-02, /* 0x3FB745CD, 0xC54C206E */
- -7.69187620504482999495e-02, /* 0xBFB3B0F2, 0xAF749A6D */
-  6.66107313738753120669e-02, /* 0x3FB10D66, 0xA0D03D51 */
- -5.83357013379057348645e-02, /* 0xBFADDE2D, 0x52DEFD9A */
-  4.97687799461593236017e-02, /* 0x3FA97B4B, 0x24760DEB */
- -3.65315727442169155270e-02, /* 0xBFA2B444, 0x2C6A6C2F */
-  1.62858201153657823623e-02, /* 0x3F90AD3A, 0xE322DA11 */
-};
-
-#ifdef __STDC__
-       static const double 
-#else
-       static double 
-#endif
-one   = 1.0,
-huge   = 1.0e300;
-
-#ifdef __STDC__
-       double atan(double x)
-#else
-       double atan(x)
-       double x;
-#endif
-{
-       double w,s1,s2,z;
-       __int32_t ix,hx,id;
-
-       GET_HIGH_WORD(hx,x);
-       ix = hx&0x7fffffff;
-       if(ix>=0x44100000) {    /* if |x| >= 2^66 */
-           __uint32_t low;
-           GET_LOW_WORD(low,x);
-           if(ix>0x7ff00000||
-               (ix==0x7ff00000&&(low!=0)))
-               return x+x;             /* NaN */
-           if(hx>0) return  atanhi[3]+atanlo[3];
-           else     return -atanhi[3]-atanlo[3];
-       } if (ix < 0x3fdc0000) {        /* |x| < 0.4375 */
-           if (ix < 0x3e200000) {      /* |x| < 2^-29 */
-               if(huge+x>one) return x;        /* raise inexact */
-           }
-           id = -1;
-       } else {
-       x = fabs(x);
-       if (ix < 0x3ff30000) {          /* |x| < 1.1875 */
-           if (ix < 0x3fe60000) {      /* 7/16 <=|x|<11/16 */
-               id = 0; x = (2.0*x-one)/(2.0+x); 
-           } else {                    /* 11/16<=|x|< 19/16 */
-               id = 1; x  = (x-one)/(x+one); 
-           }
-       } else {
-           if (ix < 0x40038000) {      /* |x| < 2.4375 */
-               id = 2; x  = (x-1.5)/(one+1.5*x);
-           } else {                    /* 2.4375 <= |x| < 2^66 */
-               id = 3; x  = -1.0/x;
-           }
-       }}
-    /* end of argument reduction */
-       z = x*x;
-       w = z*z;
-    /* break sum from i=0 to 10 aT[i]z**(i+1) into odd and even poly */
-       s1 = z*(aT[0]+w*(aT[2]+w*(aT[4]+w*(aT[6]+w*(aT[8]+w*aT[10])))));
-       s2 = w*(aT[1]+w*(aT[3]+w*(aT[5]+w*(aT[7]+w*aT[9]))));
-       if (id<0) return x - x*(s1+s2);
-       else {
-           z = atanhi[id] - ((x*(s1+s2) - atanlo[id]) - x);
-           return (hx<0)? -z:z;
-       }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ * The hexadecimal values are the intended ones for the following
+ * constants. The decimal values may be used, provided that the
+ * compiler will convert from decimal to binary accurately enough
+       static const double
+       static double
+       int32_t ix,hx,id;
+           uint32_t low;
+               id = 0; x = (2.0*x-one)/(2.0+x);
+               id = 1; x  = (x-one)/(x+one);
index 1476ef821bef868caefff3d6c3dfefacedae49fc..8e60601f2be11f32278dac817952162b4b11e340 100644 (file)
@@ -1,80 +1,7 @@
-
-/* @(#)s_ceil.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
- * ceil(x)
- * Return x rounded toward -inf to integral value
- * Method:
- *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to ceil(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double huge = 1.0e300;
-#else
-static double huge = 1.0e300;
-#endif
-
-#ifdef __STDC__
-       double ceil(double x)
-#else
-       double ceil(x)
-       double x;
-#endif
-{
-       __int32_t i0,i1,j0;
-       __uint32_t i,j;
-       EXTRACT_WORDS(i0,i1,x);
-       j0 = ((i0>>20)&0x7ff)-0x3ff;
-       if(j0<20) {
-           if(j0<0) {  /* raise inexact if x != 0 */
-               if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
-                   if(i0<0) {i0=0x80000000;i1=0;} 
-                   else if((i0|i1)!=0) { i0=0x3ff00000;i1=0;}
-               }
-           } else {
-               i = (0x000fffff)>>j0;
-               if(((i0&i)|i1)==0) return x; /* x is integral */
-               if(huge+x>0.0) {        /* raise inexact flag */
-                   if(i0>0) i0 += (0x00100000)>>j0;
-                   i0 &= (~i); i1=0;
-               }
-           }
-       } else if (j0>51) {
-           if(j0==0x400) return x+x;   /* inf or NaN */
-           else return x;              /* x is integral */
-       } else {
-           i = ((__uint32_t)(0xffffffff))>>(j0-20);
-           if((i1&i)==0) return x;     /* x is integral */
-           if(huge+x>0.0) {            /* raise inexact flag */
-               if(i0>0) {
-                   if(j0==20) i0+=1; 
-                   else {
-                       j = i1 + (1<<(52-j0));
-                       if(j<(__uint32_t)i1) i0+=1;     /* got a carry */
-                       i1 = j;
-                   }
-               }
-               i1 &= (~i);
-           }
-       }
-       INSERT_WORDS(x,i0,i1);
-       return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+       int32_t i0,i1,j0;
+       uint32_t i,j;
+                   if(i0<0) {i0=0x80000000;i1=0;}
+           i = ((uint32_t)(0xffffffff))>>(j0-20);
+                   if(j0==20) i0+=1;
+                       if(j<(uint32_t)i1) i0+=1;       /* got a carry */
index bfc546db503408c05cfbae9be74a74fb91be8790..065cd8b52e00e32dedf5fc0b5f040a7661e8db8e 100644 (file)
@@ -1,82 +1,2 @@
-
-/* @(#)s_copysign.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<copysign>>, <<copysignf>>---sign of <[y]>, magnitude of <[x]>
-
-INDEX
-       copysign
-INDEX
-       copysignf
-
-ANSI_SYNOPSIS
-       #include <math.h>
-       double copysign (double <[x]>, double <[y]>);
-       float copysignf (float <[x]>, float <[y]>);
-
-TRAD_SYNOPSIS
-       #include <math.h>
-       double copysign (<[x]>, <[y]>)
-       double <[x]>;
-       double <[y]>;
-
-       float copysignf (<[x]>, <[y]>)
-       float <[x]>;
-       float <[y]>;
-
-DESCRIPTION
-<<copysign>> constructs a number with the magnitude (absolute value)
-of its first argument, <[x]>, and the sign of its second argument,
-<[y]>.
-
-<<copysignf>> does the same thing; the two functions differ only in
-the type of their arguments and result.
-
-RETURNS
-<<copysign>> returns a <<double>> with the magnitude of
-<[x]> and the sign of <[y]>.
-<<copysignf>> returns a <<float>> with the magnitude of
-<[x]> and the sign of <[y]>.
-
-PORTABILITY
-<<copysign>> is not required by either ANSI C or the System V Interface
-Definition (Issue 2).
-
-*/
-
-/*
- * copysign(double x, double y)
- * copysign(x,y) returns a value with the magnitude of x and
- * with the sign bit of y.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double copysign(double x, double y)
-#else
-       double copysign(x,y)
-       double x,y;
-#endif
-{
-       __uint32_t hx,hy;
-       GET_HIGH_WORD(hx,x);
-       GET_HIGH_WORD(hy,y);
-       SET_HIGH_WORD(x,(hx&0x7fffffff)|(hy&0x80000000));
-        return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+       uint32_t hx,hy;
index c471233013742423dde42e86f12bd7e11fd1cfdc..1ab61b1813af5d40ee28c309650fa3b5d3ef9d15 100644 (file)
@@ -1,82 +1,5 @@
-
-/* @(#)s_cos.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/* cos(x)
- * Return cosine function of x.
- *
- * kernel function:
- *     __kernel_sin            ... sine function on [-pi/4,pi/4]
- *     __kernel_cos            ... cosine function on [-pi/4,pi/4]
- *     __ieee754_rem_pio2      ... argument reduction routine
- *
- * Method.
- *      Let S,C and T denote the sin, cos and tan respectively on 
- *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 
- *     in [-pi/4 , +pi/4], and let n = k mod 4.
- *     We have
- *
- *          n        sin(x)      cos(x)        tan(x)
- *     ----------------------------------------------------------
- *         0          S           C             T
- *         1          C          -S            -1/T
- *         2         -S          -C             T
- *         3         -C           S            -1/T
- *     ----------------------------------------------------------
- *
- * Special cases:
- *      Let trig be any of sin, cos, or tan.
- *      trig(+-INF)  is NaN, with signals;
- *      trig(NaN)    is that NaN;
- *
- * Accuracy:
- *     TRIG(x) returns trig(x) nearly rounded 
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double cos(double x)
-#else
-       double cos(x)
-       double x;
-#endif
-{
-       double y[2],z=0.0;
-       __int32_t n,ix;
-
-    /* High word of x. */
-       GET_HIGH_WORD(ix,x);
-
-    /* |x| ~< pi/4 */
-       ix &= 0x7fffffff;
-       if(ix <= 0x3fe921fb) return __kernel_cos(x,z);
-
-    /* cos(Inf or NaN) is NaN */
-       else if (ix>=0x7ff00000) return x-x;
-
-    /* argument reduction needed */
-       else {
-           n = __ieee754_rem_pio2(x,y);
-           switch(n&3) {
-               case 0: return  __kernel_cos(y[0],y[1]);
-               case 1: return -__kernel_sin(y[0],y[1],1);
-               case 2: return -__kernel_cos(y[0],y[1]);
-               default:
-                       return  __kernel_sin(y[0],y[1],1);
-           }
-       }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     TRIG(x) returns trig(x) nearly rounded
+       int32_t n,ix;
index 95b871ca53acc82c64ee5531fac54d7f34b90a5f..1c3fba62daf41c1b71a908622686f8c379018cac 100644 (file)
@@ -1,73 +1,5 @@
-
-/* @(#)s_fabs.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
-FUNCTION
-       <<fabs>>, <<fabsf>>---absolute value (magnitude)
-INDEX
-       fabs
-INDEX
-       fabsf
-
-ANSI_SYNOPSIS
-       #include <math.h>
-       double fabs(double <[x]>);
-       float fabsf(float <[x]>);
-
-TRAD_SYNOPSIS
-       #include <math.h>
-       double fabs(<[x]>) 
-       double <[x]>;
-
-       float fabsf(<[x]>)
-       float <[x]>;
-
-DESCRIPTION
-<<fabs>> and <<fabsf>> calculate 
-@tex
-$|x|$, 
-@end tex
-the absolute value (magnitude) of the argument <[x]>, by direct
-manipulation of the bit representation of <[x]>.
-
-RETURNS
-The calculated value is returned.  No errors are detected.
-
-PORTABILITY
-<<fabs>> is ANSI.
-<<fabsf>> is an extension.
-
-*/
-
-/*
- * fabs(x) returns the absolute value of x.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double fabs(double x)
-#else
-       double fabs(x)
-       double x;
-#endif
-{
-       __uint32_t high;
-       GET_HIGH_WORD(high,x);
-       SET_HIGH_WORD(x,high&0x7fffffff);
-        return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+       double fabs(<[x]>)
+<<fabs>> and <<fabsf>> calculate
+$|x|$,
+       uint32_t high;
index 86f73e0e13627ca2ca369f2e99f3fa60a6e1faa5..73909b3008a147bb0d5b04b430efe3d60ee23ea2 100644 (file)
-
-/* @(#)s_floor.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<floor>>, <<floorf>>, <<ceil>>, <<ceilf>>---floor and ceiling
-INDEX
-       floor
-INDEX
-       floorf
-INDEX
-       ceil
-INDEX
-       ceilf
-
-ANSI_SYNOPSIS
-       #include <math.h>
-       double floor(double <[x]>);
-        float floorf(float <[x]>);
-        double ceil(double <[x]>);
-        float ceilf(float <[x]>);
-
-TRAD_SYNOPSIS
-       #include <math.h>
-        double floor(<[x]>)
-       double <[x]>;
-        float floorf(<[x]>) 
-       float <[x]>;
-        double ceil(<[x]>) 
-       double <[x]>;
-        float ceilf(<[x]>) 
-       float <[x]>;
-
-DESCRIPTION
-<<floor>> and <<floorf>> find 
-@tex
-$\lfloor x \rfloor$, 
-@end tex
-the nearest integer less than or equal to <[x]>.
-<<ceil>> and <<ceilf>> find 
-@tex
-$\lceil x\rceil$,
-@end tex
-the nearest integer greater than or equal to <[x]>.
-
-RETURNS
-<<floor>> and <<ceil>> return the integer result as a double.
-<<floorf>> and <<ceilf>> return the integer result as a float.
-
-PORTABILITY
-<<floor>> and <<ceil>> are ANSI.
-<<floorf>> and <<ceilf>> are extensions.
-
-
-*/
-
-/*
- * floor(x)
- * Return x rounded toward -inf to integral value
- * Method:
- *     Bit twiddling.
- * Exception:
- *     Inexact flag raised if x not equal to floor(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double huge = 1.0e300;
-#else
-static double huge = 1.0e300;
-#endif
-
-#ifdef __STDC__
-       double floor(double x)
-#else
-       double floor(x)
-       double x;
-#endif
-{
-       __int32_t i0,i1,j0;
-       __uint32_t i,j;
-       EXTRACT_WORDS(i0,i1,x);
-       j0 = ((i0>>20)&0x7ff)-0x3ff;
-       if(j0<20) {
-           if(j0<0) {  /* raise inexact if x != 0 */
-               if(huge+x>0.0) {/* return 0*sign(x) if |x|<1 */
-                   if(i0>=0) {i0=i1=0;} 
-                   else if(((i0&0x7fffffff)|i1)!=0)
-                       { i0=0xbff00000;i1=0;}
-               }
-           } else {
-               i = (0x000fffff)>>j0;
-               if(((i0&i)|i1)==0) return x; /* x is integral */
-               if(huge+x>0.0) {        /* raise inexact flag */
-                   if(i0<0) i0 += (0x00100000)>>j0;
-                   i0 &= (~i); i1=0;
-               }
-           }
-       } else if (j0>51) {
-           if(j0==0x400) return x+x;   /* inf or NaN */
-           else return x;              /* x is integral */
-       } else {
-           i = ((__uint32_t)(0xffffffff))>>(j0-20);
-           if((i1&i)==0) return x;     /* x is integral */
-           if(huge+x>0.0) {            /* raise inexact flag */
-               if(i0<0) {
-                   if(j0==20) i0+=1; 
-                   else {
-                       j = i1+(1<<(52-j0));
-                       if(j<(__uint32_t)i1) i0 +=1 ;   /* got a carry */
-                       i1=j;
-                   }
-               }
-               i1 &= (~i);
-           }
-       }
-       INSERT_WORDS(x,i0,i1);
-       return x;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+        float floorf(<[x]>)
+        double ceil(<[x]>)
+        float ceilf(<[x]>)
+<<floor>> and <<floorf>> find
+$\lfloor x \rfloor$,
+<<ceil>> and <<ceilf>> find
+       int32_t i0,i1,j0;
+       uint32_t i,j;
+                   if(i0>=0) {i0=i1=0;}
+           i = ((uint32_t)(0xffffffff))>>(j0-20);
+                   if(j0==20) i0+=1;
+                       if(j<(uint32_t)i1) i0 +=1 ;     /* got a carry */
index 9936a49b8018f28cf5bc99a22d0ddd49f6e57c19..8cd17e6ed3733b5cb18e33ca1aea39d9a81773f7 100644 (file)
@@ -1,87 +1,6 @@
-
-/* @(#)s_rint.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
- * rint(x)
- * Return x rounded to integral value according to the prevailing
- * rounding mode.
- * Method:
- *     Using floating addition.
- * Exception:
- *     Inexact flag raised if x not equal to rint(x).
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double 
-#endif
-TWO52[2]={
-  4.50359962737049600000e+15, /* 0x43300000, 0x00000000 */
- -4.50359962737049600000e+15, /* 0xC3300000, 0x00000000 */
-};
-
-#ifdef __STDC__
-       double rint(double x)
-#else
-       double rint(x)
-       double x;
-#endif
-{
-       __int32_t i0,j0,sx;
-       __uint32_t i,i1;
-       double t;
-       volatile double w;
-       EXTRACT_WORDS(i0,i1,x);
-       sx = (i0>>31)&1;
-       j0 = ((i0>>20)&0x7ff)-0x3ff;
-       if(j0<20) {
-           if(j0<0) {  
-               if(((i0&0x7fffffff)|i1)==0) return x;
-               i1 |= (i0&0x0fffff);
-               i0 &= 0xfffe0000;
-               i0 |= ((i1|-i1)>>12)&0x80000;
-               SET_HIGH_WORD(x,i0);
-               w = TWO52[sx]+x;
-               t =  w-TWO52[sx];
-               GET_HIGH_WORD(i0,t);
-               SET_HIGH_WORD(t,(i0&0x7fffffff)|(sx<<31));
-               return t;
-           } else {
-               i = (0x000fffff)>>j0;
-               if(((i0&i)|i1)==0) return x; /* x is integral */
-               i>>=1;
-               if(((i0&i)|i1)!=0) {
-                   if(j0==19) i1 = 0x40000000; else
-                   i0 = (i0&(~i))|((0x20000)>>j0);
-               }
-           }
-       } else if (j0>51) {
-           if(j0==0x400) return x+x;   /* inf or NaN */
-           else return x;              /* x is integral */
-       } else {
-           i = ((__uint32_t)(0xffffffff))>>(j0-20);
-           if((i1&i)==0) return x;     /* x is integral */
-           i>>=1;
-           if((i1&i)!=0) i1 = (i1&(~i))|((0x40000000)>>(j0-20));
-       }
-       INSERT_WORDS(x,i0,i1);
-       w = TWO52[sx]+x;
-       return w-TWO52[sx];
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+static double
+       int32_t i0,j0,sx;
+       uint32_t i,i1;
+           if(j0<0) {
+           i = ((uint32_t)(0xffffffff))>>(j0-20);
index b06834e913fda6b298c77ed945a9017240c419ec..29f150e315d7a5e416c1d1b27fa280d153307944 100644 (file)
@@ -1,104 +1,8 @@
-
-/* @(#)s_scalbn.c 5.1 93/09/24 */
+ * software is freely granted, provided that this notice
 /*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
-FUNCTION
-<<scalbn>>, <<scalbnf>>---scale by integer
-INDEX
-       scalbn
-INDEX
-       scalbnf
-
-ANSI_SYNOPSIS
-       #include <math.h>
-       double scalbn(double <[x]>, int <[y]>);
-       float scalbnf(float <[x]>, int <[y]>);
-
-TRAD_SYNOPSIS
-       #include <math.h>
-       double scalbn(<[x]>,<[y]>)
-       double <[x]>;
-       int <[y]>;
-       float scalbnf(<[x]>,<[y]>)
-       float <[x]>;
-       int <[y]>;
-
-DESCRIPTION
-<<scalbn>> and <<scalbnf>> scale <[x]> by <[n]>, returning <[x]> times
-2 to the power <[n]>.  The result is computed by manipulating the
-exponent, rather than by actually performing an exponentiation or
-multiplication.
-
-RETURNS
-<[x]> times 2 to the power <[n]>.
-
-PORTABILITY
-Neither <<scalbn>> nor <<scalbnf>> is required by ANSI C or by the System V
-Interface Definition (Issue 2).
-
-*/
-
-/* 
- * scalbn (double x, int n)
- * scalbn(x,n) returns x* 2**n  computed by  exponent  
- * manipulation rather than by actually performing an 
- * exponentiation or a multiplication.
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-static const double
-#else
-static double
-#endif
-two54   =  1.80143985094819840000e+16, /* 0x43500000, 0x00000000 */
-twom54  =  5.55111512312578270212e-17, /* 0x3C900000, 0x00000000 */
-huge   = 1.0e+300,
-tiny   = 1.0e-300;
-
-#ifdef __STDC__
-       double scalbn (double x, int n)
-#else
-       double scalbn (x,n)
-       double x; int n;
-#endif
-{
-       __int32_t  k,hx,lx;
-       EXTRACT_WORDS(hx,lx,x);
-        k = (hx&0x7ff00000)>>20;               /* extract exponent */
-        if (k==0) {                            /* 0 or subnormal x */
-            if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */
-           x *= two54; 
-           GET_HIGH_WORD(hx,x);
-           k = ((hx&0x7ff00000)>>20) - 54; 
-            if (n< -50000) return tiny*x;      /*underflow*/
-           }
-        if (k==0x7ff) return x+x;              /* NaN or Inf */
-        k = k+n; 
-        if (k >  0x7fe) return huge*copysign(huge,x); /* overflow  */
-        if (k > 0)                             /* normal result */
-           {SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20)); return x;}
-        if (k <= -54) {
-            if (n > 50000)     /* in case integer overflow in n+k */
-               return huge*copysign(huge,x);   /*overflow*/
-           else return tiny*copysign(tiny,x);  /*underflow*/
-       }
-        k += 54;                               /* subnormal result */
-       SET_HIGH_WORD(x,(hx&0x800fffff)|(k<<20));
-        return x*twom54;
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * scalbn(x,n) returns x* 2**n  computed by  exponent
+ * manipulation rather than by actually performing an
+       int32_t  k,hx,lx;
+           x *= two54;
+           k = ((hx&0x7ff00000)>>20) - 54;
+        k = k+n;
index 28259f378fee2f23e03d40e6eda8acb958dc4904..07216d45481d13362f7c43cea597a4a93b4aaaad 100644 (file)
@@ -1,132 +1,8 @@
-
-/* @(#)s_sin.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
-FUNCTION
-        <<sin>>, <<sinf>>, <<cos>>, <<cosf>>---sine or cosine
-INDEX
-sin
-INDEX
-sinf
-INDEX
-cos
-INDEX
-cosf
-ANSI_SYNOPSIS
-        #include <math.h>
-        double sin(double <[x]>);
-        float  sinf(float <[x]>);
-        double cos(double <[x]>);
-        float cosf(float <[x]>);
-
-TRAD_SYNOPSIS
-        #include <math.h>
-        double sin(<[x]>)
-        double <[x]>;
-        float  sinf(<[x]>)
-        float <[x]>;
-
-        double cos(<[x]>)
-        double <[x]>;
-        float cosf(<[x]>)
-        float <[x]>;
-
-DESCRIPTION
-       <<sin>> and <<cos>> compute (respectively) the sine and cosine
-       of the argument <[x]>.  Angles are specified in radians. 
-
-       <<sinf>> and <<cosf>> are identical, save that they take and
-       return <<float>> values. 
-
-
-RETURNS
-       The sine or cosine of <[x]> is returned.
-
-PORTABILITY
-       <<sin>> and <<cos>> are ANSI C. 
-       <<sinf>> and <<cosf>> are extensions.
-
-QUICKREF
-       sin ansi pure
-       sinf - pure
-*/
-
-/* sin(x)
- * Return sine function of x.
- *
- * kernel function:
- *     __kernel_sin            ... sine function on [-pi/4,pi/4]
- *     __kernel_cos            ... cose function on [-pi/4,pi/4]
- *     __ieee754_rem_pio2      ... argument reduction routine
- *
- * Method.
- *      Let S,C and T denote the sin, cos and tan respectively on 
- *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 
- *     in [-pi/4 , +pi/4], and let n = k mod 4.
- *     We have
- *
- *          n        sin(x)      cos(x)        tan(x)
- *     ----------------------------------------------------------
- *         0          S           C             T
- *         1          C          -S            -1/T
- *         2         -S          -C             T
- *         3         -C           S            -1/T
- *     ----------------------------------------------------------
- *
- * Special cases:
- *      Let trig be any of sin, cos, or tan.
- *      trig(+-INF)  is NaN, with signals;
- *      trig(NaN)    is that NaN;
- *
- * Accuracy:
- *     TRIG(x) returns trig(x) nearly rounded 
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double sin(double x)
-#else
-       double sin(x)
-       double x;
-#endif
-{
-       double y[2],z=0.0;
-       __int32_t n,ix;
-
-    /* High word of x. */
-       GET_HIGH_WORD(ix,x);
-
-    /* |x| ~< pi/4 */
-       ix &= 0x7fffffff;
-       if(ix <= 0x3fe921fb) return __kernel_sin(x,z,0);
-
-    /* sin(Inf or NaN) is NaN */
-       else if (ix>=0x7ff00000) return x-x;
-
-    /* argument reduction needed */
-       else {
-           n = __ieee754_rem_pio2(x,y);
-           switch(n&3) {
-               case 0: return  __kernel_sin(y[0],y[1],1);
-               case 1: return  __kernel_cos(y[0],y[1]);
-               case 2: return -__kernel_sin(y[0],y[1],1);
-               default:
-                       return -__kernel_cos(y[0],y[1]);
-           }
-       }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+       of the argument <[x]>.  Angles are specified in radians.
+       return <<float>> values.
+       <<sin>> and <<cos>> are ANSI C.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     TRIG(x) returns trig(x) nearly rounded
+       int32_t n,ix;
index 2959f416e835af4b3695a03cb4af5aa3098b2f22..79607fda7acbe70c16aa8fd0b014571ee84c6d00 100644 (file)
@@ -1,114 +1,8 @@
-
-/* @(#)s_tan.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-
-/*
-
-FUNCTION
-        <<tan>>, <<tanf>>---tangent
-
-INDEX
-tan
-INDEX
-tanf
-
-ANSI_SYNOPSIS
-        #include <math.h>
-        double tan(double <[x]>);
-        float tanf(float <[x]>);
-
-TRAD_SYNOPSIS
-        #include <math.h>
-        double tan(<[x]>)
-        double <[x]>;
-
-        float tanf(<[x]>)
-        float <[x]>;
-
-
-DESCRIPTION
-<<tan>> computes the tangent of the argument <[x]>.  
-Angles are specified in radians.  
-
-<<tanf>> is identical, save that it takes and returns <<float>> values.
-
-RETURNS
-The tangent of <[x]> is returned. 
-
-PORTABILITY
-<<tan>> is ANSI. <<tanf>> is an extension.
-*/
-
-/* tan(x)
- * Return tangent function of x.
- *
- * kernel function:
- *     __kernel_tan            ... tangent function on [-pi/4,pi/4]
- *     __ieee754_rem_pio2      ... argument reduction routine
- *
- * Method.
- *      Let S,C and T denote the sin, cos and tan respectively on 
- *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2 
- *     in [-pi/4 , +pi/4], and let n = k mod 4.
- *     We have
- *
- *          n        sin(x)      cos(x)        tan(x)
- *     ----------------------------------------------------------
- *         0          S           C             T
- *         1          C          -S            -1/T
- *         2         -S          -C             T
- *         3         -C           S            -1/T
- *     ----------------------------------------------------------
- *
- * Special cases:
- *      Let trig be any of sin, cos, or tan.
- *      trig(+-INF)  is NaN, with signals;
- *      trig(NaN)    is that NaN;
- *
- * Accuracy:
- *     TRIG(x) returns trig(x) nearly rounded 
- */
-
-#include "fdlibm.h"
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double tan(double x)
-#else
-       double tan(x)
-       double x;
-#endif
-{
-       double y[2],z=0.0;
-       __int32_t n,ix;
-
-    /* High word of x. */
-       GET_HIGH_WORD(ix,x);
-
-    /* |x| ~< pi/4 */
-       ix &= 0x7fffffff;
-       if(ix <= 0x3fe921fb) return __kernel_tan(x,z,1);
-
-    /* tan(Inf or NaN) is NaN */
-       else if (ix>=0x7ff00000) return x-x;            /* NaN */
-
-    /* argument reduction needed */
-       else {
-           n = __ieee754_rem_pio2(x,y);
-           return __kernel_tan(y[0],y[1],1-((n&1)<<1)); /*   1 -- n even
-                                                       -1 -- n odd */
-       }
-}
-
-#endif /* _DOUBLE_IS_32BITS */
+ * software is freely granted, provided that this notice
+<<tan>> computes the tangent of the argument <[x]>.
+Angles are specified in radians.
+The tangent of <[x]> is returned.
+ *      Let S,C and T denote the sin, cos and tan respectively on
+ *     [-PI/4, +PI/4]. Reduce the argument x to y1+y2 = x-k*pi/2
+ *     TRIG(x) returns trig(x) nearly rounded
+       int32_t n,ix;
index e4769e0dc60aec159d5e4be90c026afe520d8b1d..f10425c7a36b99f0c68249da5b15749efe511d34 100644 (file)
@@ -1,80 +1,5 @@
-/* sf_rint.c -- float version of s_rint.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * 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 "fdlibm.h"
-
-#ifdef __STDC__
-static const float
-#else
-static float 
-#endif
-TWO23[2]={
-  8.3886080000e+06, /* 0x4b000000 */
- -8.3886080000e+06, /* 0xcb000000 */
-};
-
-#ifdef __STDC__
-       float rintf(float x)
-#else
-       float rintf(x)
-       float x;
-#endif
-{
-       __int32_t i0,j0,sx;
-       __uint32_t i,i1;
-       float w,t;
-       GET_FLOAT_WORD(i0,x);
-       sx = (i0>>31)&1;
-       j0 = ((i0>>23)&0xff)-0x7f;
-       if(j0<23) {
-           if(j0<0) {  
-               if((i0&0x7fffffff)==0) return x;
-               i1 = (i0&0x07fffff);
-               i0 &= 0xfff00000;
-               i0 |= ((i1|-i1)>>9)&0x400000;
-               SET_FLOAT_WORD(x,i0);
-               w = TWO23[sx]+x;
-               t =  w-TWO23[sx];
-               GET_FLOAT_WORD(i0,t);
-               SET_FLOAT_WORD(t,(i0&0x7fffffff)|(sx<<31));
-               return t;
-           } else {
-               i = (0x007fffff)>>j0;
-               if((i0&i)==0) return x; /* x is integral */
-               i>>=1;
-               if((i0&i)!=0) i0 = (i0&(~i))|((0x100000)>>j0);
-           }
-       } else {
-           if(j0==0x80) return x+x;    /* inf or NaN */
-           else return x;              /* x is integral */
-       }
-       SET_FLOAT_WORD(x,i0);
-       w = TWO23[sx]+x;
-       return w-TWO23[sx];
-}
-
-#ifdef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
-       double rint(double x)
-#else
-       double rint(x)
-       double x;
-#endif
-{
-       return (double) rintf((float) x);
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
+ * software is freely granted, provided that this notice
+static float
+       int32_t i0,j0,sx;
+       uint32_t i,i1;
+           if(j0<0) {