diff options
| author | ksss <[email protected]> | 2014-03-21 22:24:33 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-03-21 22:24:33 +0900 |
| commit | 8891cea41c8396012f786be00ee8d470f45241c1 (patch) | |
| tree | 0e78e71f6c0cb2fa6972ebee339e133a3e8f20e8 /src/numeric.c | |
| parent | 07bd65ae65ba1092191f5a702ce3c15aaca2ab5f (diff) | |
| download | mruby-8891cea41c8396012f786be00ee8d470f45241c1.tar.gz mruby-8891cea41c8396012f786be00ee8d470f45241c1.zip | |
Float#round fix bug for infinity and nan cases
Diffstat (limited to 'src/numeric.c')
| -rw-r--r-- | src/numeric.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/numeric.c b/src/numeric.c index 6adfff344..b2507fb0b 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -594,6 +594,16 @@ flo_round(mrb_state *mrb, mrb_value num) mrb_get_args(mrb, "|i", &ndigits); number = mrb_float(num); + + if (isinf(number)) { + if (0 < ndigits) return num; + else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, number < 0 ? "-Infinity" : "Infinity"); + } + if (isnan(number)) { + if (0 < ndigits) return num; + else mrb_raise(mrb, E_FLOATDOMAIN_ERROR, "NaN"); + } + f = 1.0; i = abs(ndigits); while (--i >= 0) @@ -621,7 +631,11 @@ flo_round(mrb_state *mrb, mrb_value num) if (ndigits < 0) number *= f; else number /= f; } - if (ndigits > 0) return mrb_float_value(mrb, number); + + if (ndigits > 0) { + if (isinf(number) || isnan(number)) return num; + return mrb_float_value(mrb, number); + } return mrb_fixnum_value((mrb_int)number); } |
