diff src/lua/src/lmathlib.c @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/lua/src/lmathlib.c	Sat Mar 03 10:31:27 2012 -0600
     1.3 @@ -0,0 +1,263 @@
     1.4 +/*
     1.5 +** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $
     1.6 +** Standard mathematical library
     1.7 +** See Copyright Notice in lua.h
     1.8 +*/
     1.9 +
    1.10 +
    1.11 +#include <stdlib.h>
    1.12 +#include <math.h>
    1.13 +
    1.14 +#define lmathlib_c
    1.15 +#define LUA_LIB
    1.16 +
    1.17 +#include "lua.h"
    1.18 +
    1.19 +#include "lauxlib.h"
    1.20 +#include "lualib.h"
    1.21 +
    1.22 +
    1.23 +#undef PI
    1.24 +#define PI (3.14159265358979323846)
    1.25 +#define RADIANS_PER_DEGREE (PI/180.0)
    1.26 +
    1.27 +
    1.28 +
    1.29 +static int math_abs (lua_State *L) {
    1.30 +  lua_pushnumber(L, fabs(luaL_checknumber(L, 1)));
    1.31 +  return 1;
    1.32 +}
    1.33 +
    1.34 +static int math_sin (lua_State *L) {
    1.35 +  lua_pushnumber(L, sin(luaL_checknumber(L, 1)));
    1.36 +  return 1;
    1.37 +}
    1.38 +
    1.39 +static int math_sinh (lua_State *L) {
    1.40 +  lua_pushnumber(L, sinh(luaL_checknumber(L, 1)));
    1.41 +  return 1;
    1.42 +}
    1.43 +
    1.44 +static int math_cos (lua_State *L) {
    1.45 +  lua_pushnumber(L, cos(luaL_checknumber(L, 1)));
    1.46 +  return 1;
    1.47 +}
    1.48 +
    1.49 +static int math_cosh (lua_State *L) {
    1.50 +  lua_pushnumber(L, cosh(luaL_checknumber(L, 1)));
    1.51 +  return 1;
    1.52 +}
    1.53 +
    1.54 +static int math_tan (lua_State *L) {
    1.55 +  lua_pushnumber(L, tan(luaL_checknumber(L, 1)));
    1.56 +  return 1;
    1.57 +}
    1.58 +
    1.59 +static int math_tanh (lua_State *L) {
    1.60 +  lua_pushnumber(L, tanh(luaL_checknumber(L, 1)));
    1.61 +  return 1;
    1.62 +}
    1.63 +
    1.64 +static int math_asin (lua_State *L) {
    1.65 +  lua_pushnumber(L, asin(luaL_checknumber(L, 1)));
    1.66 +  return 1;
    1.67 +}
    1.68 +
    1.69 +static int math_acos (lua_State *L) {
    1.70 +  lua_pushnumber(L, acos(luaL_checknumber(L, 1)));
    1.71 +  return 1;
    1.72 +}
    1.73 +
    1.74 +static int math_atan (lua_State *L) {
    1.75 +  lua_pushnumber(L, atan(luaL_checknumber(L, 1)));
    1.76 +  return 1;
    1.77 +}
    1.78 +
    1.79 +static int math_atan2 (lua_State *L) {
    1.80 +  lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
    1.81 +  return 1;
    1.82 +}
    1.83 +
    1.84 +static int math_ceil (lua_State *L) {
    1.85 +  lua_pushnumber(L, ceil(luaL_checknumber(L, 1)));
    1.86 +  return 1;
    1.87 +}
    1.88 +
    1.89 +static int math_floor (lua_State *L) {
    1.90 +  lua_pushnumber(L, floor(luaL_checknumber(L, 1)));
    1.91 +  return 1;
    1.92 +}
    1.93 +
    1.94 +static int math_fmod (lua_State *L) {
    1.95 +  lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
    1.96 +  return 1;
    1.97 +}
    1.98 +
    1.99 +static int math_modf (lua_State *L) {
   1.100 +  double ip;
   1.101 +  double fp = modf(luaL_checknumber(L, 1), &ip);
   1.102 +  lua_pushnumber(L, ip);
   1.103 +  lua_pushnumber(L, fp);
   1.104 +  return 2;
   1.105 +}
   1.106 +
   1.107 +static int math_sqrt (lua_State *L) {
   1.108 +  lua_pushnumber(L, sqrt(luaL_checknumber(L, 1)));
   1.109 +  return 1;
   1.110 +}
   1.111 +
   1.112 +static int math_pow (lua_State *L) {
   1.113 +  lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2)));
   1.114 +  return 1;
   1.115 +}
   1.116 +
   1.117 +static int math_log (lua_State *L) {
   1.118 +  lua_pushnumber(L, log(luaL_checknumber(L, 1)));
   1.119 +  return 1;
   1.120 +}
   1.121 +
   1.122 +static int math_log10 (lua_State *L) {
   1.123 +  lua_pushnumber(L, log10(luaL_checknumber(L, 1)));
   1.124 +  return 1;
   1.125 +}
   1.126 +
   1.127 +static int math_exp (lua_State *L) {
   1.128 +  lua_pushnumber(L, exp(luaL_checknumber(L, 1)));
   1.129 +  return 1;
   1.130 +}
   1.131 +
   1.132 +static int math_deg (lua_State *L) {
   1.133 +  lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE);
   1.134 +  return 1;
   1.135 +}
   1.136 +
   1.137 +static int math_rad (lua_State *L) {
   1.138 +  lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE);
   1.139 +  return 1;
   1.140 +}
   1.141 +
   1.142 +static int math_frexp (lua_State *L) {
   1.143 +  int e;
   1.144 +  lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e));
   1.145 +  lua_pushinteger(L, e);
   1.146 +  return 2;
   1.147 +}
   1.148 +
   1.149 +static int math_ldexp (lua_State *L) {
   1.150 +  lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2)));
   1.151 +  return 1;
   1.152 +}
   1.153 +
   1.154 +
   1.155 +
   1.156 +static int math_min (lua_State *L) {
   1.157 +  int n = lua_gettop(L);  /* number of arguments */
   1.158 +  lua_Number dmin = luaL_checknumber(L, 1);
   1.159 +  int i;
   1.160 +  for (i=2; i<=n; i++) {
   1.161 +    lua_Number d = luaL_checknumber(L, i);
   1.162 +    if (d < dmin)
   1.163 +      dmin = d;
   1.164 +  }
   1.165 +  lua_pushnumber(L, dmin);
   1.166 +  return 1;
   1.167 +}
   1.168 +
   1.169 +
   1.170 +static int math_max (lua_State *L) {
   1.171 +  int n = lua_gettop(L);  /* number of arguments */
   1.172 +  lua_Number dmax = luaL_checknumber(L, 1);
   1.173 +  int i;
   1.174 +  for (i=2; i<=n; i++) {
   1.175 +    lua_Number d = luaL_checknumber(L, i);
   1.176 +    if (d > dmax)
   1.177 +      dmax = d;
   1.178 +  }
   1.179 +  lua_pushnumber(L, dmax);
   1.180 +  return 1;
   1.181 +}
   1.182 +
   1.183 +
   1.184 +static int math_random (lua_State *L) {
   1.185 +  /* the `%' avoids the (rare) case of r==1, and is needed also because on
   1.186 +     some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */
   1.187 +  lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX;
   1.188 +  switch (lua_gettop(L)) {  /* check number of arguments */
   1.189 +    case 0: {  /* no arguments */
   1.190 +      lua_pushnumber(L, r);  /* Number between 0 and 1 */
   1.191 +      break;
   1.192 +    }
   1.193 +    case 1: {  /* only upper limit */
   1.194 +      int u = luaL_checkint(L, 1);
   1.195 +      luaL_argcheck(L, 1<=u, 1, "interval is empty");
   1.196 +      lua_pushnumber(L, floor(r*u)+1);  /* int between 1 and `u' */
   1.197 +      break;
   1.198 +    }
   1.199 +    case 2: {  /* lower and upper limits */
   1.200 +      int l = luaL_checkint(L, 1);
   1.201 +      int u = luaL_checkint(L, 2);
   1.202 +      luaL_argcheck(L, l<=u, 2, "interval is empty");
   1.203 +      lua_pushnumber(L, floor(r*(u-l+1))+l);  /* int between `l' and `u' */
   1.204 +      break;
   1.205 +    }
   1.206 +    default: return luaL_error(L, "wrong number of arguments");
   1.207 +  }
   1.208 +  return 1;
   1.209 +}
   1.210 +
   1.211 +
   1.212 +static int math_randomseed (lua_State *L) {
   1.213 +  srand(luaL_checkint(L, 1));
   1.214 +  return 0;
   1.215 +}
   1.216 +
   1.217 +
   1.218 +static const luaL_Reg mathlib[] = {
   1.219 +  {"abs",   math_abs},
   1.220 +  {"acos",  math_acos},
   1.221 +  {"asin",  math_asin},
   1.222 +  {"atan2", math_atan2},
   1.223 +  {"atan",  math_atan},
   1.224 +  {"ceil",  math_ceil},
   1.225 +  {"cosh",   math_cosh},
   1.226 +  {"cos",   math_cos},
   1.227 +  {"deg",   math_deg},
   1.228 +  {"exp",   math_exp},
   1.229 +  {"floor", math_floor},
   1.230 +  {"fmod",   math_fmod},
   1.231 +  {"frexp", math_frexp},
   1.232 +  {"ldexp", math_ldexp},
   1.233 +  {"log10", math_log10},
   1.234 +  {"log",   math_log},
   1.235 +  {"max",   math_max},
   1.236 +  {"min",   math_min},
   1.237 +  {"modf",   math_modf},
   1.238 +  {"pow",   math_pow},
   1.239 +  {"rad",   math_rad},
   1.240 +  {"random",     math_random},
   1.241 +  {"randomseed", math_randomseed},
   1.242 +  {"sinh",   math_sinh},
   1.243 +  {"sin",   math_sin},
   1.244 +  {"sqrt",  math_sqrt},
   1.245 +  {"tanh",   math_tanh},
   1.246 +  {"tan",   math_tan},
   1.247 +  {NULL, NULL}
   1.248 +};
   1.249 +
   1.250 +
   1.251 +/*
   1.252 +** Open math library
   1.253 +*/
   1.254 +LUALIB_API int luaopen_math (lua_State *L) {
   1.255 +  luaL_register(L, LUA_MATHLIBNAME, mathlib);
   1.256 +  lua_pushnumber(L, PI);
   1.257 +  lua_setfield(L, -2, "pi");
   1.258 +  lua_pushnumber(L, HUGE_VAL);
   1.259 +  lua_setfield(L, -2, "huge");
   1.260 +#if defined(LUA_COMPAT_MOD)
   1.261 +  lua_getfield(L, -1, "fmod");
   1.262 +  lua_setfield(L, -2, "mod");
   1.263 +#endif
   1.264 +  return 1;
   1.265 +}
   1.266 +