diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-22 16:58:56 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-03-22 16:58:56 +0900 |
| commit | 5488da6c445f4c72d2f916d7dcbc44c29852cfb6 (patch) | |
| tree | ccc2aa4183f624f248b198024cfde51477dd2163 /src | |
| parent | 064030732a18e9c9234ac929816f55a896e25003 (diff) | |
| parent | 8891cea41c8396012f786be00ee8d470f45241c1 (diff) | |
| download | mruby-5488da6c445f4c72d2f916d7dcbc44c29852cfb6.tar.gz mruby-5488da6c445f4c72d2f916d7dcbc44c29852cfb6.zip | |
Merge pull request #1907 from ksss/float-round
Float#round fix bug for infinity and nan cases
Diffstat (limited to 'src')
| -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); } |
