From: KUBO Takehiro Date: 2010-09-05T21:37:16+09:00 Subject: [ruby-dev:42181] Re: Math モジュールの互換性(was: Math::atan2(0, 0) on ruby 1.9.2) 久保です。 Mathモジュールの関数の互換性の調査第二回です。全26個の関数のうち 第一回は最初の7個(atan2, cos, sin, tan, acos, asin, atan)で、第二回の 今回は次の7個(cosh, sinh, tanh, acosh, asinh, atanh, exp)です。 チェック項目は以下の2つ。 (1) SUSv3準拠環境での 1.9.1 と trunk の非互換 (2) trunk でのプラットフォーム間の非互換の可能性 普通に考えれば当然の動作と言えるものも SUSv3 ではオプションの動作 になっている模様。当然じゃない動作をする実装もあるからなのか? 詳しくは ruby-dev:42155 を参照。 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/42155 8. cosh ======= 8.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ---------------------------------------------- ソースコードの変更がないので非互換なし 8.2. trunk でのプラットフォーム間の非互換の可能性 ------------------------------------------------- 1. cosh(NaN) -> NaN 2. cosh(+0.0) -> 1.0 3. cosh(-0.0) -> 1.0 4. cosh(+Inf) -> +Inf 5. cosh(-Inf) -> +Inf SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 4, 5 は定義されているが、2, 3 の記述はない。 9. sinh ======= 9.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ---------------------------------------------- ソースコードの変更がないので非互換なし 9.2. trunk でのプラットフォーム間の非互換の可能性 ------------------------------------------------- 1. sinh(NaN) -> NaN 2. sinh(+0.0) -> +0.0 3. sinh(-0.0) -> -0.0 4. sinh(+Inf) -> +Inf 5. sinh(-Inf) -> -Inf 6. sinh(非正規数) -> SUSv3 では 引数の値、SUSv2 では 0.0 SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 6 は定義されているが、2, 3, 4, 5 の記述はない。 10. tanh ======== 10.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ----------------------------------------------- ソースコードの変更がないので非互換なし 10.2. trunk でのプラットフォーム間の非互換の可能性 -------------------------------------------------- 1. tanh(NaN) -> NaN 2. tanh(+0.0) -> +0.0 3. tanh(-0.0) -> -0.0 4. tanh(+Inf) -> +1.0 5. tanh(-Inf) -> -1.0 6. tanh(非正規数) -> SUSv3 では 引数の値、SUSv2 では 0.0 SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1, 6 は定義されているが、2, 3, 4, 5 の記述はない。 11. acosh ========= 11.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ----------------------------------------------- ソースコードの変更はあるが、挙動の変化なし。 11.2. trunk でのプラットフォーム間の非互換の可能性 -------------------------------------------------- 1. acosh(NaN) -> NaN 2. acosh(+1.0) -> +0.0 3. acosh(+Inf) -> +Inf SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1 は定義されているが、2, 3 の記述はない。 12. asinh ========= 12.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ----------------------------------------------- ソースコードの変更がないので非互換なし 12.2. trunk でのプラットフォーム間の非互換の可能性 -------------------------------------------------- 1. asinh(NaN) -> NaN 2. asinh(+0.0) -> +0.0 3. asinh(-0.0) -> -0.0 4. asinh(+Inf) -> +Inf 5. asinh(-Inf) -> -Inf 6. asinh(非正規数) -> SUSv3 では 引数の値 SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1 は定義されているが、2, 3, 4, 5, 6 の記述はない。 13. atanh ========= 13.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ----------------------------------------------- 1.9.1 trunk ---------------- ---------------- ------- 1. atanh(非正規数) Errno::ERANGE(*5) 引数の値 2. atanh(+1.0) Errno::ERANGE +Inf 3. atanh(-1.0) Errno::ERANGE -Inf *5 仕様書には "a range error may occur" と書かれている。例外を上げるか、 trunk と同じ動作をするかは実装に依存する。 13.2. trunk でのプラットフォーム間の非互換の可能性 -------------------------------------------------- 1. atanh(NaN) -> NaN 2. atanh(+0.0) -> +0.0 3. atanh(-0.0) -> -0.0 4. atanh(非正規数) -> SUSv3 では 引数の値 SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1 は定義されているが、2, 3, 4 の記述はない。 14. exp ======= 14.1. SUSv3準拠環境での 1.9.1 と trunk の非互換 ----------------------------------------------- ソースコードの変更がないので非互換なし 14.2. trunk でのプラットフォーム間の非互換の可能性 -------------------------------------------------- 1. exp(NaN) -> NaN 2. exp(+0.0) -> 1.0 3. exp(-0.0) -> 1.0 4. exp(+Inf) -> +Inf 5. exp(-Inf) -> +0.0 SUSv3 では上記すべてオプションの動作となっている。SUSv2 では、1 は定義されているが、2, 3, 4, 5 の記述はない。 --------------------- 今回はここまで。