summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--configure.in2
-rw-r--r--ext/digest/sha2/sha2.c2
-rw-r--r--ext/readline/readline.c7
-rw-r--r--lib/complex.rb194
5 files changed, 123 insertions, 87 deletions
diff --git a/ChangeLog b/ChangeLog
index 506263be4f..ab28122fac 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,11 @@ Sat Jul 26 21:25:21 2003 NAKAMURA Usaku <usa@ruby-lang.org>
* win32/win32.c: remove some old comments.
+Sat Jul 26 14:26:57 2003 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * ext/tk/lib/tk.rb (TkCore::chooseDirectory): back up wrongly
+ removed method.
+
Sat Jul 26 14:14:12 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* ext/stringio/stringio.c: includes Enumerable as well as IO.
diff --git a/configure.in b/configure.in
index ea0a466111..970e61d0f8 100644
--- a/configure.in
+++ b/configure.in
@@ -750,7 +750,7 @@ if test "$with_dln_a_out" != yes; then
esac
else
case "$target_os" in
- hpux*) CCDLFLAGS='+z';;
+ hpux*) CCDLFLAGS='+Z';;
solaris*|irix*) CCDLFLAGS='-KPIC' ;;
sunos*) CCDLFLAGS='-PIC' ;;
esix*|uxpds*) CCDLFLAGS='-KPIC' ;;
diff --git a/ext/digest/sha2/sha2.c b/ext/digest/sha2/sha2.c
index 31b5ff1690..24a57ded0d 100644
--- a/ext/digest/sha2/sha2.c
+++ b/ext/digest/sha2/sha2.c
@@ -67,7 +67,7 @@ typedef uint8_t sha2_byte; /* Exactly 1 byte */
typedef uint32_t sha2_word32; /* Exactly 4 bytes */
typedef uint64_t sha2_word64; /* Exactly 8 bytes */
-#if defined(__GNUC__)
+#if defined(__GNUC__) || defined(_HPUX_SOURCE)
#define ULL(number) number##ULL
#else
#define ULL(number) (uint64_t)(number)
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index b72da75e7f..cac0b1d11c 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -3,15 +3,16 @@
#include <errno.h>
#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
#include <readline/readline.h>
#include <readline/history.h>
#include "ruby.h"
#include "rubysig.h"
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
static VALUE mReadline;
#define TOLOWER(c) (isupper(c) ? tolower(c) : c)
diff --git a/lib/complex.rb b/lib/complex.rb
index 039510ee2f..3d761beb6b 100644
--- a/lib/complex.rb
+++ b/lib/complex.rb
@@ -21,7 +21,8 @@
#
# The following +Math+ module methods are redefined to handle Complex arguments.
# They will work as normal with non-Complex arguments.
-# sqrt exp cos sin tan log log10 atan2
+# sqrt exp cos sin tan log log10
+# cosh sinh tanh acos asin atan atan2 acosh asinh atanh
#
@@ -66,7 +67,6 @@ class Complex < Numeric
Complex(r*Math.cos(theta), r*Math.sin(theta))
end
- private_class_method :new
#
# Creates a +Complex+ number <tt>a</tt>+<tt>b</tt><i>i</i>.
#
@@ -76,7 +76,9 @@ class Complex < Numeric
def initialize(a, b)
raise "non numeric 1st arg `#{a.inspect}'" if !a.kind_of? Numeric
+ raise "`#{a.inspect}' for 1st arg" if a.kind_of? Complex
raise "non numeric 2nd arg `#{b.inspect}'" if !b.kind_of? Numeric
+ raise "`#{b.inspect}' for 2nd arg" if b.kind_of? Complex
@real = a
@image = b
end
@@ -181,7 +183,7 @@ class Complex < Numeric
end
elsif Complex.generic?(other)
r, theta = polar
- Complex.polar(r.power!(other), theta * other)
+ Complex.polar(r**other, theta*other)
else
x, y = other.coerce(self)
x**y
@@ -236,8 +238,9 @@ class Complex < Numeric
# Argument (angle from (1,0) on the complex plane).
#
def arg
- Math.atan2(@image.to_f, @real.to_f)
+ Math.atan2!(@image, @real)
end
+ alias angle arg
#
# Returns the absolute value _and_ the argument.
@@ -252,6 +255,7 @@ class Complex < Numeric
def conjugate
Complex(@real, -@image)
end
+ alias conj conjugate
#
# Compares the absolute values of the two numbers.
@@ -395,6 +399,7 @@ class Numeric
return Math::PI
end
end
+ alias angle arg
#
# See Complex#polar.
@@ -409,46 +414,28 @@ class Numeric
def conjugate
self
end
+ alias conj conjugate
end
-class Fixnum
- unless defined? 1.power!
- alias power! **
- end
-
- # Redefined to handle a Complex argument.
- def ** (other)
- if self < 0
- Complex.new!(self, 0) ** other
- else
- if defined? self.rpower
- self.rpower(other)
- else
- self.power!(other)
- end
- end
- end
-end
-
-class Bignum
- alias power! **
-end
-
-class Float
- alias power! **
-end
-
module Math
alias sqrt! sqrt
alias exp! exp
+ alias log! log
+ alias log10! log10
alias cos! cos
alias sin! sin
alias tan! tan
- alias log! log
- alias atan! atan
- alias log10! log10
+ alias cosh! cosh
+ alias sinh! sinh
+ alias tanh! tanh
+ alias acos! acos
+ alias asin! asin
+ alias atan! atan
alias atan2! atan2
+ alias acosh! acosh
+ alias asinh! asinh
+ alias atanh! atanh
# Redefined to handle a Complex argument.
def sqrt(z)
@@ -478,20 +465,6 @@ module Math
end
end
- #
- # Hyperbolic cosine.
- #
- def cosh!(x)
- (exp!(x) + exp!(-x))/2.0
- end
-
- #
- # Hyperbolic sine.
- #
- def sinh!(x)
- (exp!(x) - exp!(-x))/2.0
- end
-
# Redefined to handle a Complex argument.
def cos(z)
if Complex.generic?(z)
@@ -520,6 +493,30 @@ module Math
sin(z)/cos(z)
end
end
+
+ def sinh(z)
+ if Complex.generic?(z)
+ sinh!(z)
+ else
+ Complex( sinh!(z.real)*cos!(z.image), cosh!(z.real)*sin!(z.image) )
+ end
+ end
+
+ def cosh(z)
+ if Complex.generic?(z)
+ cosh!(z)
+ else
+ Complex( cosh!(z.real)*cos!(z.image), sinh!(z.real)*sin!(z.image) )
+ end
+ end
+
+ def tanh(z)
+ if Complex.generic?(z)
+ tanh!(z)
+ else
+ sinh(z)/cosh(z)
+ end
+ end
# Redefined to handle a Complex argument.
def log(z)
@@ -539,69 +536,102 @@ module Math
log(z)/log!(10)
end
end
-
- # FIXME: I don't know what the point of this is. If you give it Complex
- # arguments, it will fail.
- def atan2(x, y)
- if Complex.generic?(x) and Complex.generic?(y)
- atan2!(x, y)
+
+ def acos(z)
+ if Complex.generic?(z)
+ acos!(z)
else
- fail "Not yet implemented."
+ -1.0.im * log( z + 1.0.im * sqrt(1.0-z*z) )
end
end
-
- #
- # Hyperbolic arctangent.
- #
- def atanh!(x)
- log((1.0 + x.to_f) / ( 1.0 - x.to_f)) / 2.0
+
+ def asin(z)
+ if Complex.generic?(z)
+ asin!(z)
+ else
+ -1.0.im * log( 1.0.im * z + sqrt(1.0-z*z) )
+ end
end
-
- # Redefined to handle a Complex argument.
+
def atan(z)
if Complex.generic?(z)
- atan2!(z, 1)
- elsif z.image == 0
- atan2(z.real,1)
+ atan!(z)
else
- a = z.real
- b = z.image
-
- c = (a*a + b*b - 1.0)
- d = (a*a + b*b + 1.0)
+ 1.0.im * log( (1.0.im+z) / (1.0.im-z) ) / 2.0
+ end
+ end
- Complex(atan2!((c + sqrt(c*c + 4.0*a*a)), 2.0*a),
- atanh!((-d + sqrt(d*d - 4.0*b*b))/(2.0*b)))
+ def atan2(y,x)
+ if Complex.generic?(y) and Complex.generic?(x)
+ atan2!(y,x)
+ else
+ -1.0.im * log( (x+1.0.im*y) / sqrt(x*x+y*y) )
end
end
-
- module_function :sqrt
+
+ def acosh(z)
+ if Complex.generic?(z)
+ acosh!(z)
+ else
+ log( z + sqrt(z*z-1.0) )
+ end
+ end
+
+ def asinh(z)
+ if Complex.generic?(z)
+ asinh!(z)
+ else
+ log( z + sqrt(1.0+z*z) )
+ end
+ end
+
+ def atanh(z)
+ if Complex.generic?(z)
+ atanh!(z)
+ else
+ log( (1.0+z) / (1.0-z) ) / 2.0
+ end
+ end
+
module_function :sqrt!
+ module_function :sqrt
module_function :exp!
module_function :exp
+ module_function :log!
+ module_function :log
+ module_function :log10!
+ module_function :log10
module_function :cosh!
+ module_function :cosh
module_function :cos!
module_function :cos
module_function :sinh!
+ module_function :sinh
module_function :sin!
module_function :sin
module_function :tan!
module_function :tan
- module_function :log!
- module_function :log
- module_function :log10!
- module_function :log
+ module_function :tanh!
+ module_function :tanh
+ module_function :acos!
+ module_function :acos
+ module_function :asin!
+ module_function :asin
+ module_function :atan!
+ module_function :atan
module_function :atan2!
module_function :atan2
-# module_function :atan!
- module_function :atan
+ module_function :acosh!
+ module_function :acosh
+ module_function :asinh!
+ module_function :asinh
module_function :atanh!
+ module_function :atanh
end
# Documentation comments:
# - source: original (researched from pickaxe)
# - a couple of fixme's
-# - Math module methods sinh! etc. a bit fuzzy. What exactly is the intention?
# - RDoc output for Bignum etc. is a bit short, with nothing but an
# (undocumented) alias. No big deal.