aboutsummaryrefslogtreecommitdiff
path: root/lmathlib.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-05-02 13:36:51 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2014-05-02 13:36:51 -0300
commit6d5324f92f0a6e0bb19b2482c437652e3c2f82c0 (patch)
treea41879e34eafe10a68ad90d93f60bd6c887eb1be /lmathlib.c
parent4fe11ae232e37045feaaf08d72a5414fca463c1c (diff)
downloadlua-6d5324f92f0a6e0bb19b2482c437652e3c2f82c0.tar.gz
lua-6d5324f92f0a6e0bb19b2482c437652e3c2f82c0.tar.bz2
lua-6d5324f92f0a6e0bb19b2482c437652e3c2f82c0.zip
'math.fmod' handles integers as integers
Diffstat (limited to 'lmathlib.c')
-rw-r--r--lmathlib.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/lmathlib.c b/lmathlib.c
index 5d56a32f..45270814 100644
--- a/lmathlib.c
+++ b/lmathlib.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lmathlib.c,v 1.97 2014/04/10 17:53:33 roberto Exp roberto $ 2** $Id: lmathlib.c,v 1.98 2014/04/17 16:09:40 roberto Exp roberto $
3** Standard mathematical library 3** Standard mathematical library
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -117,8 +117,18 @@ static int math_ifloor (lua_State *L) {
117} 117}
118 118
119static int math_fmod (lua_State *L) { 119static int math_fmod (lua_State *L) {
120 lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), 120 if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) {
121 luaL_checknumber(L, 2))); 121 lua_Integer d = lua_tointeger(L, 2);
122 if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */
123 luaL_argcheck(L, d != 0, 2, "zero");
124 lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */
125 }
126 else
127 lua_pushinteger(L, lua_tointeger(L, 1) % d);
128 }
129 else
130 lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1),
131 luaL_checknumber(L, 2)));
122 return 1; 132 return 1;
123} 133}
124 134
@@ -132,7 +142,7 @@ static int math_modf (lua_State *L) {
132 /* integer part (rounds toward zero) */ 142 /* integer part (rounds toward zero) */
133 lua_Number ip = (n < 0) ? -l_mathop(floor)(-n) : l_mathop(floor)(n); 143 lua_Number ip = (n < 0) ? -l_mathop(floor)(-n) : l_mathop(floor)(n);
134 lua_pushnumber(L, ip); 144 lua_pushnumber(L, ip);
135 /* fractionary part (test handles inf/-inf) */ 145 /* fractionary part (test needed for inf/-inf) */
136 lua_pushnumber(L, (n == ip) ? 0.0 : (n - ip)); 146 lua_pushnumber(L, (n == ip) ? 0.0 : (n - ip));
137 return 2; 147 return 2;
138} 148}