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; } }
void func_import_basic(int n) { func_init(); // default op for debug only func_scope_set(n,func_op_builtin_new()); func_scope_set(n,func_op_def_new()); func_scope_set(n,func_op_list_new()); func_scope_set(n,func_op_table_new()); func_scope_set(n,func_op_strings_new()); func_scope_set(n,func_op_scope_new()); // basic func_scope_set(n,func_op_nan_new()); func_scope_set(n,func_op_inf_new()); func_scope_set(n,func_op_zero_new()); func_scope_set(n,func_op_one_new()); func_scope_set(n,func_op_bigint_new()); func_scope_set(n,func_op_real_new()); func_scope_set(n,func_op_complex_new()); func_scope_set(n,func_op_var_new()); func_scope_set(n,func_op_add_new()); func_scope_set(n,func_op_mul_new()); func_scope_set(n,func_op_sqrt_new()); func_scope_set(n,func_op_exp_new()); func_scope_set(n,func_op_log_new()); func_scope_set(n,func_op_pow_new()); func_scope_set(n,func_op_sin_new()); func_scope_set(n,func_op_cos_new()); func_scope_set(n,func_op_tan_new()); func_scope_set(n,func_op_asin_new()); func_scope_set(n,func_op_acos_new()); func_scope_set(n,func_op_atan_new()); func_scope_set(n,func_op_sinh_new()); func_scope_set(n,func_op_cosh_new()); func_scope_set(n,func_op_tanh_new()); func_scope_set(n,func_op_asinh_new()); func_scope_set(n,func_op_acosh_new()); func_scope_set(n,func_op_atanh_new()); func_scope_set(n,func_op_ivec_new()); func_scope_set(n,func_op_rvec_new()); func_scope_set(n,func_op_cvec_new()); func_scope_set(n,func_op_rmat_new()); func_scope_set(n,func_op_cmat_new()); func_scope_set(n,func_op_begin_new()); func_scope_set(n,func_op_end_new()); func_scope_set(n,func_op_set_new()); func_scope_set(n,func_op_print_new()); func_scope_set(n,func_op_eval_new()); func_scope_set(n,func_op_evalf_new()); func_scope_set(n,func_op_expand_new()); func_scope_set(n,func_op_diff_new()); func_scope_set(n,func_op_grad_new()); func_scope_set(n,func_op_gbasis_new()); func_scope_set(n,func_def("I", func_complex_i(),0,0)); func_scope_set(n,func_def("i", func_sqrt(func_bigint_int(-1,1)),0,0)); func_scope_set(n,func_def("PI",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("Pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); func_scope_set(n,func_def("pi",func_mul(func_atan(func_one()),func_bigint_int(4,1)),0,0)); }
func_t *func_diff_sqrt_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL; if(!func_is(f,"sqrt") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_sqrt",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); fx=func_mul(func_div(gx,func_sqrt(FR(g))),func_bigint_int(1,2)); f=func_del(f); return fx; }
func_t *func_diff_acosh_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL; if(!func_is(f,"acosh") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_acosh",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); h=func_pow_n(FR(g),2); h=func_add(h,func_bigint_int(-1,1)); h=func_sqrt(h); fx=func_div(gx,h); f=func_del(f); return fx; }
func_t *func_diff_asin_pow1(func_t *f, int var) { func_t *fx=NULL,*g=NULL,*gx=NULL,*h=NULL; if(!func_is(f,"asin") || func_power(f)!=1){ FUNC_ERROR_ARG1("func_diff_asin",f); } g=f->a[0]; gx=func_diff(FR(g),func_var1(var,1)); h=func_pow_n(FR(g),2); h=func_sub(func_one(),h); h=func_sqrt(h); fx=func_div(gx,h); f=func_del(f); return fx; }