From 7c2be58e2a255c856285e0ccfd0a11d81adbb6dc Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 22 May 2024 12:13:54 +0900 Subject: [PATCH] mruby-rational (rational_pow): fix wrong power calculation `a/b ** -n` can be calculated by `b/a ** n` for correctness. --- mrbgems/mruby-rational/src/rational.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mrbgems/mruby-rational/src/rational.c b/mrbgems/mruby-rational/src/rational.c index 7ec87b7b9..774c08d57 100644 --- a/mrbgems/mruby-rational/src/rational.c +++ b/mrbgems/mruby-rational/src/rational.c @@ -690,6 +690,12 @@ rational_pow(mrb_state *mrb, mrb_value x) if (i == 1) { return x; } + if (i < 0) { + i = -i; + if (i < 0) rat_overflow(mrb); + return rational_new_i(mrb, (mrb_int)pow((mrb_float)p1->denominator, (mrb_float)i), + (mrb_int)pow((mrb_float)p1->numerator, (mrb_float)i)); + } return rational_new_i(mrb, (mrb_int)pow((mrb_float)p1->numerator, (mrb_float)i), (mrb_int)pow((mrb_float)p1->denominator, (mrb_float)i)); }