diff options
| author | Daniel Bovensiepen <[email protected]> | 2012-11-01 16:12:57 +0800 |
|---|---|---|
| committer | Daniel Bovensiepen <[email protected]> | 2012-11-01 16:12:57 +0800 |
| commit | cdb72a05a294eb8521dd40c011160228496312cb (patch) | |
| tree | 283586ad23f2dc6dfd1fd1aaa354f18c23d8c0d6 /src/numeric.c | |
| parent | 88dfaf19aa0808f78d13133d61ea433d043923f9 (diff) | |
| parent | 57910ca5353e1feba1fb069a876b84a52f33d39f (diff) | |
| download | mruby-cdb72a05a294eb8521dd40c011160228496312cb.tar.gz mruby-cdb72a05a294eb8521dd40c011160228496312cb.zip | |
Merge remote-tracking branch 'upstream/master' into mrbgems
Diffstat (limited to 'src/numeric.c')
| -rw-r--r-- | src/numeric.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/numeric.c b/src/numeric.c index acc658e5c..c1491ac51 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -245,6 +245,11 @@ flodivmod(mrb_state *mrb, mrb_float x, mrb_float y, mrb_float *divp, mrb_float * { mrb_float div, mod; + if (y == 0.0) { + *divp = str_to_mrb_float("inf"); + *modp = str_to_mrb_float("nan"); + return; + } mod = fmod(x, y); if (isinf(x) && !isinf(y) && !isnan(y)) div = x; @@ -772,6 +777,9 @@ fix_mod(mrb_state *mrb, mrb_value x) if (FIXNUM_P(y) && (b=mrb_fixnum(y)) != 0) { mrb_int mod; + if (mrb_fixnum(y) == 0) { + return mrb_float_value(str_to_mrb_float("nan")); + } fixdivmod(mrb, a, mrb_fixnum(y), 0, &mod); return mrb_fixnum_value(mod); } @@ -798,6 +806,10 @@ fix_divmod(mrb_state *mrb, mrb_value x) if (FIXNUM_P(y)) { mrb_int div, mod; + if (mrb_fixnum(y) == 0) { + return mrb_assoc_new(mrb, mrb_float_value(str_to_mrb_float("inf")), + mrb_float_value(str_to_mrb_float("nan"))); + } fixdivmod(mrb, mrb_fixnum(x), mrb_fixnum(y), &div, &mod); return mrb_assoc_new(mrb, mrb_fixnum_value(div), mrb_fixnum_value(mod)); } @@ -937,9 +949,8 @@ fix_xor(mrb_state *mrb, mrb_value x) static mrb_value lshift(mrb_state *mrb, mrb_int val, unsigned long width) { - if (width > (sizeof(mrb_int)*CHAR_BIT-1) - || ((unsigned long)abs(val))>>(sizeof(mrb_int)*CHAR_BIT-1-width) > 0) { - mrb_raise(mrb, E_RANGE_ERROR, "width(%d) > (%d:sizeof(mrb_int)*CHAR_BIT-1)", width, + if (width > (sizeof(mrb_int)*CHAR_BIT-1)) { + mrb_raisef(mrb, E_RANGE_ERROR, "width(%d) > (%d:sizeof(mrb_int)*CHAR_BIT-1)", width, sizeof(mrb_int)*CHAR_BIT-1); } val = val << width; @@ -1153,7 +1164,7 @@ mrb_fix2str(mrb_state *mrb, mrb_value x, int base) int neg = 0; if (base < 2 || 36 < base) { - mrb_raise(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); + mrb_raisef(mrb, E_ARGUMENT_ERROR, "invalid radix %d", base); } if (val == 0) { return mrb_str_new(mrb, "0", 1); |
