summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-03-18 15:24:31 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-03-18 15:24:31 +0900
commita0b3378b360b0ac2d2f2b80502fb88e01516cc08 (patch)
treea5760edf10060e37de68be9b9fd8593414ffa94a /src/numeric.c
parentc0d63ea09f41560f42c9d1f2605723fe5e6fa01c (diff)
downloadmruby-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.c17
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