git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2368 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2002-04-12 03:24:52 +00:00
parent 1aa67cb1d3
commit be5524ae41
5 changed files with 119 additions and 11 deletions

View File

@ -1,3 +1,16 @@
Fri Apr 12 00:34:17 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* MANIFEST (missing/acosh.c): added.
* Makefile.in (missing/acosh.c): ditto.
* Makefile.in (missing/fileblocks.c): ditto.
* configure.in (AC_REPLACE_FUNCS): check acosh() on behalf of
inverse hyperbolic functions, asinh() and atanh().
* missing/acosh.c: added for acosh(), asinh() and atanh().
Thu Apr 11 19:10:37 2002 WATANABE Hirofumi <eban@ruby-lang.org> Thu Apr 11 19:10:37 2002 WATANABE Hirofumi <eban@ruby-lang.org>
* io.c (remain_size): IO#read returns "" if file.size == 0. * io.c (remain_size): IO#read returns "" if file.size == 0.

View File

@ -205,6 +205,7 @@ misc/inf-ruby.el
misc/ruby-mode.el misc/ruby-mode.el
misc/rubydb2x.el misc/rubydb2x.el
misc/rubydb3x.el misc/rubydb3x.el
missing/acosh.c
missing/alloca.c missing/alloca.c
missing/crypt.c missing/crypt.c
missing/dup2.c missing/dup2.c

View File

@ -165,6 +165,9 @@ parse.c: parse.y
parse.@OBJEXT@: parse.c parse.@OBJEXT@: parse.c
acosh.@OBJEXT@: $(srcdir)/missing/acosh.c
$(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/acosh.c
alloca.@OBJEXT@: $(srcdir)/missing/alloca.c alloca.@OBJEXT@: $(srcdir)/missing/alloca.c
$(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/alloca.c $(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/alloca.c
@ -174,6 +177,9 @@ crypt.@OBJEXT@: $(srcdir)/missing/crypt.c
dup2.@OBJEXT@: $(srcdir)/missing/dup2.c dup2.@OBJEXT@: $(srcdir)/missing/dup2.c
$(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/dup2.c $(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/dup2.c
fileblocks.@OBJEXT@: $(srcdir)/missing/fileblocks.c
$(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/fileblocks.c
finite.@OBJEXT@: $(srcdir)/missing/finite.c finite.@OBJEXT@: $(srcdir)/missing/finite.c
$(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/finite.c $(CC) -I. $(CFLAGS) $(CPPFLAGS) -c $(srcdir)/missing/finite.c

View File

@ -301,7 +301,7 @@ AC_FUNC_FSEEKO
AC_CHECK_FUNCS(ftello) AC_CHECK_FUNCS(ftello)
AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\ AC_REPLACE_FUNCS(dup2 memmove mkdir strcasecmp strncasecmp strerror strftime\
strchr strstr strtoul crypt flock vsnprintf\ strchr strstr strtoul crypt flock vsnprintf\
isinf isnan finite hypot) isinf isnan finite hypot acosh)
AC_CHECK_FUNCS(fmod killpg drand48 random wait4 waitpid syscall chroot fsync\ AC_CHECK_FUNCS(fmod killpg drand48 random wait4 waitpid syscall chroot fsync\
truncate chsize times utimes fcntl lockf lstat symlink readlink\ truncate chsize times utimes fcntl lockf lstat symlink readlink\
setitimer setruid seteuid setreuid setresuid setproctitle\ setitimer setruid seteuid setreuid setresuid setproctitle\

88
missing/acosh.c Normal file
View File

@ -0,0 +1,88 @@
/**********************************************************************
acosh.c -
$Author$
$Date$
created at: Fri Apr 12 00:34:17 JST 2002
public domain rewrite of acosh(3), asinh(3) and atanh(3)
**********************************************************************/
#include <errno.h>
#include <float.h>
#include <math.h>
/* DBL_MANT_DIG must be less than 4 times of bits of int */
#ifdef DBL_MANT_DIG
#define DBL_MANT_DIG 53 /* in this case, at least 12 digit precision */
#endif
#define BIG_CRITERIA_BIT (1<<DBL_MANT_DIG/2)
#if BIG_CRITERIA_BIT > 0
#define BIG_CRITERIA (1.0*BIG_CRITERIA_BIT)
#else
#define BIG_CRITERIA (1.0*(1<<DBL_MANT_DIG/4)*(1<<(DBL_MANT_DIG/2+1-DBL_MANT_DIG/4)))
#endif
#define SMALL_CRITERIA_BIT (1<<(DBL_MANT_DIG/3))
#if SMALL_CRITERIA_BIT > 0
#define SMALL_CRITERIA (1.0/SMALL_CRITERIA_BIT)
#else
#define SMALL_CRITERIA (1.0*(1<<DBL_MANT_DIG/4)*(1<<(DBL_MANT_DIG/3+1-DBL_MANT_DIG/4)))
#endif
#ifndef HAVE_ACOSH
double
acosh(x)
double x;
{
if (x < 1)
x = -1; /* NaN */
else if (x == 1)
return 0;
else if (x > BIG_CRITERIA)
x += x;
else
x += sqrt((x + 1) * (x - 1));
return log(x);
}
#endif
#ifndef HAVE_ASINH
double
asinh(x)
double x;
{
int neg = x < 0;
double z = fabs(x);
if (z < SMALL_CRITERIA) return x;
if (z < (1.0/(1<<DBL_MANT_DIG/5))) {
double x2 = z * z;
z *= 1 + x2 * (-1.0/6.0 + x2 * 3.0/40.0);
}
else if (z > BIG_CRITERIA) {
z = log(z + z);
}
else {
z = log(z + sqrt(z * z + 1));
}
if (neg) z = -z;
return z;
}
#endif
#ifndef HAVE_ATANH
double
atanh(x)
double x;
{
int neg = x < 0;
double z = fabs(x);
if (z < SMALL_CRITERIA) return x;
z = log(z > 1 ? -1 : (1 + z) / (1 - z)) / 2;
if (neg) z = -z;
return z;
}
#endif