From 8bb272a3e3d0693a1d587cfa3469153978ae617f Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Thu, 17 Jul 2014 09:30:53 -0300 Subject: new conversion float->integer: conversion is valid only when float has an exact representation as an integer --- lmathlib.c | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) (limited to 'lmathlib.c') diff --git a/lmathlib.c b/lmathlib.c index 61800799..79232e4d 100644 --- a/lmathlib.c +++ b/lmathlib.c @@ -1,5 +1,5 @@ /* -** $Id: lmathlib.c,v 1.105 2014/06/30 19:48:08 roberto Exp roberto $ +** $Id: lmathlib.c,v 1.106 2014/07/16 13:47:13 roberto Exp roberto $ ** Standard mathematical library ** See Copyright Notice in lua.h */ @@ -76,39 +76,39 @@ static int math_atan (lua_State *L) { } -static int math_ifloor (lua_State *L) { +static int math_toint (lua_State *L) { int valid; lua_Integer n = lua_tointegerx(L, 1, &valid); if (valid) - lua_pushinteger(L, n); /* floor computed by Lua */ + lua_pushinteger(L, n); else { - luaL_checktype(L, 1, LUA_TNUMBER); /* argument must be a number */ - lua_pushnil(L); /* number is not convertible to integer */ + luaL_checkany(L, 1); + lua_pushnil(L); /* value is not convertible to integer */ } return 1; } -static int math_floor (lua_State *L) { - int valid; - lua_Integer n = lua_tointegerx(L, 1, &valid); - if (valid) - lua_pushinteger(L, n); /* floor computed by Lua */ - else - lua_pushnumber(L, l_mathop(floor)(luaL_checknumber(L, 1))); - return 1; -} - - static void pushnumint (lua_State *L, lua_Number d) { lua_Integer n; - if (lua_numtointeger(d, &n)) /* fits in an integer? */ + if (lua_numtointeger(d, &n)) /* does 'd' fit in an integer? */ lua_pushinteger(L, n); /* result is integer */ else lua_pushnumber(L, d); /* result is float */ } +static int math_floor (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own floor */ + else { + lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + static int math_ceil (lua_State *L) { if (lua_isinteger(L, 1)) lua_settop(L, 1); /* integer is its own ceil */ @@ -264,15 +264,16 @@ static int math_randomseed (lua_State *L) { static int math_type (lua_State *L) { - luaL_checkany(L, 1); if (lua_type(L, 1) == LUA_TNUMBER) { if (lua_isinteger(L, 1)) lua_pushliteral(L, "integer"); else lua_pushliteral(L, "float"); } - else + else { + luaL_checkany(L, 1); lua_pushnil(L); + } return 1; } @@ -339,7 +340,7 @@ static const luaL_Reg mathlib[] = { {"cos", math_cos}, {"deg", math_deg}, {"exp", math_exp}, - {"ifloor", math_ifloor}, + {"tointeger", math_toint}, {"floor", math_floor}, {"fmod", math_fmod}, {"log", math_log}, -- cgit v1.2.3-55-g6feb