坂野 正明です。

Ruby2 の仕様が固まりつつある、と聞いています。
そこで、(ruby-math でも過去、何度か議論を見かけましたが)
	int/int
つまり、整数における「/」の扱いの仕様については、Ruby2 において
何か変更は議論されていますでしょうか?

まだ議論中と仮定して、以下、意見表明します。
もし、方針が固まっている、ということでしたら、以下は、
捨ておいて下さいませ。


私個人的には、紙の上の計算結果と Ruby の表記とが一致してくれるのが、
一番自然に思えます。ですので、端的には、
	3÷2×2 は、3
になって欲しい。
# 小数または分数を習った小学生以上(つまり初等教育を受けた人ほぼ全員)に
# 上の問題を出すと、3 と答が返ってくるでしょう。

計算機の、特に低級言語やあるいは高級でも速度重視の言語では、どうしても
計算機の枠組(2進数)に囚われますから、実装上の都合として Float とかが
使われるのはよく理解できます。同様に int/int => int も実装上の都合と
して理解できます。でも、「数」というオブジェクトを体現できる Ruby で
は、普通の算数のルールにできるだけ近い方が、嬉しく感じます。


では、3/2 が何を返すべきか、という問題は…、

At Thu, 25 Apr 2002 15:22:56 +0900,
[ruby-math:00732] 
Message-ID <1019715776.845922.2012.nullmailer / picachu.netlab.jp>,
Yukihiro Matsumoto wrote:
> 「float は real の近似」も「Rational が導入された時点で 
> int/int -> rational にする」もちょっと受け入れがたいんですけ
> ど。
> 
> 私も聞く耳を持たないわけじゃないんで「/は除算で整除じゃない」
> という人の主張も理解できます。が、じゃあなにを返すべきなのか
> という問題がきちんと片付かない限り、非互換性を導入できません。

除算の記号は、Ruby で「/」「.quo」「.div」など使われています。
| Subject: [ruby-math:00833] Numeric#quo
| From: matz / ruby-lang.org (Yukihiro Matsumoto)
| Message-Id: <1043302885.884419.29151.nullmailer / picachu.netlab.jp>

ただ、普通の算数で、「/」は「÷」とほぼ同意だと思いますので、
「/」には拘りたいところです。

高校(中学でしたっけ?)数学の定義では、
	整数分の整数
という分数で表すことのできる数を有理数と定義づけています。
ですので、定義通り有理数(Rational)を返す、ということに、一票入れます。
# Rational を組み込みに、という前提がありますが…。
# 次善の策は、「/」と現行の「.quo」とを同一視に、一票。

小数または分数を習う小学生以前の割算を念頭に
	3/2 は 1あまり1
を返す、という主張はあり得ると思いますが…、その場合、後ろの
計算につなげるのが大変になっちゃって、嬉しい人はあんまりいない
気がします。


* * *

私は、Ruby で Rational クラスを知って、感激した口です。
これで、Float という計算機特有の丸め誤差という気持ち悪さから多少なり
とも解放されて、本来の(論理の筋を書くという意味での)プログラミングに
より専念できる、と。
# ですので、たとえば将来的には、
# 	((√3)/2)**2 が 3/4 (誤差なし0.75)
# を返してくれると、紙の上の概念と一致して嬉しいなぁ、と感じる
# ものです。

いかがでしょうか。


* * *

関連した余談を二、三。
紙の上の概念との一致、という意味では、mathn を require した
ような状態、つまり、
	Rational(4,2) は、整数の 2
と自動的に見なされるのが個人的には自然に感じます。
多分、クラスの包含関係も、理想は、
	Integer < Rational < Real < Numeric
なんでしょうね。
この時(mathn を require)の今の仕様
	print Rational(3,2)  => 3/2
は、Float などに変換して出力してくれた方が私としては手軽に感じます…。
	p Rational(3,2)  => 3/2
は現状ままを推しますが。もっとも、to_s メソッドを自分で再定義するか、
printf を使えばいいだけなので、特に困るわけではありませんが。
# 話ついでまでに。

--
坂野 正明