26#define PI (l_mathop(3.141592653589793238462643383279502884))
30 if (lua_isinteger(L, 1)) {
31 lua_Integer n = lua_tointeger(L, 1);
32 if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n);
33 lua_pushinteger(L, n);
36 lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));
41 lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));
46 lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
51 lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));
56 lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));
61 lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));
66 lua_Number y = luaL_checknumber(L, 1);
67 lua_Number x = luaL_optnumber(L, 2, 1);
68 lua_pushnumber(L, l_mathop(atan2)(y, x));
75 lua_Integer n = lua_tointegerx(L, 1, &valid);
77 lua_pushinteger(L, n);
86static void pushnumint (
lua_State *L, lua_Number d) {
88 if (lua_numbertointeger(d, &n))
89 lua_pushinteger(L, n);
96 if (lua_isinteger(L, 1))
99 lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1));
107 if (lua_isinteger(L, 1))
110 lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1));
118 if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) {
119 lua_Integer d = lua_tointeger(L, 2);
120 if ((lua_Unsigned)d + 1u <= 1u) {
121 luaL_argcheck(L, d != 0, 2,
"zero");
122 lua_pushinteger(L, 0);
125 lua_pushinteger(L, lua_tointeger(L, 1) % d);
128 lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),
129 luaL_checknumber(L, 2)));
140 if (lua_isinteger(L ,1)) {
142 lua_pushnumber(L, 0);
145 lua_Number n = luaL_checknumber(L, 1);
147 lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n);
150 lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip));
157 lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));
163 lua_Integer a = luaL_checkinteger(L, 1);
164 lua_Integer b = luaL_checkinteger(L, 2);
165 lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b);
170 lua_Number x = luaL_checknumber(L, 1);
172 if (lua_isnoneornil(L, 2))
173 res = l_mathop(log)(x);
175 lua_Number base = luaL_checknumber(L, 2);
176#if !defined(LUA_USE_C89)
177 if (base == l_mathop(2.0))
178 res = l_mathop(log2)(x);
181 if (base == l_mathop(10.0))
182 res = l_mathop(log10)(x);
184 res = l_mathop(log)(x)/l_mathop(log)(base);
186 lua_pushnumber(L, res);
191 lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));
196 lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI));
201 lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0)));
207 int n = lua_gettop(L);
210 luaL_argcheck(L, n >= 1, 1,
"value expected");
211 for (i = 2; i <= n; i++) {
212 if (lua_compare(L, i, imin, LUA_OPLT))
215 lua_pushvalue(L, imin);
221 int n = lua_gettop(L);
224 luaL_argcheck(L, n >= 1, 1,
"value expected");
225 for (i = 2; i <= n; i++) {
226 if (lua_compare(L, imax, i, LUA_OPLT))
229 lua_pushvalue(L, imax);
235 if (lua_type(L, 1) == LUA_TNUMBER)
236 lua_pushstring(L, (lua_isinteger(L, 1)) ?
"integer" :
"float");
253#define FIGS l_floatatt(MANT_DIG)
266#if !defined(LUA_RAND32) && !defined(Rand64)
270#if ((ULONG_MAX >> 31) >> 31) >= 3
273#define Rand64 unsigned long
275#elif !defined(LUA_USE_C89) && defined(LLONG_MAX)
278#define Rand64 unsigned long long
280#elif ((LUA_MAXUNSIGNED >> 31) >> 31) >= 3
283#define Rand64 lua_Unsigned
300#define trim64(x) ((x) & 0xffffffffffffffffu)
305 return (x << n) | (trim64(x) >> (64 - n));
311 Rand64 state2 = state[2] ^ state0;
312 Rand64 state3 = state[3] ^ state1;
313 Rand64 res = rotl(state1 * 5, 7) * 9;
314 state[0] = state0 ^ state3;
315 state[1] = state1 ^ state2;
316 state[2] = state2 ^ (state1 << 17);
317 state[3] = rotl(state3, 45);
332#define shift64_FIG (64 - FIGS)
335#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1)))
337static lua_Number I2d (
Rand64 x) {
338 return (lua_Number)(trim64(x) >> shift64_FIG) * scaleFIG;
342#define I2UInt(x) ((lua_Unsigned)trim64(x))
345#define Int2I(x) ((Rand64)(x))
352typedef unsigned int lu_int32;
354typedef unsigned long lu_int32;
374#define trim32(x) ((x) & 0xffffffffu)
382static Rand64 packI (lu_int32 h, lu_int32 l) {
391 lua_assert(n > 0 && n < 32);
392 return packI((i.h << n) | (trim32(i.l) >> (32 - n)), i.l << n);
403 Rand64 result = packI(i1.h + i2.h, i1.l + i2.l);
404 if (trim32(result.l) < trim32(i1.l))
411 return Iadd(Ishl(i, 2), i);
416 return Iadd(Ishl(i, 3), i);
421 lua_assert(n > 0 && n < 32);
422 return packI((i.h << n) | (trim32(i.l) >> (32 - n)),
423 (trim32(i.h) >> (32 - n)) | (i.l << n));
428 lua_assert(n > 32 && n < 64);
430 return packI((trim32(i.h) >> n) | (i.l << (32 - n)),
431 (i.h << (32 - n)) | (trim32(i.l) >> n));
438 Rand64 res = times9(rotl(times5(state[1]), 7));
439 Rand64 t = Ishl(state[1], 17);
440 Ixor(&state[2], state[0]);
441 Ixor(&state[3], state[1]);
442 Ixor(&state[1], state[2]);
443 Ixor(&state[0], state[3]);
445 state[3] = rotl1(state[3], 45);
455#define UONE ((lu_int32)1)
461#define scaleFIG (l_mathop(0.5) / (UONE << (FIGS - 1)))
467static lua_Number I2d (
Rand64 x) {
468 lua_Number h = (lua_Number)(trim32(x.h) >> (32 - FIGS));
478 (l_mathop(1.0) / (UONE << 30) / l_mathop(8.0) / (UONE << (FIGS - 33)))
484#define shiftLOW (64 - FIGS)
489#define shiftHI ((lua_Number)(UONE << (FIGS - 33)) * l_mathop(2.0))
492static lua_Number I2d (
Rand64 x) {
493 lua_Number h = (lua_Number)trim32(x.h) * shiftHI;
494 lua_Number l = (lua_Number)(trim32(x.l) >> shiftLOW);
495 return (h + l) * scaleFIG;
502static lua_Unsigned I2UInt (
Rand64 x) {
503 return (((lua_Unsigned)trim32(x.h) << 31) << 1) | (lua_Unsigned)trim32(x.l);
507static Rand64 Int2I (lua_Unsigned n) {
508 return packI((lu_int32)((n >> 31) >> 1), (lu_int32)n);
532static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n,
534 if ((n & (n + 1)) == 0)
537 lua_Unsigned lim = n;
544#if (LUA_MAXUNSIGNED >> 31) >= 3
547 lua_assert((lim & (lim + 1)) == 0
550 while ((ran &= lim) > n)
551 ran = I2UInt(nextrand(state->s));
561 Rand64 rv = nextrand(state->s);
562 switch (lua_gettop(L)) {
564 lua_pushnumber(L, I2d(rv));
569 up = luaL_checkinteger(L, 1);
571 lua_pushinteger(L, I2UInt(rv));
577 low = luaL_checkinteger(L, 1);
578 up = luaL_checkinteger(L, 2);
581 default:
return luaL_error(L,
"wrong number of arguments");
584 luaL_argcheck(L, low <= up, 1,
"interval is empty");
586 p = project(I2UInt(rv), (lua_Unsigned)up - (lua_Unsigned)low, state);
587 lua_pushinteger(L, p + (lua_Unsigned)low);
593 lua_Unsigned n1, lua_Unsigned n2) {
595 state[0] = Int2I(n1);
596 state[1] = Int2I(0xff);
597 state[2] = Int2I(n2);
599 for (i = 0; i < 16; i++)
601 lua_pushinteger(L, n1);
602 lua_pushinteger(L, n2);
612 lua_Unsigned seed1 = (lua_Unsigned)time(NULL);
613 lua_Unsigned seed2 = (lua_Unsigned)(
size_t)L;
614 setseed(L, state->s, seed1, seed2);
618static int math_randomseed (
lua_State *L) {
620 if (lua_isnone(L, 1)) {
624 lua_Integer n1 = luaL_checkinteger(L, 1);
625 lua_Integer n2 = luaL_optinteger(L, 2, 0);
626 setseed(L, state->s, n1, n2);
632static const luaL_Reg randfuncs[] = {
633 {
"random", math_random},
634 {
"randomseed", math_randomseed},
646 luaL_setfuncs(L, randfuncs, 1);
657#if defined(LUA_COMPAT_MATHLIB)
660 lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1)));
665 lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1)));
670 lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1)));
675 lua_Number x = luaL_checknumber(L, 1);
676 lua_Number y = luaL_checknumber(L, 2);
677 lua_pushnumber(L, l_mathop(pow)(x, y));
683 lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
684 lua_pushinteger(L, e);
689 lua_Number x = luaL_checknumber(L, 1);
690 int ep = (int)luaL_checkinteger(L, 2);
691 lua_pushnumber(L, l_mathop(ldexp)(x, ep));
696 lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
714 {
"tointeger", math_toint},
715 {
"floor", math_floor},
727#if defined(LUA_COMPAT_MATHLIB)
728 {
"atan2", math_atan},
733 {
"frexp", math_frexp},
734 {
"ldexp", math_ldexp},
735 {
"log10", math_log10},
739 {
"randomseed", NULL},
742 {
"maxinteger", NULL},
743 {
"mininteger", NULL},
751LUAMOD_API
int luaopen_math (
lua_State *L) {
752 luaL_newlib(L, mathlib);
753 lua_pushnumber(L, PI);
754 lua_setfield(L, -2,
"pi");
755 lua_pushnumber(L, (lua_Number)HUGE_VAL);
756 lua_setfield(L, -2,
"huge");
757 lua_pushinteger(L, LUA_MAXINTEGER);
758 lua_setfield(L, -2,
"maxinteger");
759 lua_pushinteger(L, LUA_MININTEGER);
760 lua_setfield(L, -2,
"mininteger");