Rational

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:28551] Re: Rational”
on Thu, 13 Apr 2006 01:34:51 +0900, Shin-ichiro HARA
[email protected] writes:

|e$B$G$b!"$b$7$=$l$r$d$k$J$i!"BgJQ99$G$9$+$i!“e(B1.9.* e$B$G$O$J$/$Fe(B Ruby2.0
|e$B$G!”$H$$$&$3$H$K$J$j$=$&$G$9$h$M!#e(B

1.9e$B$H$$$&$N$Oe(B2.0e$B$N;EMM8!F$HG$G$9$+$iBgJQ99$OK>$`$H$3$m$G$9!#e(B
2.0e$B$G$d$k$H$$$&$3$H$O!"e(B1.9e$B$G$d$k$H$$$&$3$H$G$9!#e(B

e$B86$G$9!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

|e$B$G$b!"$b$7$=$l$r$d$k$J$i!"BgJQ99$G$9$+$i!“e(B1.9.* e$B$G$O$J$/$Fe(B Ruby2.0
|e$B$G!”$H$$$&$3$H$K$J$j$=$&$G$9$h$M!#e(B

1.9e$B$H$$$&$N$Oe(B2.0e$B$N;EMM8!F$HG$G$9$+$iBgJQ99$OK>$`$H$3$m$G$9!#e(B
2.0e$B$G$d$k$H$$$&$3$H$O!"e(B1.9e$B$G$d$k$H$$$&$3$H$G$9!#e(B

e$B$"!"$=$s$J5$$,$7$F$$$^$7$?!#e(B1.8e$B$,e(B1.9e$B$NA0$K$"$k$N$O$$$o$P6vA3$J$o$1e(B
e$B$M!#e(B:-)

e$B$=$&$9$k$He(B2.0e$B$O$=$s$J$K4JC1$K$O%j%j!<%9$5$l$J$$$@$m$&$+$i!“e(B
e$B$3$Ne(BRationale$B$re(B1.8.*e$B$KF~$l$k$3$H$,$G$-$k$h$&$K$7$?$$$J$”!#e(B

e$B86$G$9!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

|e$B$=$&$9$k$He(B2.0e$B$O$=$s$J$K4JC1$K$O%j%j!<%9$5$l$J$$$@$m$&$+$i!“e(B
|e$B$3$Ne(BRationale$B$re(B1.8.*e$B$KF~$l$k$3$H$,$G$-$k$h$&$K$7$?$$$J$”!#e(B

e$B$^$"!"$=$&$J$s$G$9$1$I!#!V$3$Ne(BRationale$B$re(B1.8.*e$B$KF~$l$k!W$C$Fe(B
e$B$N$O!"AH$9~$$G$O$J$$$K$7$F$be(B1.8e$BI8=`E:IU$K$7$?$$$C$F$3$H$Ge(B
e$B$9$+$M!#e(B

1.8.5 e$B$GI8=`E:IU!“e(B1.8.6 e$B$GAH$9~$!”!"!"$H$$$&$N$O5^$.$9$.e(B
e$B$G$9$+!)e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:28558] Re: Rational”
on Thu, 13 Apr 2006 11:46:29 +0900, Shin-ichiro HARA
[email protected] writes:

|1.8.5 e$B$GI8=`E:IU!“e(B1.8.6 e$B$GAH$9~$!”!“!”$H$$$&$N$O5^$.$9$.e(B
|e$B$G$9$+!)e(B

e$BI8=`E:IU$K$O@Q6KE*$K$OH?BP$7$^$;$s$,!“e(B1.8e$B7O$GAH$9~$$@$He(B
e$B!V0UL#$rJQ$($J$$JQ99!W$7$+5v$5$l$J$/$J$k$o$1$G!”$=$l$@$He(B
Rationale$B$N;EMM$K@)Ls$rM?$($^$;$s$+$M!#e(B1.8e$B7O$G$Oe(B(e$B$d$k$K$7$F$be(B)
e$BE:IU!"e(B1.9e$B7O$GAH$9~$$/$i$$$,BEEv$K;W$($^$9$,!#e(B

e$B$A$e!<$+!“e(B1.8e$B7O$GE:IU$9$k0UL#$C$F$=$s$J$K$”$k$N$+$J!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:28556] Re: Rational”
on Thu, 13 Apr 2006 10:31:57 +0900, Shin-ichiro HARA
[email protected] writes:

|e$B$“!”$=$s$J5$$,$7$F$$$^$7$?!#e(B1.8e$B$,e(B1.9e$B$NA0$K$"$k$N$O$$$o$P6vA3$J$o$1e(B
|e$B$M!#e(B:-)

e$B$=$&$G$9$M!#e(B

|e$B$=$&$9$k$He(B2.0e$B$O$=$s$J$K4JC1$K$O%j%j!<%9$5$l$J$$$@$m$&$+$i!“e(B
|e$B$3$Ne(BRationale$B$re(B1.8.*e$B$KF~$l$k$3$H$,$G$-$k$h$&$K$7$?$$$J$”!#e(B

e$B$^$“!”$=$&$J$s$G$9$1$I!#!V$3$Ne(BRationale$B$re(B1.8.*e$B$KF~$l$k!W$C$Fe(B
e$B$N$O!"AH$9~$$G$O$J$$$K$7$F$be(B1.8e$BI8=`E:IU$K$7$?$$$C$F$3$H$Ge(B
e$B$9$+$M!#e(B

e$B86$G$9!#e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

|1.8.5 e$B$GI8=`E:IU!“e(B1.8.6 e$B$GAH$9~$!”!"!"$H$$$&$N$O5^$.$9$.e(B
|e$B$G$9$+!)e(B

e$BI8=`E:IU$K$O@Q6KE*$K$OH?BP$7$^$;$s$,!“e(B1.8e$B7O$GAH$9~$$@$He(B
e$B!V0UL#$rJQ$($J$$JQ99!W$7$+5v$5$l$J$/$J$k$o$1$G!”$=$l$@$He(B
Rationale$B$N;EMM$K@)Ls$rM?$($^$;$s$+$M!#e(B1.8e$B7O$G$Oe(B(e$B$d$k$K$7$F$be(B)
e$BE:IU!"e(B1.9e$B7O$GAH$9~$$/$i$$$,BEEv$K;W$($^$9$,!#e(B

1.8e$B$X$OI8=`E:IU$9$k$K$7$F$bAH$9~$$K$7$F$b!“8=:_$Ne(B rational.rb
e$B$N;EMM$r$G$-$k$@$1JQ$($J$$$h$&$K$9$kJ}?K$G$9!#B?>/$N3HD%$O$”$C$Fe(B
e$B$b!#e(B

e$B$A$e!<$+!“e(B1.8e$B7O$GE:IU$9$k0UL#$C$F$=$s$J$K$”$k$N$+$J!#e(B

e$B%9%T!<%I$,B.$/$J$k!"$H$$$&$0$i$$$N0U5A$G$9!#!J$=$l$b=EMW$J$s$G$9e(B
e$B$,!#!K$@$+$i!"$d$O$jAH$9~$$K$7$?$$$J$"$H!#e(B

e$B8=:_$N;EMM$r$[$H$s$IJQ$($:AH$9~$$K$9$k0U5A$,$"$k$+!"$H$$$&5?Lde(B
e$B$K$O!"!V$"$k!W$H;d$O;W$$$^$9!#Nc$($PKX$Ie(Bquoe$B$,ITMW$K$J$k$H$+!#e(B

e$B86$G$9!#e(B

e$B$1$$$8$e!w$$$7$D$+$G$9e(B.

e$B@PDM$5$s$Oe(B 3 e$B$,e(B Integer e$B$+e(B Rational e$B$+6hJL$,$G$-$J$/$J$C$F:$$k$H$$e(B
e$B$&@b$G$9$,!“e(BInteger e$B$,e(B Rational e$B$K0U?^$;$:JQ2=$7$?$j$9$k$3$H!J$d$=e(B
e$B$N5U!K$OL5$$$N$@$+$i!”%W%m%0%i%^$,e(B 3 e$B$N0UL#$r8m2r$9$k%1!<%9$O>/$J$$e(B
e$B$N$G$O$J$$$G$7$g$&$+!#5U$KNc$($Pe(B Rational e$B$J@0?t78?t$N9TNs$J$I$re(B p
e$B$G%G%P%C%0Cf$KJ,Jl$Ne(B /1 e$B$,$>$m$>$m=P$F$-$?$i$+$J$jH~$7$/$J$$$H;W$&e(B
e$B$s$G$9$1$I!"$I$&$G$7$g$&!#e(B

e$B$$$d!<e(B e$B%G%P%C%/Cf$O2?$,5/$C$F$$$k$+J,$+$i$J$$$G$9$+$i$Me(B. e$B$d$O$je(B, e$B0lL\e(B
e$B$GJ,$+$C$F$[$7$$$G$9e(B. e$B:GDc8Be(B 3R e$B$H$+e(B e$B2?$+0u$,$[$7$$$G$9$h$M$'e(B.

e$B3N$+$K$=$&$+$b!#$5$7$"$?$C$Fe(B Rational(3, 1).inspect e$B$Oe(B “3/1”
e$B$K$7$Fe(B
e$B$*$-$^$9!#e(B

e$B$"!<!"$d$C$Q$jM-M}?t%j%F%i%k$,M_$7$$!#e(B

e$B86$G$9!#e(B

e$B$U$J$P$G$9!#e(B

Common Lisp e$B$G$O!"e(Binteger-decode-floate$B!"e(BHaskell e$B$G$Oe(B decodeFloat e$B$,$“e(B
e$B$k$N$G!“0lHL$N%W%m%0%i%^$,e(B rational/rationalize e$B$N$h$&$J$b$N$r=q$1$k$He(B
e$B;W$$$^$9!#e(Bruby e$B$G$be(B Float#decode e$B$N$h$&$J$b$N$,$”$C$F$b$$$$$N$+$b$7$le(B
e$B$J$$!”$H;W$$$^$7$?!#e(B

Float#decode e$B$H$$$&$N$O!"8=:_$G$be(B

class Float
def decode
f, e = Math.frexp(self)
[Math.ldexp(f, Float::MANT_DIG).floor, e - Float::MANT_DIG]
end
end

e$B$H=q$1$k$N$G$O$J$$$+$J!#e(B

e$B$3$l$r$b$&$9$3$70BA4$K$7$F#C$G<BAu$7$?$H$7$F$b7k9=C1=ce(B
e$B$J$N$G!"$=$l$re(B Float#to_r e$B$K$7$F$b$^$:$/$O$J$$$+$J$H$$$&e(B
e$B5$$b$7$F$-$^$7$?!#$&!<$`!#e(B

e$B$?$H$($P!“e(Be=0 e$B$r%G%U%)%k%H$K$9$k!”$H$$$&$3$H$G$b$$$$$+$b$7$l$J$$$G$9$M!#e(B
Common Lisp e$B$Ne(B rationalize e$B$O!“e(Be e$B$,M?$($i$l$J$$$N$G!”$I$&$7$F$$$k$N$+e(B
e$B$H;W$C$?$s$G$9$,!"e(Bclisp e$B$N%=!<%9$r$A$g$C$H8+$?$H$3$m$G$O!“85$N2>?t$d;Xe(B
e$B?t$K4p$$$?7W;;$,$”$j$^$9$M!#e(B

clisp e$B$G$9$+!"!"!"$A$g$C$H8+$F$_$^$7$?$,e(B r e$B$KBP$9$ke(B e
e$B$NCM$,$@$$$?$$!“e(B
f0, e0 = r.decode e$B$H$7$?$H$-$Ne(B 2**e0/2
e$B$K$J$C$F$^$9$M!#$?$V$s$3$l$Ge(B
e$B$$$$$s$@$m$&$J$”!#e(B

e$B$3$l$r<h$jF~$l$F!"99$Ke(B[ruby-dev:28544]
e$B$r%k!<%W$G=q$-D>$9$H!"e(B

def rationalize(r, e = nil)
return(-rationalize(-r, e)) if r < 0
if e
raise ArgumentError, “negative precision” if e < 0
x = Rational(r - e)
y = Rational(r + e)

return x if x == y

xn, xd = x.numerator, x.denominator
yn, yd = y.numerator, y.denominator

else
f0, e0 = r.decode

return f0 << e0 if e0 >= 0

xn, xd = 2*f0 - 1, 1 << (1 - e0)
yn, yd = 2*f0 + 1, 1 << (1 - e0)

end

a, b, c, d = 1, 0, 0, 1
while true
xq, xr = xn.divmod(xd)
yq, yr = yn.divmod(yd)

if xr.zero?
  return Rational(a*xq + b, c*xq + d)
elsif xq < yq
  return Rational(a*(xq + 1) + b, c*(xq + 1) + d)
elsif xq > yq
  raise "implementation error"
end

a, b, c, d = a*xq + b, a, c*xq + d, c
xn, xd, yn, yd = yd, yr, xd, xr

end
end

e$B$H$J$j$^$7$?!#e(B

e$B$$$:$l$K$7$F$b!“e(Brationalize e$BAjEv$O!”$"$l$P$$$$$J!"$/$i$$$@$H;W$&$N$G!"e(B
e$B:#$9$0<BAu$G$-$J$/$F$b$$$$$H;W$$$^$9$,!#e(B

e$B$d$O$j$3$l$OLLGr$$$N$G!"e(Brational.c
e$B$K4^$a$F$_$k$3$H$K$7$^$7$?!#e(B

class Float
def -(y)
(rationalize - y.rationalize).to_f
end
end

p 61.1 - 60.0 == 1.1 #=> true

e$B$H$+$G$-$F!"$+$J$j%J%$%9$G$9!#e(B

e$B$U$J$P$G$9!#e(B

Float#decode e$B$H$$$&$N$O!"8=:_$G$be(B
(e$BCfN,e(B)
e$B$H=q$1$k$N$G$O$J$$$+$J!#e(B

e$B$?$7$+$K!#e(B

clisp e$B$G$9$+!"!"!"$A$g$C$H8+$F$$^$7$?$,e(B r e$B$KBP$9$ke(B e e$B$NCM$,$@$$$?$$!“e(B
f0, e0 = r.decode e$B$H$7$?$H$-$Ne(B 2**e0/2 e$B$K$J$C$F$^$9$M!#$?$V$s$3$l$Ge(B
e$B$$$$$s$@$m$&$J$”!#e(B
(e$BCfN,e(B)
e$B$d$O$j$3$l$OLLGr$$$N$G!"e(Brational.c e$B$K4^$a$F$
$k$3$H$K$7$^$7$?!#e(B

e$B$$$$46$8$G$9$M!#K>$Gv$+$H;W$C$?$1$I!"8@$C$F$$F$h$+$C$?$+$b!#e(B

e$B$I$N$h$&$J7A$GDs6!$5$l$k$3$H$K$J$k$s$G$7$g$&$M!#KM$O!"e(BFloat#to_r
e$B$H$Oe(B
e$BJL$K$7$?$[$&$,$$$$$h$&$J5$$,$9$k$s$G$9$,!#e(B