summaryrefslogtreecommitdiffhomepage
path: root/src/numeric.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2021-08-23 10:44:04 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2021-08-23 10:53:23 +0900
commit6f46f8887334d99fb2ccec7688f99c8bda080408 (patch)
treed31d1640c199d12edd03e70c00f8aac78b91aa05 /src/numeric.c
parent11cfe77eb1675d461709bda4e413ee2966945195 (diff)
downloadmruby-6f46f8887334d99fb2ccec7688f99c8bda080408.tar.gz
mruby-6f46f8887334d99fb2ccec7688f99c8bda080408.zip
numeric.c: fix: `-0.0.abs` returned `-0.0`.
Diffstat (limited to 'src/numeric.c')
-rw-r--r--src/numeric.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/numeric.c b/src/numeric.c
index c159c717a..1a006b7e3 100644
--- a/src/numeric.c
+++ b/src/numeric.c
@@ -978,6 +978,15 @@ flo_nan_p(mrb_state *mrb, mrb_value num)
{
return mrb_bool_value(isnan(mrb_float(num)));
}
+
+static mrb_value
+flo_abs(mrb_state *mrb, mrb_value num)
+{
+ mrb_float f = mrb_float(num);
+
+ if (signbit(f)) return mrb_float_value(mrb, -f);
+ return num;
+}
#endif
/*
@@ -1910,6 +1919,7 @@ mrb_init_numeric(mrb_state *mrb)
mrb_define_method(mrb, fl, "to_s", flo_to_s, MRB_ARGS_NONE()); /* 15.2.9.3.16(x) */
mrb_define_method(mrb, fl, "inspect", flo_to_s, MRB_ARGS_NONE());
mrb_define_method(mrb, fl, "nan?", flo_nan_p, MRB_ARGS_NONE());
+ mrb_define_method(mrb, fl, "abs", flo_abs, MRB_ARGS_NONE()); /* 15.2.7.4.3 */
#ifdef INFINITY
mrb_define_const_id(mrb, fl, MRB_SYM(INFINITY), mrb_float_value(mrb, INFINITY));