float eval_branch(struct node *node, float x, float y, float z, float a) { switch (node->token) { case token_x: return x; case token_y: return y; case token_z: return z; case token_a: return a; case token_num: return node->value; case token_pow: return func_pow(eval_branch(node->left, x, y, z, a), node->value); case token_mul: return func_mul(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_div: return func_div(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_add: return func_add(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_sub: return func_sub(eval_branch(node->left, x, y, z, a), eval_branch(node->right, x, y, z, a)); case token_neg: return func_neg(0, eval_branch(node->right, x, y, z, a)); case token_sqrt: return func_sqrt(0, eval_branch(node->right, x, y, z, a)); case token_sin: return func_sin(0, eval_branch(node->right, x, y, z, a)); case token_cos: return func_cos(0, eval_branch(node->right, x, y, z, a)); default: return 0; } }
func_t *func_add_eval(func_t *f) { func_t *g; if(!func_is_add(f)){ FUNC_ERROR_ARG1("func_add_eval",f); } f=func_flatten(f,__func_add); func_add_args(f,func_is_complex,func_is_number); func_add_args(f,func_is_real,func_is_number); func_add_args(f,func_in_bigint,func_in_bigint); func_add_args_collect(f,func_in_complex); func_add_args_collect(f,func_is_number); func_a_rm_op(f,func_is_zero); func_args_sort(f); func_args_reverse(f); if (func_asize(f)<=0){ f=func_del(f); return func_zero(); } else if(func_asize(f)==1){ g=func_pow(FR(func_aget(f,0)),func_bigint_int(func_power(f),1)); f=func_del(f); return g; } else { return f; } }