[#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

=1B$B$`$i$?$G$9!#=1B(B

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

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

14 messages 2010/08/31

[ruby-dev:42155] Math モジュールの互換性(was: Math::atan2(0, 0) on ruby 1.9.2)

From: KUBO Takehiro <kubo@...>
Date: 2010-08-29 14:31:13 UTC
List: ruby-dev #42155
久保です。

Mathモジュールの関数の互換性の調査です。調査の順番は math.c で定義され
ている順序で、全26個の関数のうち、最初の7個のみ調査しました。残りの19
個についてはゆっくり(週に一回ぐらい?)調べていきます。

3, 4回見直したけど、そのたびに間違いが見付かるので、まだ間違いが残って
いる可能性があります。m(__)m

チェック項目は以下の2つ。

(1) SUSv3準拠環境での 1.9.1 と trunk の非互換

  libm がオプションの動作(*1)も含めて SUSv3 に準拠していると仮定し
  た上で、1.9.1 と trunk の非互換をチェック。

  *1 SUSv3 の仕様書の [MX]|X> と <X| で囲まれた部分

(2) trunk でのプラットフォーム間の非互換の可能性

  trunk では数学関数を呼ぶ前に範囲チェックを行なっている。範囲チェッ
  クを通った後にプラットフォーム依存の動作を起こす可能性のある箇所を
  チェックした。具体的には、SUSv3 でオプションの動作とされている部分
  と、SUSv2 で either ... or ... と書かれている部分です。

  ちなみにこれは「可能性」のチェックであって。実際にプラットフォーム依
  存があるかどうかは不明です。重箱の隅をつついているような感じがする箇
  所もあったけど、そのまま記載しました。

ちなみに、非互換の情報を挙げるのだけが目的です。コメントを付けている箇
所がありますが、今後のバージョンで対処すべきかどうかという価値判断は行
なっていません。
([ruby-core:28286]を見ると、意図的な非互換もありそうですし)

1. atan2
========

1.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

数が多いので表形式を使用。等幅フォントを使用してください。

          式                    1.9.1     trunk
    ------------------------- -------- ------------
 1. atan2(正の有限値, -Inf)       +PI   DomainError
 2. atan2(負の有限値, -Inf)       -PI   DomainError
 3. atan2(正の有限値, +Inf)      +0.0   DomainError
 4. atan2(負の有限値, +Inf)      -0.0   DomainError
 5. atan2(+Inf, 正負の有限値)   +PI/2   DomainError
 6. atan2(-Inf, 正負の有限値)   -PI/2   DomainError
 7. atan2(+Inf, -Inf)          +3PI/4   DomainError
 8. atan2(-Inf, -Inf)          -3PI/4   DomainError
 9. atan2(+Inf, +Inf)           +PI/4   DomainError
10. atan2(-Inf, +Inf)           -PI/4   DomainError

1.9.1 の挙動の 1〜6 までは数学的に見ても意味がありそう。数式でどうこう
というのはわからないが、Wikipedia の3次元グラフ(*2)を見ると、x軸、y軸
の片方を無限に伸ばした場合を考えると 1.9.1 の値は正しそうです。

*2 http://en.wikipedia.org/wiki/Atan2#Illustrations

7〜10 は数学的にはあやしい。例えば、atan2(y, x) の戻り値が +PI/4 にな
るためには y/x == 1 である必要があるが、+Inf 同士の比率はなんらかの前
提条件をつけない限り不可能なため。

1.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. atan2(y, x) の y, x のどちらかが NaN  --> NaN

SUSv2 では上記の通りの値を戻すことになっているのに対し、SUSv3 ではオプ
ションの動作に格下げされている。

2. cos
======

2.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

ソースコードの変更がないので非互換なし

2.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. cos(NaN)   -> NaN
 2. cos(+0.0)  -> 1.0
 3. cos(-0.0)  -> 1.0
 4. cos(+Inf)  -> SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN
 5. cos(-Inf)  -> SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN

SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 4, 5
は定義されているが、2, 3 の記述はない。
(2, 3 に関しては、普通に考えれば 1.0 以外の値を戻すことはありえないと
思うが...)

3. sin
======

3.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

ソースコードの変更がないので非互換なし

3.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. sin(NaN)   ->   NaN
 2. sin(+0.0)  ->  +0.0
 3. sin(-0.0)  ->  -0.0
 4. sin(非正規数*3) -> SUSv3では引数の値、SUSv2(*4) では 0.0
 5. sin(+Inf)  ->  SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN
 6. sin(-Inf)  ->  SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN

*3 非正規数(subnormal)とは、double の場合、-1.0E-95 と +1.0E-95 の間の
   0以外の値。
*4 SUSv2 の仕様書では「戻り値がアンダーフローしたとき」と記述されてい
   る。引数が非常に小さいとき、戻り値は引数とほぼ同じ値になるので「戻
   り値がアンダーフロー」 -> 「戻り値が非正規数」 -> 「引数が非正規数」
   といった論法。

SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1,4,5,6
は定義されているが、2, 3 の記述はない。

4. tan
======

4.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

ソースコードの変更がないので非互換なし

4.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. tan(NaN)  -> NaN
 2. tan(+0.0) -> +0.0
 3. tan(-0.0) -> -0.0
 4. tan(非正規数) -> SUSv3 では引数の値、SUSv2(*4)では 0.0
 5. tan(+Inf) -> SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN
 6. tan(-Inf) -> SUSv3 では NaN または実装依存の値、SUSv2 では 0.0 または NaN
 7. tan(有限値) が overflow したとき -> +-Inf

SUSv3 では 1,2,3,4,5,6 がオプションの動作で、7 は XSI 拡張となっている。SUSv2
では、1, 4, 5, 6,7 は定義されているが、2, 3 の記述はない。

5. acos
=======

5.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

ソースコードの変更はあるが、挙動の変化なし。

5.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. acos(NaN) -> NaN
 2. acos(+1.0) -> +0.0

SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1 は定義
されているが、2 の記述はない。

6. asin
=======

6.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

SUSv3 には、
  If x is subnormal, a range error may occur and x should be returned.
と書かれているので、引数が非正規数のとき実装によっては errno に ERANGE
が設定される。このとき 1.9.1 では Errno::ERANGE 例外が挙がる。
一方、trunk では例外を挙げない。

6.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. asin(NaN) -> NaN
 2. asin(+0.0) -> +0.0
 3. asin(-0.0) -> -0.0
 4. asin(非正規数) -> SUSv3 では引数の値。SUSv2(*4)では 0.0

SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 4 は
定義されているが、2, 3 の記述はない。

7. atan
=======

7.1. SUSv3準拠環境での 1.9.1 と trunk の非互換
----------------------------------------------

ソースコードの変更がないので非互換なし

7.2. trunk でのプラットフォーム間の非互換の可能性
-------------------------------------------------

 1. atan(NaN) -> NaN
 2. atan(+0.0) -> +0.0
 3. atan(-0.0) -> -0.0
 4. atan(+Inf) -> +PI/2
 5. atan(-Inf) -> -PI/2
 6. atan(非正規数) -> SUSv3 では引数の値。SUSv2(*4)では 0.0

SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 6 は
定義されているが、2, 3, 4, 5 の記述はない。

---------------------
今回はここまで。

In This Thread

Prev Next