ref: 643c3041254022f8d5af684c9e6deaf9cbeed759
parent: bc646bd7a1861f9c2f585dd8b62324c001c23443
author: Jeff Bezanson <jeff.bezanson@gmail.com>
date: Sat Aug 19 10:54:32 EDT 2017
add math library functions sqrt, exp, log, sin, cos, tan, asin, acos, atan
--- a/builtins.c
+++ b/builtins.c
@@ -13,6 +13,7 @@
#include <sys/time.h>
#include <sys/stat.h>
#include <errno.h>
+#include <math.h>
#include "llt.h"
#include "flisp.h"
#include "random.h"
@@ -433,6 +434,29 @@
return mk_float(rand_float());
}
+#define MATH_FUNC_1ARG(name) \
+static value_t fl_##name(value_t *args, u_int32_t nargs) \
+{ \+ argcount(#name, nargs, 1); \
+ if (iscprim(args[0])) { \+ cprim_t *cp = (cprim_t*)ptr(args[0]); \
+ numerictype_t nt = cp_numtype(cp); \
+ if (nt == T_FLOAT) \
+ return mk_float(name##f(*(float*)cp_data(cp))); \
+ } \
+ return mk_double(name(todouble(args[0], #name))); \
+}
+
+MATH_FUNC_1ARG(sqrt)
+MATH_FUNC_1ARG(exp)
+MATH_FUNC_1ARG(log)
+MATH_FUNC_1ARG(sin)
+MATH_FUNC_1ARG(cos)
+MATH_FUNC_1ARG(tan)
+MATH_FUNC_1ARG(asin)
+MATH_FUNC_1ARG(acos)
+MATH_FUNC_1ARG(atan)
+
extern void stringfuncs_init(void);
extern void table_init(void);
extern void iostream_init(void);
@@ -468,6 +492,16 @@
{ "rand.uint64", fl_rand64 }, { "rand.double", fl_randd }, { "rand.float", fl_randf },+
+ { "sqrt", fl_sqrt },+ { "exp", fl_exp },+ { "log", fl_log },+ { "sin", fl_sin },+ { "cos", fl_cos },+ { "tan", fl_tan },+ { "asin", fl_asin },+ { "acos", fl_acos },+ { "atan", fl_atan }, { "path.cwd", fl_path_cwd }, { "path.exists?", fl_path_exists },--
⑨