From: T Akutsu Date: 2004-04-09T14:15:00+09:00 Subject: [ruby-list:39522] Re: int/int in Ruby2? こんにちは、あくつといいます。 #素人発言です。 (^^ )>> a,b は正の整数 a - b は、a < b ならば、負の整数 a,b は整数( b != 0 ) a / b は、a % b != 0 ならば、有理数 b は整数 b ** a は、a が有理数ならば、実数 Ruby は 1-3 で負の整数を生成する。 Ruby は 1/3 で有理数を生成しない。 Ruby は 3**(1/2) で実数を生成しない。# 3**(0) だから 1 Ruby は、整数を整数の中に閉じ込めるから当然。 AWK と比較。 $ cat n.awk BEGIN{ for( i=1; i<=10; i++ ){ printf("%d / %d = %f\n", i, 10, i / 10); } printf("%d**(%d/%d) = %f\n", 3, 1, 2, 3**(1/2)); exit(0); } $ cat n.rb BEGIN{ 1.upto(10){ |i| printf("%d / %d = %f\n", i, 10, i / 10) } printf("%d**(%d/%d) = %f\n", 3, 1, 2, 3**(1/2)) exit(0) } $ gawk -f n.awk 1 / 10 = 0.100000 2 / 10 = 0.200000 3 / 10 = 0.300000 4 / 10 = 0.400000 5 / 10 = 0.500000 6 / 10 = 0.600000 7 / 10 = 0.700000 8 / 10 = 0.800000 9 / 10 = 0.900000 10 / 10 = 1.000000 3**(1/2) = 1.732051 $ ruby n.rb 1 / 10 = 0.000000 2 / 10 = 0.000000 3 / 10 = 0.000000 4 / 10 = 0.000000 5 / 10 = 0.000000 6 / 10 = 0.000000 7 / 10 = 0.000000 8 / 10 = 0.000000 9 / 10 = 0.000000 10 / 10 = 1.000000 3**(1/2) = 1.000000 $ AWK ユーザーからすると、この結果は不気味です。 int / int を再定義すれば AWK と同じにできますが。 $ cat real.rb require 'rational' class Fixnum alias _old_division / def / (obj) if obj.kind_of?(Integer) && (self % obj)!= 0 Rational(self, obj) else self._old_division obj end end end class Bignum alias _old_division / def / (obj) if obj.kind_of?(Integer) && (self % obj)!= 0 Rational(self, obj) else self._old_division obj end end end $ ruby -rreal.rb n.rb 1 / 10 = 0.100000 2 / 10 = 0.200000 3 / 10 = 0.300000 4 / 10 = 0.400000 5 / 10 = 0.500000 6 / 10 = 0.600000 7 / 10 = 0.700000 8 / 10 = 0.800000 9 / 10 = 0.900000 10 / 10 = 1.000000 3**(1/2) = 1.732051 $ 今からこれを標準とするのは難しいかなと思います。 でも、「AWK と同じですよ」というのは言いやすいですね。