@@ -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