blob: b6a7ff3a80b82172bb421395688431f923a97fef [file] [log] [blame] [edit]
//
// See JS_MATH setting in settings.js for details.
//
#include <emscripten.h>
#include <math.h>
#include <stdlib.h>
#define CALL_JS_1(cname, jsname, type, casttype) \
EM_JS(type, JS_##cname, (type x), { return jsname(x) }); \
type cname(type x) { return JS_##cname((casttype)x); }
#define CALL_JS_1_TRIPLE(cname, jsname) \
CALL_JS_1(cname, jsname, double, double) \
CALL_JS_1(cname##f, jsname, float, float)
CALL_JS_1_TRIPLE(cos, Math.cos)
CALL_JS_1_TRIPLE(sin, Math.sin)
CALL_JS_1_TRIPLE(tan, Math.tan)
CALL_JS_1_TRIPLE(acos, Math.acos)
CALL_JS_1_TRIPLE(asin, Math.asin)
CALL_JS_1_TRIPLE(atan, Math.atan)
CALL_JS_1_TRIPLE(exp, Math.exp)
CALL_JS_1_TRIPLE(log, Math.log)
CALL_JS_1_TRIPLE(sqrt, Math.sqrt)
CALL_JS_1_TRIPLE(fabs, Math.abs)
CALL_JS_1_TRIPLE(ceil, Math.ceil)
CALL_JS_1_TRIPLE(floor, Math.floor)
#define CALL_JS_2(cname, jsname, type, casttype) \
EM_JS(type, JS_##cname, (type x, type y), { return jsname(x, y) }); \
type cname(type x, type y) { return JS_##cname((casttype)x, (casttype)y); }
#define CALL_JS_2_TRIPLE(cname, jsname) \
CALL_JS_2(cname, jsname, double, double) \
CALL_JS_2(cname##f, jsname, float, float)
CALL_JS_2_TRIPLE(atan2, Math.atan2)
CALL_JS_2_TRIPLE(pow, Math.pow)
#define CALL_JS_1_IMPL(cname, type, casttype, impl) \
EM_JS(type, JS_##cname, (type x), impl); \
type cname(type x) { return JS_##cname((casttype)x); }
#define CALL_JS_1_IMPL_TRIPLE(cname, impl) \
CALL_JS_1_IMPL(cname, double, double, impl) \
CALL_JS_1_IMPL(cname##f, float, float, impl)
CALL_JS_1_IMPL_TRIPLE(round, {
return x >= 0 ? Math.floor(x + 0.5) : Math.ceil(x - 0.5);
})
CALL_JS_1_IMPL_TRIPLE(rint, {
function round(x) {
return x >= 0 ? Math.floor(x + 0.5) : Math.ceil(x - 0.5);
}
return (x - Math.floor(x) != .5) ? round(x) : round(x / 2) * 2;
})
double nearbyint(double x) { return rint(x); }
float nearbyintf(float x) { return rintf(x); }