前田です。 In message "[ruby-list:7077] Re: MP [Re: infinity]" Shugo Maeda <shugo / po.aianet.ne.jp> wrote: |これだと1 < NaN,1 == NaN,1 > NaNのすべてをfalseにするのは無理ですね。 |演算ごとに全部定義するしかないのかな...。 とりあえず修正してみました。 パッチを付けておきます。 # exp(Inf)がNaNになるのはCでも同じみたいです。 -- 前田 修吾
--- numeric.c~ Wed Mar 11 01:45:47 1998 +++ numeric.c Wed Mar 11 01:40:48 1998 @@ -419,6 +419,110 @@ } static VALUE +flo_gt(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2INT(y); + break; + + case T_BIGNUM: + b = big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + break; + + default: + return num_coerce_bin(x, y); + } + return (a > b)?TRUE:FALSE; +} + +static VALUE +flo_ge(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2INT(y); + break; + + case T_BIGNUM: + b = big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + break; + + default: + return num_coerce_bin(x, y); + } + return (a >= b)?TRUE:FALSE; +} + +static VALUE +flo_lt(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2INT(y); + break; + + case T_BIGNUM: + b = big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + break; + + default: + return num_coerce_bin(x, y); + } + return (a < b)?TRUE:FALSE; +} + +static VALUE +flo_le(x, y) + VALUE x, y; +{ + double a, b; + + a = RFLOAT(x)->value; + switch (TYPE(y)) { + case T_FIXNUM: + b = (double)FIX2INT(y); + break; + + case T_BIGNUM: + b = big2dbl(y); + break; + + case T_FLOAT: + b = RFLOAT(y)->value; + break; + + default: + return num_coerce_bin(x, y); + } + return (a <= b)?TRUE:FALSE; +} + +static VALUE flo_eql(x, y) VALUE x, y; { @@ -1218,6 +1322,10 @@ rb_define_method(cFloat, "**", flo_pow, 1); rb_define_method(cFloat, "==", flo_eq, 1); rb_define_method(cFloat, "<=>", flo_cmp, 1); + rb_define_method(cFloat, ">", flo_gt, 1); + rb_define_method(cFloat, ">=", flo_ge, 1); + rb_define_method(cFloat, "<", flo_lt, 1); + rb_define_method(cFloat, "<=", flo_le, 1); rb_define_method(cFloat, "eql?", flo_eql, 1); rb_define_method(cFloat, "hash", flo_hash, 0); rb_define_method(cFloat, "to_i", flo_to_i, 0);