正木です。

In message "[ruby-math:00828] Re: -3**2 == 9 ?"
    on 03/01/09, Yukihiro Matsumoto <matz / ruby-lang.org> writes:


|は譲れないだろうとして、「**演算子の優先順位が単項マイナスよ
|りも強いべき」というのはそれほどこだわりのあることではないの
|でしょうか。

数学の習慣では単項マイナスの優先順位は乗算よりは下です。
-1 と -2 の積は (-2)・(-3) と書かなくてはいけません。
除算の場合は、記号の関係で優先順位は問題になりません。
(分母、分子に自動的に括弧がつく

   -2      (-2)
  ----- =  -----
    3       3

ので)

加法、減法にかんしても
(-1) + (-3)
のように括弧でくくるのが普通です。
これは単項マイナスの優先順位がかなり低いと考えられていることを示して
います。

ですから羃乗だけが例外的に単項マイナスより優先順位が高いと思うのは誤解
です。乗法、除法については
(-a)*b == -(a*b)
(-a)/b == -(a/b)
という性質のせいで関係なくなるだけです。

私はこの習慣が、合理的ともいえないけれども、特別不合理だとも感じません。
単項マイナスの優先順位が最高順位になっていたとしても、それはそれで
すっきりしていたとは思いますが。
ですから、こだわりもありませんが変更すべきだとも思いません。


ruby 1.8.0 (2003-01-03) [i686-linux] でも、即値でない場合は

-a.floor == -(a.floor)
-a.ceil == -(a.ceil)
-a.next == -(a.next)
-a**m == -(a**m)

となっているのは、無意識のうちに上記の数学の習慣にしたがっている
からではないでしょうか?


Ruby の仕様が数学での習慣と絶対に一致していなくてはいけないという
ことはないので、単項マイナスの優先順位を ** の上にもっていくという
のも選択肢の一つとしては有りうると思います。
ただ普通とは逆の仕様を採用することによる不利益をどう評価するかが
問題です。


私自身については
1.0 == 1  => true なのに
1.0/2 == 1/2  => false 
という仕様は受け入れられませんが、
-3**2 == 9
の方は、そういう仕様だと思って気をつければいいだけのことなので、絶対
に受け入れられないというほどのことではありません。