#include "sl.h" #include "cvalues.h" #include "slmath.h" BUILTIN("atan", atan) { if(nargs == 1) return mk_f64(atan(todouble(args[0]))); if(nargs != 2) argcount(nargs, 1); return mk_f64(atan2(todouble(args[0]), todouble(args[1]))); } BUILTIN("log", log) { if(nargs == 1) return mk_f64(log(todouble(args[0]))); if(nargs != 2) argcount(nargs, 1); 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(nargs, 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(nargs, 2); \ return mk_f64(cname(todouble(args[0]), todouble(args[1]))); \ } BUILTIN_("expt", pow) void math_init(void) { setc(mk_csym("pi"), mk_f64(3.14159265358979323846)); }