diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-03-18 15:24:31 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2021-03-18 15:24:31 +0900 |
| commit | a0b3378b360b0ac2d2f2b80502fb88e01516cc08 (patch) | |
| tree | a5760edf10060e37de68be9b9fd8593414ffa94a /src/numeric.c | |
| parent | c0d63ea09f41560f42c9d1f2605723fe5e6fa01c (diff) | |
| download | mruby-a0b3378b360b0ac2d2f2b80502fb88e01516cc08.tar.gz mruby-a0b3378b360b0ac2d2f2b80502fb88e01516cc08.zip | |
numeric.c: float zero division should be infinity with sign kept; fix #5382
Diffstat (limited to 'src/numeric.c')
| -rw-r--r-- | src/numeric.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/numeric.c b/src/numeric.c index e80d5c136..51137d45b 100644 --- a/src/numeric.c +++ b/src/numeric.c @@ -25,6 +25,7 @@ #define floor(f) floorf(f) #define ceil(f) ceilf(f) #define fmod(x,y) fmodf(x,y) +#define copysign(x,y) copysignf(x,y) #define FLO_TO_STR_PREC 8 #else #define FLO_TO_STR_PREC 16 @@ -237,17 +238,17 @@ flo_idiv(mrb_state *mrb, mrb_value xv) mrb_float mrb_num_div_flo(mrb_state *mrb, mrb_float x, mrb_float y) { - mrb_float f; - - if (y == 0) { - if (x > 0) f = INFINITY; - else if (x < 0) f = -INFINITY; - else /* if (x == 0) */ f = NAN; + if (y != 0.0) { + return x / y; + } + else if (x == 0.0) { + return NAN; } else { - f = x / y; + mrb_float a = copysign(1.0, x); + mrb_float b = copysign(1.0, y); + return a * b * INFINITY; } - return f; } static mrb_value |
