|
@@ -1,5 +1,5 @@
|
|
|
/*
|
|
|
-** $Id: lmathlib.c,v 1.86 2013/05/26 13:45:24 roberto Exp roberto $
|
|
|
+** $Id: lmathlib.c,v 1.87 2013/06/13 19:32:52 roberto Exp roberto $
|
|
|
** Standard mathematical library
|
|
|
** See Copyright Notice in lua.h
|
|
|
*/
|
|
@@ -22,12 +22,6 @@
|
|
|
#define RADIANS_PER_DEGREE ((lua_Number)(PI/180.0))
|
|
|
|
|
|
|
|
|
-/* types for lua_Number pointers subject to 'l_mathop' changes */
|
|
|
-typedef float l_pnumf;
|
|
|
-typedef double l_pnum;
|
|
|
-typedef long double l_pnuml;
|
|
|
-
|
|
|
-
|
|
|
static int math_abs (lua_State *L) {
|
|
|
lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1)));
|
|
|
return 1;
|
|
@@ -100,14 +94,22 @@ static int math_fmod (lua_State *L) {
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+** next function does not use 'modf', avoiding problems with 'double*'
|
|
|
+** (which is not compatible with 'float*') when lua_Number is not
|
|
|
+** 'double'.
|
|
|
+*/
|
|
|
static int math_modf (lua_State *L) {
|
|
|
- l_mathop(l_pnum) ip;
|
|
|
- lua_Number fp = l_mathop(modf)(luaL_checknumber(L, 1), &ip);
|
|
|
+ lua_Number n = luaL_checknumber(L, 1);
|
|
|
+ /* integer part (rounds toward zero) */
|
|
|
+ lua_Number ip = (n < 0) ? -l_mathop(floor)(-n) : l_mathop(floor)(n);
|
|
|
lua_pushnumber(L, ip);
|
|
|
- lua_pushnumber(L, fp);
|
|
|
+ /* fractionary part (test handles inf/-inf) */
|
|
|
+ lua_pushnumber(L, (n == ip) ? 0.0 : (n - ip));
|
|
|
return 2;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
static int math_sqrt (lua_State *L) {
|
|
|
lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1)));
|
|
|
return 1;
|