diff --git a/pd/src/x_arithmetic.c b/pd/src/x_arithmetic.c index 70a120c50b0684c663c99e0cbc865d5c1d412d3a..92c2968e4314a99d13d5aac58a1e4313c8057af0 100644 --- a/pd/src/x_arithmetic.c +++ b/pd/src/x_arithmetic.c @@ -156,15 +156,31 @@ static void *binop1_pow_new(t_floatarg f) static void binop1_pow_bang(t_binop *x) { - outlet_float(x->x_obj.ob_outlet, - (x->x_f1 > 0 ? powf(x->x_f1, x->x_f2) : 0)); + if (x->x_f1 >= 0) + outlet_float(x->x_obj.ob_outlet, + powf(x->x_f1, x->x_f2)); + else if (x->x_f2 <= -1 || x->x_f2 >= 1 || x->x_f2 == 0) + outlet_float(x->x_obj.ob_outlet, + powf(x->x_f1, x->x_f2)); + else { + pd_error(x, "pow: calculation resulted in NaN"); + outlet_float(x->x_obj.ob_outlet, 0); + } } static void binop1_pow_float(t_binop *x, t_float f) { x->x_f1 = f; - outlet_float(x->x_obj.ob_outlet, - (x->x_f1 > 0 ? powf(x->x_f1, x->x_f2) : 0)); + if (x->x_f1 >= 0) + outlet_float(x->x_obj.ob_outlet, + powf(x->x_f1, x->x_f2)); + else if (x->x_f2 <= -1 || x->x_f2 >= 1 || x->x_f2 == 0) + outlet_float(x->x_obj.ob_outlet, + powf(x->x_f1, x->x_f2)); + else { + pd_error(x, "pow: calculation resulted in NaN"); + outlet_float(x->x_obj.ob_outlet, 0); + } } /* ------------------------ max -------------------------------- */