xref: /f-stack/app/redis-5.0.5/deps/lua/src/lmathlib.c (revision 572c4311)
1*572c4311Sfengbojiang /*
2*572c4311Sfengbojiang ** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $
3*572c4311Sfengbojiang ** Standard mathematical library
4*572c4311Sfengbojiang ** See Copyright Notice in lua.h
5*572c4311Sfengbojiang */
6*572c4311Sfengbojiang 
7*572c4311Sfengbojiang 
8*572c4311Sfengbojiang #include <stdlib.h>
9*572c4311Sfengbojiang #include <math.h>
10*572c4311Sfengbojiang 
11*572c4311Sfengbojiang #define lmathlib_c
12*572c4311Sfengbojiang #define LUA_LIB
13*572c4311Sfengbojiang 
14*572c4311Sfengbojiang #include "lua.h"
15*572c4311Sfengbojiang 
16*572c4311Sfengbojiang #include "lauxlib.h"
17*572c4311Sfengbojiang #include "lualib.h"
18*572c4311Sfengbojiang 
19*572c4311Sfengbojiang 
20*572c4311Sfengbojiang #undef PI
21*572c4311Sfengbojiang #define PI (3.14159265358979323846)
22*572c4311Sfengbojiang #define RADIANS_PER_DEGREE (PI/180.0)
23*572c4311Sfengbojiang 
24*572c4311Sfengbojiang 
25*572c4311Sfengbojiang 
math_abs(lua_State * L)26*572c4311Sfengbojiang static int math_abs (lua_State *L) {
27*572c4311Sfengbojiang   lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));
28*572c4311Sfengbojiang   return 1;
29*572c4311Sfengbojiang }
30*572c4311Sfengbojiang 
math_sin(lua_State * L)31*572c4311Sfengbojiang static int math_sin (lua_State *L) {
32*572c4311Sfengbojiang   lua_pushnumber(L, sin(luaL_checknumber(L, 1)));
33*572c4311Sfengbojiang   return 1;
34*572c4311Sfengbojiang }
35*572c4311Sfengbojiang 
math_sinh(lua_State * L)36*572c4311Sfengbojiang static int math_sinh (lua_State *L) {
37*572c4311Sfengbojiang   lua_pushnumber(L, sinh(luaL_checknumber(L, 1)));
38*572c4311Sfengbojiang   return 1;
39*572c4311Sfengbojiang }
40*572c4311Sfengbojiang 
math_cos(lua_State * L)41*572c4311Sfengbojiang static int math_cos (lua_State *L) {
42*572c4311Sfengbojiang   lua_pushnumber(L, cos(luaL_checknumber(L, 1)));
43*572c4311Sfengbojiang   return 1;
44*572c4311Sfengbojiang }
45*572c4311Sfengbojiang 
math_cosh(lua_State * L)46*572c4311Sfengbojiang static int math_cosh (lua_State *L) {
47*572c4311Sfengbojiang   lua_pushnumber(L, cosh(luaL_checknumber(L, 1)));
48*572c4311Sfengbojiang   return 1;
49*572c4311Sfengbojiang }
50*572c4311Sfengbojiang 
math_tan(lua_State * L)51*572c4311Sfengbojiang static int math_tan (lua_State *L) {
52*572c4311Sfengbojiang   lua_pushnumber(L, tan(luaL_checknumber(L, 1)));
53*572c4311Sfengbojiang   return 1;
54*572c4311Sfengbojiang }
55*572c4311Sfengbojiang 
math_tanh(lua_State * L)56*572c4311Sfengbojiang static int math_tanh (lua_State *L) {
57*572c4311Sfengbojiang   lua_pushnumber(L, tanh(luaL_checknumber(L, 1)));
58*572c4311Sfengbojiang   return 1;
59*572c4311Sfengbojiang }
60*572c4311Sfengbojiang 
math_asin(lua_State * L)61*572c4311Sfengbojiang static int math_asin (lua_State *L) {
62*572c4311Sfengbojiang   lua_pushnumber(L, asin(luaL_checknumber(L, 1)));
63*572c4311Sfengbojiang   return 1;
64*572c4311Sfengbojiang }
65*572c4311Sfengbojiang 
math_acos(lua_State * L)66*572c4311Sfengbojiang static int math_acos (lua_State *L) {
67*572c4311Sfengbojiang   lua_pushnumber(L, acos(luaL_checknumber(L, 1)));
68*572c4311Sfengbojiang   return 1;
69*572c4311Sfengbojiang }
70*572c4311Sfengbojiang 
math_atan(lua_State * L)71*572c4311Sfengbojiang static int math_atan (lua_State *L) {
72*572c4311Sfengbojiang   lua_pushnumber(L, atan(luaL_checknumber(L, 1)));
73*572c4311Sfengbojiang   return 1;
74*572c4311Sfengbojiang }
75*572c4311Sfengbojiang 
math_atan2(lua_State * L)76*572c4311Sfengbojiang static int math_atan2 (lua_State *L) {
77*572c4311Sfengbojiang   lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
78*572c4311Sfengbojiang   return 1;
79*572c4311Sfengbojiang }
80*572c4311Sfengbojiang 
math_ceil(lua_State * L)81*572c4311Sfengbojiang static int math_ceil (lua_State *L) {
82*572c4311Sfengbojiang   lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));
83*572c4311Sfengbojiang   return 1;
84*572c4311Sfengbojiang }
85*572c4311Sfengbojiang 
math_floor(lua_State * L)86*572c4311Sfengbojiang static int math_floor (lua_State *L) {
87*572c4311Sfengbojiang   lua_pushnumber(L, floor(luaL_checknumber(L, 1)));
88*572c4311Sfengbojiang   return 1;
89*572c4311Sfengbojiang }
90*572c4311Sfengbojiang 
math_fmod(lua_State * L)91*572c4311Sfengbojiang static int math_fmod (lua_State *L) {
92*572c4311Sfengbojiang   lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
93*572c4311Sfengbojiang   return 1;
94*572c4311Sfengbojiang }
95*572c4311Sfengbojiang 
math_modf(lua_State * L)96*572c4311Sfengbojiang static int math_modf (lua_State *L) {
97*572c4311Sfengbojiang   double ip;
98*572c4311Sfengbojiang   double fp = modf(luaL_checknumber(L, 1), &ip);
99*572c4311Sfengbojiang   lua_pushnumber(L, ip);
100*572c4311Sfengbojiang   lua_pushnumber(L, fp);
101*572c4311Sfengbojiang   return 2;
102*572c4311Sfengbojiang }
103*572c4311Sfengbojiang 
math_sqrt(lua_State * L)104*572c4311Sfengbojiang static int math_sqrt (lua_State *L) {
105*572c4311Sfengbojiang   lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));
106*572c4311Sfengbojiang   return 1;
107*572c4311Sfengbojiang }
108*572c4311Sfengbojiang 
math_pow(lua_State * L)109*572c4311Sfengbojiang static int math_pow (lua_State *L) {
110*572c4311Sfengbojiang   lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
111*572c4311Sfengbojiang   return 1;
112*572c4311Sfengbojiang }
113*572c4311Sfengbojiang 
math_log(lua_State * L)114*572c4311Sfengbojiang static int math_log (lua_State *L) {
115*572c4311Sfengbojiang   lua_pushnumber(L, log(luaL_checknumber(L, 1)));
116*572c4311Sfengbojiang   return 1;
117*572c4311Sfengbojiang }
118*572c4311Sfengbojiang 
math_log10(lua_State * L)119*572c4311Sfengbojiang static int math_log10 (lua_State *L) {
120*572c4311Sfengbojiang   lua_pushnumber(L, log10(luaL_checknumber(L, 1)));
121*572c4311Sfengbojiang   return 1;
122*572c4311Sfengbojiang }
123*572c4311Sfengbojiang 
math_exp(lua_State * L)124*572c4311Sfengbojiang static int math_exp (lua_State *L) {
125*572c4311Sfengbojiang   lua_pushnumber(L, exp(luaL_checknumber(L, 1)));
126*572c4311Sfengbojiang   return 1;
127*572c4311Sfengbojiang }
128*572c4311Sfengbojiang 
math_deg(lua_State * L)129*572c4311Sfengbojiang static int math_deg (lua_State *L) {
130*572c4311Sfengbojiang   lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE);
131*572c4311Sfengbojiang   return 1;
132*572c4311Sfengbojiang }
133*572c4311Sfengbojiang 
math_rad(lua_State * L)134*572c4311Sfengbojiang static int math_rad (lua_State *L) {
135*572c4311Sfengbojiang   lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE);
136*572c4311Sfengbojiang   return 1;
137*572c4311Sfengbojiang }
138*572c4311Sfengbojiang 
math_frexp(lua_State * L)139*572c4311Sfengbojiang static int math_frexp (lua_State *L) {
140*572c4311Sfengbojiang   int e;
141*572c4311Sfengbojiang   lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));
142*572c4311Sfengbojiang   lua_pushinteger(L, e);
143*572c4311Sfengbojiang   return 2;
144*572c4311Sfengbojiang }
145*572c4311Sfengbojiang 
math_ldexp(lua_State * L)146*572c4311Sfengbojiang static int math_ldexp (lua_State *L) {
147*572c4311Sfengbojiang   lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));
148*572c4311Sfengbojiang   return 1;
149*572c4311Sfengbojiang }
150*572c4311Sfengbojiang 
151*572c4311Sfengbojiang 
152*572c4311Sfengbojiang 
math_min(lua_State * L)153*572c4311Sfengbojiang static int math_min (lua_State *L) {
154*572c4311Sfengbojiang   int n = lua_gettop(L);  /* number of arguments */
155*572c4311Sfengbojiang   lua_Number dmin = luaL_checknumber(L, 1);
156*572c4311Sfengbojiang   int i;
157*572c4311Sfengbojiang   for (i=2; i<=n; i++) {
158*572c4311Sfengbojiang     lua_Number d = luaL_checknumber(L, i);
159*572c4311Sfengbojiang     if (d < dmin)
160*572c4311Sfengbojiang       dmin = d;
161*572c4311Sfengbojiang   }
162*572c4311Sfengbojiang   lua_pushnumber(L, dmin);
163*572c4311Sfengbojiang   return 1;
164*572c4311Sfengbojiang }
165*572c4311Sfengbojiang 
166*572c4311Sfengbojiang 
math_max(lua_State * L)167*572c4311Sfengbojiang static int math_max (lua_State *L) {
168*572c4311Sfengbojiang   int n = lua_gettop(L);  /* number of arguments */
169*572c4311Sfengbojiang   lua_Number dmax = luaL_checknumber(L, 1);
170*572c4311Sfengbojiang   int i;
171*572c4311Sfengbojiang   for (i=2; i<=n; i++) {
172*572c4311Sfengbojiang     lua_Number d = luaL_checknumber(L, i);
173*572c4311Sfengbojiang     if (d > dmax)
174*572c4311Sfengbojiang       dmax = d;
175*572c4311Sfengbojiang   }
176*572c4311Sfengbojiang   lua_pushnumber(L, dmax);
177*572c4311Sfengbojiang   return 1;
178*572c4311Sfengbojiang }
179*572c4311Sfengbojiang 
180*572c4311Sfengbojiang 
math_random(lua_State * L)181*572c4311Sfengbojiang static int math_random (lua_State *L) {
182*572c4311Sfengbojiang   /* the `%' avoids the (rare) case of r==1, and is needed also because on
183*572c4311Sfengbojiang      some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */
184*572c4311Sfengbojiang   lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;
185*572c4311Sfengbojiang   switch (lua_gettop(L)) {  /* check number of arguments */
186*572c4311Sfengbojiang     case 0: {  /* no arguments */
187*572c4311Sfengbojiang       lua_pushnumber(L, r);  /* Number between 0 and 1 */
188*572c4311Sfengbojiang       break;
189*572c4311Sfengbojiang     }
190*572c4311Sfengbojiang     case 1: {  /* only upper limit */
191*572c4311Sfengbojiang       int u = luaL_checkint(L, 1);
192*572c4311Sfengbojiang       luaL_argcheck(L, 1<=u, 1, "interval is empty");
193*572c4311Sfengbojiang       lua_pushnumber(L, floor(r*u)+1);  /* int between 1 and `u' */
194*572c4311Sfengbojiang       break;
195*572c4311Sfengbojiang     }
196*572c4311Sfengbojiang     case 2: {  /* lower and upper limits */
197*572c4311Sfengbojiang       int l = luaL_checkint(L, 1);
198*572c4311Sfengbojiang       int u = luaL_checkint(L, 2);
199*572c4311Sfengbojiang       luaL_argcheck(L, l<=u, 2, "interval is empty");
200*572c4311Sfengbojiang       lua_pushnumber(L, floor(r*(u-l+1))+l);  /* int between `l' and `u' */
201*572c4311Sfengbojiang       break;
202*572c4311Sfengbojiang     }
203*572c4311Sfengbojiang     default: return luaL_error(L, "wrong number of arguments");
204*572c4311Sfengbojiang   }
205*572c4311Sfengbojiang   return 1;
206*572c4311Sfengbojiang }
207*572c4311Sfengbojiang 
208*572c4311Sfengbojiang 
math_randomseed(lua_State * L)209*572c4311Sfengbojiang static int math_randomseed (lua_State *L) {
210*572c4311Sfengbojiang   srand(luaL_checkint(L, 1));
211*572c4311Sfengbojiang   return 0;
212*572c4311Sfengbojiang }
213*572c4311Sfengbojiang 
214*572c4311Sfengbojiang 
215*572c4311Sfengbojiang static const luaL_Reg mathlib[] = {
216*572c4311Sfengbojiang   {"abs",   math_abs},
217*572c4311Sfengbojiang   {"acos",  math_acos},
218*572c4311Sfengbojiang   {"asin",  math_asin},
219*572c4311Sfengbojiang   {"atan2", math_atan2},
220*572c4311Sfengbojiang   {"atan",  math_atan},
221*572c4311Sfengbojiang   {"ceil",  math_ceil},
222*572c4311Sfengbojiang   {"cosh",   math_cosh},
223*572c4311Sfengbojiang   {"cos",   math_cos},
224*572c4311Sfengbojiang   {"deg",   math_deg},
225*572c4311Sfengbojiang   {"exp",   math_exp},
226*572c4311Sfengbojiang   {"floor", math_floor},
227*572c4311Sfengbojiang   {"fmod",   math_fmod},
228*572c4311Sfengbojiang   {"frexp", math_frexp},
229*572c4311Sfengbojiang   {"ldexp", math_ldexp},
230*572c4311Sfengbojiang   {"log10", math_log10},
231*572c4311Sfengbojiang   {"log",   math_log},
232*572c4311Sfengbojiang   {"max",   math_max},
233*572c4311Sfengbojiang   {"min",   math_min},
234*572c4311Sfengbojiang   {"modf",   math_modf},
235*572c4311Sfengbojiang   {"pow",   math_pow},
236*572c4311Sfengbojiang   {"rad",   math_rad},
237*572c4311Sfengbojiang   {"random",     math_random},
238*572c4311Sfengbojiang   {"randomseed", math_randomseed},
239*572c4311Sfengbojiang   {"sinh",   math_sinh},
240*572c4311Sfengbojiang   {"sin",   math_sin},
241*572c4311Sfengbojiang   {"sqrt",  math_sqrt},
242*572c4311Sfengbojiang   {"tanh",   math_tanh},
243*572c4311Sfengbojiang   {"tan",   math_tan},
244*572c4311Sfengbojiang   {NULL, NULL}
245*572c4311Sfengbojiang };
246*572c4311Sfengbojiang 
247*572c4311Sfengbojiang 
248*572c4311Sfengbojiang /*
249*572c4311Sfengbojiang ** Open math library
250*572c4311Sfengbojiang */
luaopen_math(lua_State * L)251*572c4311Sfengbojiang LUALIB_API int luaopen_math (lua_State *L) {
252*572c4311Sfengbojiang   luaL_register(L, LUA_MATHLIBNAME, mathlib);
253*572c4311Sfengbojiang   lua_pushnumber(L, PI);
254*572c4311Sfengbojiang   lua_setfield(L, -2, "pi");
255*572c4311Sfengbojiang   lua_pushnumber(L, HUGE_VAL);
256*572c4311Sfengbojiang   lua_setfield(L, -2, "huge");
257*572c4311Sfengbojiang #if defined(LUA_COMPAT_MOD)
258*572c4311Sfengbojiang   lua_getfield(L, -1, "fmod");
259*572c4311Sfengbojiang   lua_setfield(L, -2, "mod");
260*572c4311Sfengbojiang #endif
261*572c4311Sfengbojiang   return 1;
262*572c4311Sfengbojiang }
263*572c4311Sfengbojiang 
264