#include "inc/priv.h" #include "inc/cvalues.h" BUILTIN("atan", atan) { argcount_least(1); argcount_most(2); if(nargs == 1) return mk_f64(atan(todouble(args[0]))); return mk_f64(atan2(todouble(args[0]), todouble(args[1]))); } BUILTIN("log", log) { argcount_least(1); argcount_most(2); if(nargs == 1) return mk_f64(log(todouble(args[0]))); double x = todouble(args[0]); if(isfixnum(args[1])){ sl_fx b = numval(args[1]); if(b == 10) return mk_f64(log10(x)); #if !defined(__plan9__) if(b == 2) return mk_f64(log2(x)); #endif } return mk_f64(log(x) / log(todouble(args[1]))); } #define BUILTIN_(lname, cname) \ BUILTIN(lname, cname) \ { \ argcount(1); \ return mk_f64(cname(todouble(args[0]))); \ } BUILTIN_("sqrt", sqrt) BUILTIN_("exp", exp) BUILTIN_("sin", sin) BUILTIN_("cos", cos) BUILTIN_("tan", tan) BUILTIN_("asin", asin) BUILTIN_("acos", acos) BUILTIN_("floor", floor) BUILTIN_("ceiling", ceil) BUILTIN_("sinh", sinh) BUILTIN_("cosh", cosh) BUILTIN_("tanh", tanh) #undef BUILTIN_ #define BUILTIN_(lname, cname) \ BUILTIN(lname, cname) \ { \ argcount(2); \ return mk_f64(cname(todouble(args[0]), todouble(args[1]))); \ } BUILTIN_("expt", pow) void math_init(void) { setc(mk_csym("+f32-epsilon+"), mk_f32(FLT_EPSILON)); setc(mk_csym("+f64-epsilon+"), mk_f64(DBL_EPSILON)); setc(mk_csym("+pi+"), mk_f64(3.14159265358979323846)); }