坂野 正明です。

影響が広い範囲に亙る問題だと思いますので、ruby-math から、
ruby-list の方に振ります。まつもとさんから、議論の提起は歓迎、
というありがたいお言葉を頂きましたので。


Ruby2 の仕様が固まりつつある現在、Ruby2 において、
	int/int
つまり、整数における「/」の扱いの仕様は何がいいか、
という提案を、[ruby-math:01013] にて、行ないました。
それに対して、まつもとさんがすぐ [ruby-math:01014] で
返事を下さいました (どうもありがとうございます _o_)。

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/1013
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/1014

思うところのある方、是非、御意見を出して下さいな (^_^)
Ruby2 では、"必ずしも"互換性にこだわらない、という話ですから、
今がいい機会かと思います。


参考のため、現状の仕様他を以下に簡単にまとめておきます。
# 万一何か誤解がありましたら、御指摘下さいませ。

   ---------- *  ---------- *  ----------

○Rubyでは、「/」記号は、第一義として「÷」を意味しています。

  Integer(整数)、Float(浮動小数点)に対し、
	[Integer/Integer]  10/5 => 2   [Integer]
	[Float/Float]  10.0/5.0 => 2.0 [Float; 正確に2.0になるとは限らない]

  両者が入り交じる場合、結果はFloat に自動変換されます。
	[Integer/Float]  10/5.0 => 2.0 [Float; 正確に2.0になるとは限らない]
	[Float/Integer]  10.0/5 => 2.0 [Float; 正確に2.0になるとは限らない]

  # (Float演算が近似計算になることを認める限り)ここまでの結果は、
  # ほぼ万人にとって自然でしょう。

  違いが出てくるのは、[Integer/Integer] で、結果が割り切れない時です。
  現状は、本来の商を超えない最大の整数(Integer)を返します。
	[Integer/Integer]  4/3    =>  1   [Integer]
	[Integer/Integer]  (-4)/3 => -2   [Integer]
  # このような挙動を「整除」と言うそうです。

  この結果は、(小数、分数がある時の)紙の上の計算とはずれます。
  現在の Ruby で、演算結果を、紙の上の計算と一致させる方法は、
  いくつかあります。

    1. Floatに変換して計算する
	(4.to_f)/3    =>  1.33333333333333
	((-4).to_f)/3 => -1.33333333333333
	# Float ですから、結果は、誤差を含み得ます。

    2. 有理数クラス(Rational)を導入し、「/」の挙動を変更する。
	具体的には、require "rational"; require "mathn"; を行なう。
	4/3    =>  4/3  [有理数: Rational(4, 3)]
	(-4)/3 => -4/3  [有理数: Rational(-4, 3)]
	# 有理数ですから、結果には、誤差がありません。

    3. 「/」の代わりに、「.quo」を用いる (Ruby 1.8 から)
	4.quo(3)    =>  1.33333333333333[Float] または  4/3[Rational]
	(-4).quo(3) => -1.33333333333333[Float] または -4/3[Rational]
	# 現在の Default は前者。require "rational" を行なっていたら、
	# 後者。

	# (参考)「整除」を表す method として、「.div」(Ruby 1.8)もあります。
	# http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/833

  以上が、現状です。


  紙の上の計算との一致という意味では、上の 2. が紛れのない解決法か
  と思いまして、私としては、標準として推しているところです。
  # 計算機言語では、CommonLisp や Smalltalk がそうだった?

  一方、整数という型が厳然としてある計算機言語では、「整除」はしばしば
  用いられるようです。たとえば、C, Fortran77 では、いずれも、
	[整数/整数]  4/3    =>  1   [整数]
	[整数/整数]  (-4)/3 => -1   [整数]
  となって、正の数に対する演算は現Rubyと一致します (負の場合は
  一致しませんが)。
  # 参考までに、Perlは原則Float計算、Pythonは現Rubyと同じようです。

  現在の挙動が嬉しい(自然?)かどうか、そして互換性を犠牲にして変更する
  価値があるかどうか、が議論のポイントだと認識しています。
  過去、盛り上がったスレッドとして、
	http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-math/552
  に始まるものを参考までに挙げておきます(しばしば高度に数学的になって
  私は全部はフォローできないものでしたが ^^;)。

よろしくお願い致します。


--
坂野 正明