Skip to content

Commit e01173f

Browse files
gh-127: Fix ROOT.
1 parent 80094ed commit e01173f

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

src/builtins.c

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4186,6 +4186,8 @@ static Value builtin_root(Interpreter* interp, Value* args, int argc, Expr** arg
41864186
if (args[0].type != args[1].type) {
41874187
RUNTIME_ERROR(interp, "ROOT cannot mix INT and FLT", line, col);
41884188
}
4189+
4190+
int out_base = result_base_from_values(args[0], args[1]);
41894191

41904192
if (args[0].type == VAL_INT) {
41914193
int64_t x = args[0].as.i;
@@ -4200,9 +4202,9 @@ static Value builtin_root(Interpreter* interp, Value* args, int argc, Expr** arg
42004202
if (x != 1 && x != -1) {
42014203
RUNTIME_ERROR(interp, "Negative ROOT exponent yields non-integer result", line, col);
42024204
}
4203-
return value_int(x);
4205+
return value_int_base(x, out_base);
42044206
}
4205-
if (n == 1) return value_int(x);
4207+
if (n == 1) return value_int_base(x, out_base);
42064208
if (x >= 0) {
42074209
// Binary search for floor of nth root
42084210
int64_t lo = 0, hi = 1;
@@ -4219,7 +4221,7 @@ static Value builtin_root(Interpreter* interp, Value* args, int argc, Expr** arg
42194221
if (pw <= x) lo = mid;
42204222
else hi = mid;
42214223
}
4222-
return value_int(lo);
4224+
return value_int_base(lo, out_base);
42234225
} else {
42244226
if (n % 2 == 0) {
42254227
RUNTIME_ERROR(interp, "Even root of negative integer", line, col);
@@ -4239,7 +4241,7 @@ static Value builtin_root(Interpreter* interp, Value* args, int argc, Expr** arg
42394241
if (pw <= ax) lo = mid;
42404242
else hi = mid;
42414243
}
4242-
return value_int(-lo);
4244+
return value_int_base(-lo, out_base);
42434245
}
42444246
}
42454247

@@ -4256,9 +4258,18 @@ static Value builtin_root(Interpreter* interp, Value* args, int argc, Expr** arg
42564258
if (floor(abs_n) != abs_n || ((int64_t)abs_n) % 2 == 0) {
42574259
RUNTIME_ERROR(interp, "ROOT of negative float requires odd integer root", line, col);
42584260
}
4259-
return value_flt(-pow(-x, 1.0 / n));
4261+
double res = -pow(-x, 1.0 / n);
4262+
double rintv = round(res);
4263+
double tol = 1e-12 * (fabs(rintv) + 1.0);
4264+
if (fabs(res - rintv) <= tol) res = rintv;
4265+
return value_flt_base(res, out_base);
42604266
}
4261-
return value_flt(pow(x, 1.0 / n));
4267+
4268+
double res = pow(x, 1.0 / n);
4269+
double rintv = round(res);
4270+
double tol = 1e-12 * (fabs(rintv) + 1.0);
4271+
if (fabs(res - rintv) <= tol) res = rintv;
4272+
return value_flt_base(res, out_base);
42624273
}
42634274

42644275
// IROOT: integer-specific root (coerces/expects integers)

0 commit comments

Comments
 (0)