summaryrefslogtreecommitdiff
path: root/lmathlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-06-02 20:09:28 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-06-02 20:09:28 -0300
commit355037528c8c0896c5e643bb724f8d686c6322ad (patch)
tree647e20b546c203464a8c112bd4d8d1b018392f0b /lmathlib.c
parent9e68c047ae809608f53245e0e0f0b76f30b27c0f (diff)
downloadlua-github-355037528c8c0896c5e643bb724f8d686c6322ad.tar.gz
'math.mof' works with integers, too
Diffstat (limited to 'lmathlib.c')
-rw-r--r--lmathlib.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/lmathlib.c b/lmathlib.c
index 3df4b799..6ba1b3f5 100644
--- a/lmathlib.c
+++ b/lmathlib.c
@@ -1,5 +1,5 @@
/*
-** $Id: lmathlib.c,v 1.100 2014/05/14 16:59:27 roberto Exp roberto $
+** $Id: lmathlib.c,v 1.101 2014/05/26 17:13:52 roberto Exp roberto $
** Standard mathematical library
** See Copyright Notice in lua.h
*/
@@ -86,16 +86,22 @@ static int math_floor (lua_State *L) {
return 1;
}
+
+static void pushnumint (lua_State *L, lua_Number d) {
+ lua_Integer n;
+ if (lua_numtointeger(d, &n)) /* fits in an integer? */
+ lua_pushinteger(L, n); /* result is integer */
+ else
+ lua_pushnumber(L, d); /* result is float */
+}
+
+
static int math_ceil (lua_State *L) {
if (lua_isinteger(L, 1))
lua_settop(L, 1); /* integer is its own ceil */
else {
- lua_Integer n;
lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1));
- if (lua_numtointeger(d, &n)) /* fits in an integer? */
- lua_pushinteger(L, n); /* result is integer */
- else
- lua_pushnumber(L, d); /* result is float */
+ pushnumint(L, d);
}
return 1;
}
@@ -124,12 +130,18 @@ static int math_fmod (lua_State *L) {
** 'double'.
*/
static int math_modf (lua_State *L) {
- 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);
- /* fractionary part (test needed for inf/-inf) */
- lua_pushnumber(L, (n == ip) ? 0.0 : (n - ip));
+ if (lua_isinteger(L ,1)) {
+ lua_settop(L, 1); /* number is its own integer part */
+ lua_pushnumber(L, 0); /* no fractionary part */
+ }
+ else {
+ lua_Number n = luaL_checknumber(L, 1);
+ /* integer part (rounds toward zero) */
+ lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n);
+ pushnumint(L, ip);
+ /* fractionary part (test needed for inf/-inf) */
+ lua_pushnumber(L, (n == ip) ? 0.0 : (n - ip));
+ }
return 2;
}