[#41918] [Feature #3647] Array#sample(n, replace=false) — Kenta Murata <redmine@...>

Feature #3647: Array#sample(n, replace=false)

11 messages 2010/08/03

[#41966] [Bug #3673] PTY.getpty with IO.pipe doesn't finish on FreeBSD — Yui NARUSE <redmine@...>

Bug #3673: PTY.getpty with IO.pipe doesn't finish on FreeBSD

9 messages 2010/08/10

[#41969] [Feature #3675] String#prepend, String#>> — Sora Harakami <redmine@...>

Feature #3675: String#prepend, String#>>

15 messages 2010/08/10
[#41976] Re: [Feature #3675] String#prepend, String#>> — Yukihiro Matsumoto <matz@...> 2010/08/10

まつもと ゆきひろです

[#41974] Re: [ruby-cvs:36157] Ruby:r28955 (trunk): * complex.c (nucomp_to_[ifr]): don't allow complex with in-exact — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

7 messages 2010/08/10

[#42003] WEBrickに関するセキュリティ修正 (CVE-2010-0541) — Hideki Yamane <henrich@...>

12 messages 2010/08/11

[#42090] Math::atan2(0, 0) on ruby 1.9.2 — KUBO Takehiro <kubo@...>

久保です。

18 messages 2010/08/22
[#42092] Re: Math::atan2(0, 0) on ruby 1.9.2 — Kenta Murata <muraken@...> 2010/08/22

むらたです。

[#42166] Ruby'sライセンスの、BSDLとのデュアルライセンスへの変更 — "NARUSE, Yui" <naruse@...>

Ruby's ライセンスは BSDL と Ruby's のデュアルライセンスになります。

14 messages 2010/08/31

[ruby-dev:42119] Re: Math::atan2(0, 0) on ruby 1.9.2

From: Kenta Murata <muraken@...>
Date: 2010-08-24 02:33:56 UTC
List: ruby-dev #42119
むらたです。

On 2010/08/23, at 23:05, KUBO Takehiro wrote:

> 久保です。
> 
> 2010/8/23 Yusuke ENDOH <mame@tsg.ne.jp>:
>> 遠藤です。
>> 
>> atan2 は極座標変換に使われるので、[hypot(x, y), atan2(x, y)] が
>> x = y = 0 の時にエラーになるのは不便、というようなことが FreeBSD
>> の manpage に書いてありました。
>> この rationale は個人的には納得できます。
>> 
>> また、いくつか regression も引き起こしているようなので、atan2 に
>> 関しては SUSv3 に従っておくとよいのではないでしょうか。
> 
> いっそのこと、Java の仕様を真似するというのもありかもしれない。

何の根拠もなく短絡的に Java に合わせようという考えには賛同できませんし、
なぜそこで Java *だけ*が出てくるのかも良く分かりません。

Math.atan2 は数学の関数ですから、できるだけ数学的に考えたいですし、
他の言語を参考にするなら Java 以外の言語も見たほうが良いでしょう。


Common Lisp [1] と Scheme (R6RS) [2] を調べてみると、次のようになっています:

Common Lisp の場合
-------------------
 x   y  atan2(x, y)
-------------------
+0  +0  +0
+0  -0  -0
-0  +0  +pi
-0  -0  -pi
-------------------

Scheme の場合 (R6RS)
-------------------
 x   y  atan2(x, y)
-------------------
+0  +0  +0
+0  -0  -0
-0  +0  +pi
-0  -0  -pi
 0  +0  pi/2
 0  -0  -pi/2
-------------------

Common Lisp は SUSv3 と同じで、Scheme は場合分けが2つ増えています。
Haskell の atan2 は Common Lisp と同じでした。

# ちなみに Mathematica は、上記の値は indefinite として値域が返ってきます。


これらの値がどこから来たのかを考えると、どうも

atan2(±0, ±0) = lim_{x->±0} lim_{y->±0} atan2(x, y)  (複号同順)

この式から来ているようです。Wikipedia [3] にある atan2 の3次元グラフを見れば
Scheme の定義を採用する事が適切なように感じます。


[1] http://www.lispworks.com/documentation/HyperSpec/Body/f_asin_.htm#atan
[2] http://practical-scheme.net/wiliki/wiliki2.cgi?R6RS:%E7%BF%BB%E8%A8%B3:R6RS:11.7.3.2%20Transcendental%20functions
[3] http://en.wikipedia.org/wiki/Atan2#Variations

--
Kenta Murata
OpenPGP FP = 1D69 ADDE 081C 9CC2 2E54  98C1 CEFE 8AFB 6081 B062

本を書きました!!
『Ruby 逆引きレシピ』 http://www.amazon.co.jp/dp/4798119881/mrkn-22

E-mail: mrkn@mrkn.jp
twitter: http://twitter.com/mrkn/
blog: http://d.hatena.ne.jp/mrkn/


In This Thread