[Ruby 1.9 - Feature #4878][Open] CMath に frexp, ldexp, hypot の3関数は不要ではないか

Issue #4878 has been reported by Kenta M…


Feature #4878: CMath に frexp, ldexp, hypot の3関数は不要ではないか

Author: Kenta M.
Status: Open
Priority: Normal
Assignee: Yukihiro M.
Category:
Target version: 1.9.x

現在 CMath は、Math を include して各関数を再定義することで実装されています。
このやり方では、複素数向けの関数としては定義できない frexp, ldexp, hypot の3関数も同時に include
されてしまいます。
これらは Math の関数として定義されていれば良いだけですので、CMath からの削除を提案します。

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:43787] [Ruby 1.9 - Feature #4878][Open] CMath
$B$K(B frexp, ldexp, hypot $B$N(B3$B4X?t$OITMW$G$O$J$$$+(B”
on Mon, 13 Jun 2011 23:16:37 +0900, Kenta M. [email protected]
writes:

|Issue #4878 has been reported by Kenta M…
|
|----------------------------------------
|Feature #4878: CMath $B$K(B frexp, ldexp, hypot $B$N(B3$B4X?t$OITMW$G$O$J$$$+(B
|Feature #4878: CMath に frexp, ldexp, hypot の3関数は不要ではないか - Ruby master - Ruby Issue Tracking System

|$B8=:_(B CMath $B$O!"(BMath $B$r(B include
$B$7$F3F4X?t$r:FDj5A$9$k$3$H$G<BAu$5$l$F$$$^$9!#(B
|$B$3$N$d$jJ}$G$O!“J#AG?t8~$1$N4X?t$H$7$F$ODj5A$G$-$J$$(B frexp, ldexp, hypot
$B$N(B3$B4X?t$bF1;~$K(B include $B$5$l$F$7$^$$$^$9!#(B
|$B$3$l$i$O(B Math $B$N4X?t$H$7$FDj5A$5$l$F$$$l$PNI$$$@$1$G$9$N$G!”(BCMath
$B$+$i$N:o=|$rDs0F$7$^$9!#(B

$B$J$k$[$I!#F10U$7$^$9!#:o=|$N%?%$%_%s%0$O%a%s%F%J$K$*G$$;$7$^$9!#(B

$B$b$&7kO@$,=P$F$7$^$C$?$h$&$G$9$,!"$3$l$O!“85!9(B lib/complex.rb
$B$K$”$C$?(B
$B$b$N$rFHN)$5$;$?$b$N$G$9$,!"$=$N0UL#$O!“J#AG?tMQ$N4X?t$rDs6!$9$k;v$G$O(B
$B$J$/!“J#AG?t%I%a%$%s$KBP1~$7$?(B Math
$B$rDs6!$9$k!”$H$$$&;v$@$HM}2r$7$F$$(B
$B$^$7$?!#$D$^$j!”<B?tMQ$H$7$F$D$+$o$l$k8B$j!"(BMath
$B$H$^$C$?$/F1$8$G$"$k$3(B
$B$H$,K>$^$l$F$$$?$H9M$($^$9!#(B

complex.rb $B$r%m!<%I$9$k$H(B Math $B$,(B CMath $BAjEv$KCV$-49$o$j$^$9$+$i!"(B
Math $B$rCV$-49$($k:]$K(B frexp, ldexp, hypot
$B$rDj5A$9$k$3$H$GBP1~2DG=$+$H;W$$$^$9!#(B

$B$=$&$$$&;v$G$9$h$M!)(B

$B$=$&$G$O$"$j$^$;$s!#(BCMath
$BC1BN$G!"$G$9!#<B:]!"J#AG?tMQ$N4X?t$rDj5A$7$F(B
$B$$$k$N$G$O$J$/!"J#AG?t$K$b$D$+$($k$h$&$K3HD%$7$?$b$N$rDs6!$7$h$&$H$7$F(B
$B$$$^$9$h$M!#(B

むらたです。

On Tuesday, June 14, 2011 at 12:16 AM, Tadayoshi F. wrote:

もう結論が出てしまったようですが、これは、元々 lib/complex.rb にあった
ものを独立させたものですが、その意味は、複素数用の関数を提供する事では
なく、複素数ドメインに対応した Math を提供する、という事だと理解してい
ました。つまり、実数用としてつかわれる限り、Math とまったく同じであるこ
とが望まれていたと考えます。

complex.rb をロードすると Math が CMath 相当に置き換わりますから、
Math を置き換える際に frexp, ldexp, hypot を定義することで対応可能かと思います。

そういう事ですよね?

むらたです。

On Tuesday, June 14, 2011 at 8:45 AM, Tadayoshi F. wrote:

complex.rb をロードすると Math が CMath 相当に置き換わりますから、
Math を置き換える際に frexp, ldexp, hypot を定義することで対応可能かと思います。

そういう事ですよね?

そうではありません。CMath 単体で、です。実際、複素数用の関数を定義して
いるのではなく、複素数にもつかえるように拡張したものを提供しようとして
いますよね。

私は、これらの関数について以下のように解釈し、CMath からの削除を提案しました。
(1) frexp と ldexp は2を底とする浮動小数点数表現に対する関数なので、表現から中立である複素数に対して無意味である。
(2) hypot(x, y) は sqrt(x2 + y2)
という定義があるので、再定義することで複素数に拡張可能だけど無意味ではないか?

Math と CMath が同時に存在している場合、つまり cmath.rb のみを require した場合、
上記3関数は Math のものを使用できるため、CMath で定義される必要は無いはずです。

現在、CMath に定義されている上記3関数は複素数に対して使用できません。
ふなばさんは、frexp, ldexp, hypot の3関数について、
CMath 単体でどのように定義されるべきだとお考えですか?

$B$^$D$b$H(B $B$f$-$R$m$G$9(B

In message “Re: [ruby-dev:43797] Re: [Ruby 1.9 - Feature #4878][Open]
CMath $B$K(B frexp, ldexp, hypot $B$N(B3$B4X?t$OITMW$G$O$J$$$+(B”
on Tue, 14 Jun 2011 11:57:26 +0900, Kenta M. [email protected]
writes:

|Math $B$H(B CMath $B$,F1;~$KB8:$7$F$$$k>l9g!"$D$^$j(B cmath.rb $B$N$$r(B
require $B$7$?>l9g!“(B
|$B>e5-(B3$B4X?t$O(B Math $B$N$b$N$r;HMQ$G$-$k$?$a!”(BCMath
$B$GDj5A$5$l$kI,MW$OL5$$$O$:$G$9!#(B

Python$B$G$O(Bmath$B$r(Bcmath$B$KCV$-49$($k$h$&$J%9%?%$%k$,;~!98+$i$l(B
$B$k$h$&$G$9!#(BRuby$B$@$H(B

require “cmath”
Math = CMath

$B$_$?$$$J!#$3$&$$$&%3!<%I$r2>Dj$9$k$H!“4X?t$r<h$j=|$+$J$$(B
(Math$B$H8_49$N$^$^;D$9(B)$B$H$$$&$N$b0UL#$,$”$k$N$+$b$7$l$^$;$s!#(B

むらたです。

On Tuesday, June 14, 2011 at 12:53 PM, Yukihiro M. wrote:

Math = CMath

みたいな。こういうコードを仮定すると、関数を取り除かない
(Mathと互換のまま残す)というのも意味があるのかもしれません。

これに相当する事をやっているのが complex.rb なので、
Ruby では上記に相当する処理をやりたければ require “complex” することにして、
complex.rb の中で適切に関数を定義すれば良いと考えていました。

たとえば、以下のパッチのような方法です。

$B$3$l$KAjEv$9$k;v$r$d$C$F$$$k$N$,(B complex.rb $B$J$N$G!"(B
Ruby $B$G$O>e5-$KAjEv$9$k=hM}$r$d$j$?$1$l$P(B require “complex”
$B$9$k$3$H$K$7$F!"(B
complex.rb $B$NCf$GE,@Z$K4X?t$rDj5A$9$l$PNI$$$H9M$($F$$$^$7$?!#(B

lib/complex.rb $B$O8_49$N$?$a$K;D$C$F$$$k$@$1$G?d>)$5$l$^$;$s!#(B

$B$3$A$i$NN)>l$+$i8@$($P!"(BCMath
$B$O@)8B$r<h$j=|$$$?!"$"$k$$$O<h$j=|$3$&$H(B
$B$7$F$$$k(B Math $B$NBeBXHG$H$$$&$H$3$m$G$9$+$M!#(B

$B<B:]!"$3$l$i$O(B include
$B$7$F$D$+$&$3$H$bA[Dj$5$l!“0lB7$($NJ*$H$7$F07$o$l(B
$B$k$o$1$G!”$3$l$OJ#AG?t$KBP1~$G$-$?!"$G$-$J$$$GJ,$1$k$H$+!“J;MQ$9$k$H$$(B
$B$&$N$O!”$J$/$O$J$$$1$I!":G=i$+$i$=$l$rMxMQ<T$KMW5a$9$k$N$O$I$&$J$N$+$J!#(B

lib/cmath.rb
$B$r$D$+$C$F$$$F$b!"$=$N8F$S=P$7$NA4$F$GJ#AG?t$,3hLv$7$F$$$k(B
$B$H$O8B$i$J$$$o$1$G$9$h$M!#(BCMath $B$K(B hypot
$B$,$J$$$N$O!“J#AG?t$N$?$a$K3HD%(B
$B$7$h$&$,$J$+$C$?$+$i$@$H$7$F$b!”<B:]$KMxMQ<T$O!"<B?t$rM?$(!"<B?t$rF@$k(B
$B$+$?$A$G$7$+!"(Bsin
$B$J$s$+$r;H$C$F$$$J$$$+$b$7$l$J$$$8$c$J$$$G$9$+!#MxMQ(B
$B<T$K$=$N6hJL$r$5$;$kI,MW$,$"$k$s$G$7$g$&$+!#(B

$B1sF#$G$9!#(B

2011$BG/(B6$B7n(B14$BF|(B20:37 Tadayoshi F. [email protected]:

$B$3$l$KAjEv$9$k;v$r$d$C$F$$$k$N$,(B complex.rb $B$J$N$G!“(B
Ruby $B$G$O>e5-$KAjEv$9$k=hM}$r$d$j$?$1$l$P(B require “complex”
$B$9$k$3$H$K$7$F!”(B
complex.rb $B$NCf$GE,@Z$K4X?t$rDj5A$9$l$PNI$$$H9M$($F$$$^$7$?!#(B

lib/complex.rb $B$O8_49$N$?$a$K;D$C$F$$$k$@$1$G?d>)$5$l$^$;$s!#(B

$B$3$A$i$NN)>l$+$i8@$($P!“(BCMath $B$O@)8B$r<h$j=|$$$?!”$"$k$$$O<h$j=|$3$&$H(B
$B$7$F$$$k(B Math $B$NBeBXHG$H$$$&$H$3$m$G$9$+$M!#(B

$BDj5A0h$rA}$d$9$@$1$K$7$h$&!“$H$$$&$3$H$G$9$h$M!#;?@.$G$9!#(B
$B$=$&$$$&0UL#$G!”(Bcbrt(-8) $B$O(B Math $B$rB:=E$7$F(B -2
$B$rJV$9$Y$-$@$H;W$&$N$G$9$,!"(B
$B$$$+$,$G$7$g$&$+!#(B

$BDj5A0h$rA}$d$9$@$1$K$7$h$&!"$H$$$&$3$H$G$9$h$M!#;?@.$G$9!#(B
$B$=$&$$$&0UL#$G!"(Bcbrt(-8) $B$O(B Math $B$rB:=E$7$F(B -2
$B$rJV$9$Y$-$@$H;W$&$N$G$9$,!"(B
$B$$$+$,$G$7$g$&$+!#(B

$BCM0h$b3HBg$5$l$^$9$M!#$@$+$i!"(B-2
$B$K$O$J$i$J$$$G$7$g$&!#<B?t$rM?$(!"<B?t(B
$B$,JV$kHOCf$G$O(B Math $B$HF1$8$H$$$&$3$H$@$H;W$$$^$9!#(B

2011$BG/(B6$B7n(B14$BF|(B22:17 Tadayoshi F. [email protected]:

$BDj5A0h$rA}$d$9$@$1$K$7$h$&!“$H$$$&$3$H$G$9$h$M!#;?@.$G$9!#(B
$B$=$&$$$&0UL#$G!”(Bcbrt(-8) $B$O(B Math $B$rB:=E$7$F(B -2
$B$rJV$9$Y$-$@$H;W$&$N$G$9$,!"(B
$B$$$+$,$G$7$g$&$+!#(B

$BCM0h$b3HBg$5$l$^$9$M!#$@$+$i!“(B-2 $B$K$O$J$i$J$$$G$7$g$&!#<B?t$rM?$(!”<B?t(B
$B$,JV$kHOCf$G$O(B Math $B$HF1$8$H$$$&$3$H$@$H;W$$$^$9!#(B

$B8_49@-$,$J$$$H$$$&E@$G$OF1$8OC$@$H;W$&$N$G$9$,!D!D!#(B

むらたです。

On Tuesday, June 14, 2011 at 8:37 PM, Tadayoshi F. wrote:

これに相当する事をやっているのが complex.rb なので、
Ruby では上記に相当する処理をやりたければ require “complex” することにして、
complex.rb の中で適切に関数を定義すれば良いと考えていました。

lib/complex.rb は互換のために残っているだけで推奨されません。

あー、本当ですね。最初に警告を出している行を完全に見逃していました。

であれば、確かに CMath が Math の役割を果せる必要はありますね。
納得できたので、この提案は撤回させて頂きます。

2011$BG/(B6$B7n(B14$BF|(B23:02 Tadayoshi F. [email protected]:

$B8_49@-$,$J$$$H$$$&E@$G$OF1$8OC$@$H;W$&$N$G$9$,!D!D!#(B

$B<gCM$K$J$i$J$$(B Math.cbrt
$B$rB:=E$9$k$H$$$&$N$OFq$7$$$s$8$c$J$$$G$7$g$&$+!#(B
$B$I$&$7$F$b$=$l$,=EMW$@$H;W$o$l$k$J$i!"$3$N7o$H$O4X78$,$J$$$N$G!"2~$a$F(B
$BDs0F$r=P$5$l$k$H$+!#(B

$B$$$d$“!”(B5 $B7nKv$N(B feature freeze $B;~E@$G$O(B -2
$B$rJV$7$F$$$?$O$:$J$s$G$9$,!"(B
6 $B7n$K$J$C$F$+$i(B ($B5DO@;v9`$,;D$C$?$^$^(B) $BJQ$o$C$?$s$G$9$h$M!#(B

$B8_49@-$,$J$$$H$$$&E@$G$OF1$8OC$@$H;W$&$N$G$9$,!D!D!#(B

$B<gCM$K$J$i$J$$(B Math.cbrt
$B$rB:=E$9$k$H$$$&$N$OFq$7$$$s$8$c$J$$$G$7$g$&$+!#(B
$B$I$&$7$F$b$=$l$,=EMW$@$H;W$o$l$k$J$i!"$3$N7o$H$O4X78$,$J$$$N$G!"2~$a$F(B
$BDs0F$r=P$5$l$k$H$+!#(B

$B1sF#$G$9!#(B

2011$BG/(B6$B7n(B14$BF|(B23:27 Tadayoshi F. [email protected]:

$B$$$d$“!”(B5 $B7nKv$N(B feature freeze $B;~E@$G$O(B -2
$B$rJV$7$F$$$?$O$:$J$s$G$9$,!"(B
6 $B7n$K$J$C$F$+$i(B ($B5DO@;v9`$,;D$C$?$^$^(B) $BJQ$o$C$?$s$G$9$h$M!#(B

$B$=$l$O!“85!9<gCM$rJV$9$h$&$K$J$C$F$$$?$N$K!”(B-2 $B$rJV$9$h$&$K4V0c$C$FJQ99(B
$B$5$l$?$H$$$&7kO@$K$J$C$?$+$i$G$7$g$&!#:G=i$K(B CMath.cbrt $B$r2C$($?$N$O26(B
$B$G!“$=$N8e$J$<$+!”(B-2 $B$,JV$k$h$&$KJQ99$5$l$?$N$G$9!#$G$9$+$i!"$3$l$O%P%0(B
$B$,=$@5$5$l$?$H$$$&M}2r$G$9$,!#(B

-2
$B$rJV$9$h$&$KJQ99$9$k$N$O5DO@$7$F$+$i$K$9$Y$-$@$C$?$H$O;W$C$F$$$^$9$,!“(B
$B!V4V0c$C$F$$$?!W$H$O$”$^$j;W$C$F$$$^$;$s!#(B
$B$U$J$P$5$s$b$$C$7$c$k$h$&$K(B CMath $B$,(B Math
$B$H$N8_49@-$r9M$($F$$$k$J$i!"(B
-2 $B$rJV$90J30$NA
Br;h$,$“$k$h$&$K$O;W$($J$$$N$G$9!#(B
$B$”$H!"(B[ruby-dev:42007]
$B$N$^$D$b$H$5$s$N5DBjDs=P$KBP$7$F5DO@$5$l$?$h$&(B
$B$K$b8+$($^$;$s!#(B

$B$$$d$"!"(B5 $B7nKv$N(B feature freeze $B;~E@$G$O(B -2
$B$rJV$7$F$$$?$O$:$J$s$G$9$,!"(B
6 $B7n$K$J$C$F$+$i(B ($B5DO@;v9`$,;D$C$?$^$^(B) $BJQ$o$C$?$s$G$9$h$M!#(B

$B$=$l$O!“85!9<gCM$rJV$9$h$&$K$J$C$F$$$?$N$K!”(B-2
$B$rJV$9$h$&$K4V0c$C$FJQ99(B
$B$5$l$?$H$$$&7kO@$K$J$C$?$+$i$G$7$g$&!#:G=i$K(B CMath.cbrt
$B$r2C$($?$N$O26(B
$B$G!"$=$N8e$J$<$+!"(B-2
$B$,JV$k$h$&$KJQ99$5$l$?$N$G$9!#$G$9$+$i!"$3$l$O%P%0(B
$B$,=$@5$5$l$?$H$$$&M}2r$G$9$,!#(B

$B1sF#$G$9!#(B

2011$BG/(B6$B7n(B17$BF|(B1:58 Tadayoshi F. [email protected]:

$B40A4$J8_49@-$,$J$$$+$i$3$=<h$j4:$($:CHN|J,$1$7$?$o$1$G!"1sF#$5$s$NM}6~(B
$B$ODL$i$J$$$G$9$h!#(B

$B$J$k$[$I!#!V(BCMath $B$,(B Math
$B$H8_49$G$J$$!W$H$$$&$3$H$J$i!“$”$^$j4n$P$7$$(B
$BOC$@$H$O;W$$$^$;$s$,G<F@$O$G$-$^$9!#(B

$B$“$H!“0l1~0U8+$O8@$$$^$7$?$,!“26$O!”(Blib/cmath.rb $B$N%a%s%F%J$G$b$J$$$7!”(B
$B$3$N%P%0$N=$@5$r7h$a$?$o$1$G$b$”$j$^$;$s!#$J$N$G!"26$KJ86g$r8@$$$?$$$i(B
$B$7$$$h$&$G$9$,!"26$K8@$C$F$b$I$&$K$b$J$j$^$;$s!#(B

$B%P%0Js9p<T$,@bF@=PMh$l$P$b$I$k$+$J$H;W$C$?$N$G!#(B
$B$^$"(B mrkn $B$5$s$KD>@\8@$&$Y$-$G$7$?$M!#$9$_$^$;$s!#(B

$B$1$$$8$e!w$$$7$D$+$G$9(B.

In [ruby-dev:43832] the message: “[ruby-dev:43832] Re: [Ruby 1.9 -
Feature #4878][Open] CMath $B$K(B frexp, ldexp, hypot
$B$N(B3$B4X?t$OITMW$G$O$J(B
$B$$$+(B”, on Jun/17 01:10(JST) Yusuke ENDOH writes:

$B1sF#$G$9!#(B

-2 $B$rJV$9$h$&$KJQ99$9$k$N$O5DO@$7$F$+$i$K$9$Y$-$@$C$?$H$O;W$C$F$$$^$9$,!"(B
$B!V4V0c$C$F$$$?!W$H$O$"$^$j;W$C$F$$$^$;$s!#(B
$B$U$J$P$5$s$b$$C$7$c$k$h$&$K(B CMath $B$,(B Math
$B$H$N8_49@-$r9M$($F$$$k$J$i!"(B
-2 $B$rJV$90J30$NA
Br;h$,$"$k$h$&$K$O;W$($J$$$N$G$9!#(B

$B1sF#$5$s$N8@$C$F$$$k$N$O0J2<$N<BAu$G$9$h$M(B?

def cbrt(z)
if z.real?
cbrt!(z)
else
Complex(z) ** (1.0/3)
end
end

$B$3$l$@$H(B, CMath.cbrt(-8) $B$H(B CMath.cbrt(Complex(-8,0))
$B$GCM$,0[$J$C$F$-(B
$B$F$$$^$9(B. $B$3$NE@$K$D$$$F$I$&9M$($F$$$^$9(B?

$B$A$J$_$K(B,
$BB>$N(BCMath$B4X?t$O<B?t;~$K$D$$$FJL$K<BAu$7$F$$$k$3$H$,B?$$$G$9(B
$B$,(B, $B>e5-$N$h$&$KCM$,0[$J$k;v$O$J$$$h$&$K$J$C$F$$$^$9(B.

__
---------------------------------------------------->> $B@PDM(B $B7=<y(B
<<—
---------------------------------->> e-mail: [email protected] <<—

$B1sF#$G$9!#(B

2011$BG/(B6$B7n(B17$BF|(B14:19 $B@PDM7=<y(B [email protected]:

$B$3$l$@$H(B, CMath.cbrt(-8) $B$H(B CMath.cbrt(Complex(-8,0))
$B$GCM$,0[$J$C$F$-(B
$B$F$$$^$9(B. $B$3$NE@$K$D$$$F$I$&9M$($F$$$^$9(B?

$B$J$s$H!#(B
$B$=$l$O(B cbrt(-8) $B$G(B -2
$B$rJV$9$h$&$K$7$?:]$N;d$N=$@5$N!V%P%0!W$G$9!#(B
Complex(-8, 0).real? $B$,(B false $B$H$OA[Dj30$G$7$?!#(B