#include #include #include #include "aa.h" #include "aa_math.h" #define CFUNC1(func) \ static aaObject * \ cf_##func(aaContext *ctx, aaObject *arg) \ { \ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ return aa_number(ctx, aNumber(func(x.r), 0.0)); \ } #define CFUNC2(func) \ static aaObject * \ cf_##func(aaContext *ctx, aaObject *arg) \ { \ aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ aaNumber y = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); \ return aa_number(ctx, aNumber(func(x.r, y.r), 0.0)); \ } #define FUNCS \ CFUNC1(sin); \ CFUNC1(cos); \ CFUNC1(tan); \ CFUNC1(asin); \ CFUNC1(acos); \ CFUNC1(exp); \ CFUNC1(log); \ CFUNC1(sqrt); \ CFUNC1(floor); \ CFUNC1(log10); \ CFUNC1(sinh); \ CFUNC1(cosh); \ CFUNC1(tanh); \ FUNCS CFUNC1(fabs); CFUNC1(ceil); CFUNC2(pow); static aaObject * cf_atan2(aaContext *ctx, aaObject *arg) { aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); aaObject *yo = aa_nextarg(ctx, &arg, 1); aaNumber y = yo != nil ? aa_tonumber(ctx, yo) : aNumber(1.0, 0.0); return aa_number(ctx, aNumber(atan2(x.r, y.r), 0.0)); } static aaObject * cf_truncate(aaContext *ctx, aaObject *arg) { aaNumber x = aa_tonumber(ctx, aa_nextarg(ctx, &arg, 0)); modf(x.r, &x.r); return aa_number(ctx, x); } #undef CFUNC1 #undef CFUNC2 #define CFUNC(func, name) aa_set(ctx, aa_symbol(ctx, name), aa_cfunc(ctx, cf_##func)) #define CFUNC1(x) CFUNC(x, #x) #define CFUNC2(x) CFUNC(x, #x) void aa_include_math(aaContext *ctx) { FUNCS; CFUNC(fabs, "abs"); CFUNC(ceil, "ceiling"); CFUNC(pow, "expt"); CFUNC(atan2, "atan"); CFUNC(truncate, "truncate"); }