Fixnum#fdiv

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

In message “Re: [ruby-dev:38671] Re: Fixnum#fdiv”
on Wed, 17 Jun 2009 23:04:39 +0900, Tadayoshi F.
[email protected] writes:

|> e$B$=$l$G$b!"L58B$rM-8B$G3d$C$?$iL58B$K$J$k$N$G$O$J$$$G$9$+!#e(B

|e$B$=$l$O2r$C$F$k$s$G$9$,!“e(BRational e$B$d$=$NB>L$CN$N%/%i%9$G$b$=$l$,DLMQ$9$ke(B
|e$B$h$&$J;EAH$,$J$$$N$G!#e(Bfdiv e$B$K$D$$$F$O$H$j$”$($:4{CN$N$b$N$K$D$$$F%Y%?$Ke(B
|e$BBP=h$7$F$$$/$3$H$b$G$-$k$H;W$$$^$9$,!"$=$l$G$$$$$G$7$g$&$+!#e(B

e$B$=$l$OEvA3$G$7$g$&!#86B’$Oe(B

e$B!VL58Be(B fdiv e$BM-8B!W$OL58Be(B
e$B!VL58Be(B fdiv e$BL58B!W$Oe(BNaN

e$B$H$$$&$3$H$K$7$F!“$=$l$rE,MQ$7$F$$$/$7$+$J$$$H!#$”$k$$$OE}0le(B
e$BE*$K07$&$?$a$K$Oe(BNumeric#infinite?e$B$rMQ0U$7$F!"$=$l$GH=CG$9$k$+!#e(B

|Inf <=> X
|e$B$O$I$&9M$($k$N$+!“$”$^$j$&$^$$9M$($,Ib$S$^$;$s!#e(B
|e$B$$$$9M$($,$"$C$?$i65$($F$/$@$5$$!#e(B

e$BL58B$HM-8B$rHf3S$7$?$i!"$$$D$bL58B$,Bg$-$$$H8+$J$9$b$N$J$N$Ge(B
e$B$O$J$$$G$7$g$&$+!#e(BNaNe$B$N>l9g$K$Oe(Bnile$B$G$9$M!#e(B

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

In message “Re: [ruby-dev:38676] Re: Fixnum#fdiv”
on Wed, 17 Jun 2009 23:37:58 +0900, Tadayoshi F.
[email protected] writes:

|> |Inf <=> X
|> |e$B$O$I$&9M$($k$N$+!“$”$^$j$&$^$$9M$($,Ib$S$^$;$s!#e(B
|> |e$B$$$$9M$($,$“$C$?$i65$($F$/$@$5$$!#e(B
|>
|> e$BL58B$HM-8B$rHf3S$7$?$i!”$$$D$bL58B$,Bg$-$$$H8+$J$9$b$N$J$N$Ge(B
|> e$B$O$J$$$G$7$g$&$+!#e(BNaNe$B$N>l9g$K$Oe(Bnile$B$G$9$M!#e(B
|
|e$B$G$9$+$i!"e(Bcoerce e$B0JA0$NH=CG$,I,MW$J$o$1$G$9$h$M!#e(BNumeric#infinite? e$B$bM_e(B
|e$B$$$G$9$7!#$3$3$G$b$&e(B coerce e$B$OGKC>$7$F$$$k$H9M$($F$$$$$G$9$+$M!#e(B

coercee$B$N$3$H$r7|G0$7$F$$$i$C$7$c$C$?$o$1$J$s$G$9$+!#$9$_$^$;e(B
e$B$s!";d$O$3$3$G$O9M$($F$$$^$;$s$G$7$?!#e(B[ruby-dev:38671]e$B$Ge(B
e$B!VL$CN$N%/%i%9!W$H$$C$7$c$C$F$k$s$@$+$i!"EvA39M$($F$$/$Y$-e(B
e$B$G$7$?$M!#e(B

e$B$A$g$C$H9M$($F$_$?$N$G$9$,!"e(B

  • e$BL$CN$N%/%i%9$N>l9g$K$Oe(B x <=> Float(y) e$B$H$9$ke(B

  • e$BL$CN$N%/%i%9$N>l9g$K$Oe(B coerce e$B$r;H$&e(B

e$B$N$$$:$l$G$b!"M-8B$@$,e(BFloat()e$B$r$+$1$k$He(BInfe$B$K$J$k$h$&$J?t$,B8e(B
e$B:_$7$?>l9g$K:$$C$F$7$^$&$H$$$&$3$H$G$9$M!#$J$k$[$I!#e(B

e$B$G!"$3$NBP=h$H$7$Fe(B

  • Numeric#infinite?e$B$rMQ0U$7!"e(Bcoercee$B$r8F$VA0$KL58B$+$I$&$+e(B
    e$B$rH=JL$9$ke(B

  • e$B5$$K$7$J$$!#L$CN$N%/%i%9$N==J,$KBg$-$J?t$OL58B$H$_$J$7$Fe(B
    e$B$7$^$&e(B

e$B$N$$$:$l$+$,9M$($i$l$^$9$M!#B>$K$bBP=hK!$O$"$k$+$b!#;d$J$i8ee(B
e$B<T$rA*$s$G$7$^$$$=$&$G$9$,!"0c$&9M$($N?M$b5o$k$G$7$g$&$M!#e(B

e$B$7$+$7!“e(BFloate$B$Ne(BInfe$B$,:.$8$C$?7W;;$r9T$C$?;~E@$GIT@53N$J$N$G$9e(B
e$B$+$i!”$I$s$J7k2L$,=P$F$b!V:$$k!W$N$O8BDjE*$J5$$,$7$^$9!#$$$Ce(B
e$B$=$N$3$H!"e(BFloat#<=>e$B$Oe(Bselfe$B$,e(BInfe$B$N;~!“1&JU$,e(BInfe$B$^$?$Oe(BNaNe$B$G$J$1e(B
e$B$l$P>o$KBg>.4X78$O8GDj!”$G$bNI$$$N$+$be(B(Infe$B$NId9f$@$1$G7h$^$ke(B)e$B!#e(B

                            e$B$^$D$b$He(B e$B$f$-$R$me(B /:|)

coercee$B$N$3$H$r7|G0$7$F$$$i$C$7$c$C$?$o$1$J$s$G$9$+!#$9$_$^$;e(B
e$B$s!";d$O$3$3$G$O9M$($F$$$^$;$s$G$7$?!#e(B[ruby-dev:38671]e$B$Ge(B
e$B!VL$CN$N%/%i%9!W$H$$C$7$c$C$F$k$s$@$+$i!"EvA39M$($F$$/$Y$-e(B
e$B$G$7$?$M!#e(B

e$B$I$&$bKM$N@bL@$bHsF;$$$b$N$G!"M}2r$,Fq$7$$$h$&$J5$$,$7$^$9$,!#e(B

e$BL58BBg$H$NHf3S$,=PMh$l$P!"$=$l$GL58BBg$+$I$&$+H=CG$G$-$k$o$1$G$9$+$ie(B
infinite?
e$B$H$+$J$/$F$b<h$j4:$($:$J$s$H$+$J$k!"$H$$$&9M$($b$"$j$^$7$?$,e(B
e$B$d$O$j87$7$$$h$&$J5$$,$7$^$9!#e(B

e$B$7$+$b!"L58BBg$+$I$&$+H=CG$9$k$N$O8zN($b0-$$>e$K40A4$G$b$J$$$G$9$+$i!#e(B

e$B$^$D$b$H$5$s$,9M$($F$$$k$N$H0c$&$+$b$7$l$^$;$s$,!“e(Binfinite?
e$B$,$”$k$H$$e(B
e$B$&A0Ds$G$"$/$^$G;n83E*$K=q$$$F$_$^$7$?$1$I!"$$$+$K$b$H$C$F$D$1$?$h$&$G$9!#e(B

Index: numeric.c

— numeric.c (revision 23732)
+++ numeric.c (working copy)
@@ -417,6 +417,24 @@
return Qfalse;
}

+static VALUE
+num_nan_p(VALUE num)
+{

  • return Qfalse;
    +}

+static VALUE
+num_infinite_p(VALUE num)
+{

  • return Qnil;
    +}

+static VALUE
+num_finite_p(VALUE num)
+{

  • return Qtrue;
    +}

/*

  • call-seq:
  • num.abs   => num or numeric
    

@@ -673,9 +691,21 @@
}
}

+#define f_finite_p(x) rb_funcall(x, rb_intern(“finite?”), 0)
+#define f_infinite(x) rb_funcall(x, rb_intern(“infinite?”), 0)
+#define f_infinite_p(x) (!NIL_P(f_infinite(x)))
+#define f_negative_p(x) rb_funcall(x, ‘<’, 1, INT2FIX(0))
+
static VALUE
flo_quo(VALUE x, VALUE y)
{

  • if (f_infinite_p(x) && f_finite_p(y))
  • return rb_float_new((f_negative_p(x) == f_negative_p(y))
  •      ? HUGE_VAL : -HUGE_VAL);
    
  • if (f_finite_p(x) && f_infinite_p(y))
  • return rb_float_new((f_negative_p(x) == f_negative_p(y))
  •      ? 0.0 : -0.0);
    
  • return rb_funcall(x, ‘/’, 1, y);
    }

@@ -3179,6 +3209,9 @@

 rb_define_method(rb_cNumeric, "real?", num_real_p, 0);
 rb_define_method(rb_cNumeric, "integer?", num_int_p, 0);
  • rb_define_method(rb_cNumeric, “nan?”, num_nan_p, 0);
  • rb_define_method(rb_cNumeric, “infinite?”, num_infinite_p, 0);
  • rb_define_method(rb_cNumeric, “finite?”, num_finite_p, 0);
    rb_define_method(rb_cNumeric, “zero?”, num_zero_p, 0);
    rb_define_method(rb_cNumeric, “nonzero?”, num_nonzero_p, 0);

Index: bignum.c

— bignum.c (revision 23732)
+++ bignum.c (working copy)
@@ -2451,12 +2451,20 @@
*
*/

+#define f_finite_p(x) rb_funcall(x, rb_intern(“finite?”), 0)
+#define f_infinite(x) rb_funcall(x, rb_intern(“infinite?”), 0)
+#define f_infinite_p(x) (!NIL_P(f_infinite(x)))
+#define f_negative_p(x) rb_funcall(x, ‘<’, 1, INT2FIX(0))

VALUE
rb_big_fdiv(VALUE x, VALUE y)
{
double dx, dy;

  • if (f_infinite_p(y))
  • return rb_float_new((f_negative_p(x) == f_negative_p(y))
  •      ? 0.0 : -0.0);
    
  • dx = big2dbl(x);
    switch (TYPE(y)) {
    case T_FIXNUM:
    Index: rational.c
    ===================================================================
    — rational.c (revision 23732)
    +++ rational.c (working copy)
    @@ -766,9 +766,17 @@
    }
    }

+#define f_finite_p(x) rb_funcall(x, rb_intern(“finite?”), 0)
+#define f_infinite(x) rb_funcall(x, rb_intern(“infinite?”), 0)
+#define f_infinite_p(x) (!NIL_P(f_infinite(x)))
+
static VALUE
nurat_fdiv(VALUE self, VALUE other)
{

  • if (f_infinite_p(other))
  • return rb_float_new((f_negative_p(self) == f_negative_p(other))
  •      ? 0.0 : -0.0);
    
  • return f_to_f(f_div(self, other));
    }