#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) voidmath_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));}
#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));
}