Functions 'frexp'-'ldexp' back to the math library
They are basic for anything that handles the representation of floating numbers.
This commit is contained in:
32
lmathlib.c
32
lmathlib.c
@@ -203,6 +203,20 @@ static int math_rad (lua_State *L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int math_frexp (lua_State *L) {
|
||||||
|
int e;
|
||||||
|
lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
|
||||||
|
lua_pushinteger(L, e);
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int math_ldexp (lua_State *L) {
|
||||||
|
lua_Number x = luaL_checknumber(L, 1);
|
||||||
|
int ep = (int)luaL_checkinteger(L, 2);
|
||||||
|
lua_pushnumber(L, l_mathop(ldexp)(x, ep));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int math_min (lua_State *L) {
|
static int math_min (lua_State *L) {
|
||||||
int n = lua_gettop(L); /* number of arguments */
|
int n = lua_gettop(L); /* number of arguments */
|
||||||
@@ -666,20 +680,6 @@ static int math_pow (lua_State *L) {
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int math_frexp (lua_State *L) {
|
|
||||||
int e;
|
|
||||||
lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
|
|
||||||
lua_pushinteger(L, e);
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int math_ldexp (lua_State *L) {
|
|
||||||
lua_Number x = luaL_checknumber(L, 1);
|
|
||||||
int ep = (int)luaL_checkinteger(L, 2);
|
|
||||||
lua_pushnumber(L, l_mathop(ldexp)(x, ep));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int math_log10 (lua_State *L) {
|
static int math_log10 (lua_State *L) {
|
||||||
lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
|
lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
|
||||||
return 1;
|
return 1;
|
||||||
@@ -702,7 +702,9 @@ static const luaL_Reg mathlib[] = {
|
|||||||
{"tointeger", math_toint},
|
{"tointeger", math_toint},
|
||||||
{"floor", math_floor},
|
{"floor", math_floor},
|
||||||
{"fmod", math_fmod},
|
{"fmod", math_fmod},
|
||||||
|
{"frexp", math_frexp},
|
||||||
{"ult", math_ult},
|
{"ult", math_ult},
|
||||||
|
{"ldexp", math_ldexp},
|
||||||
{"log", math_log},
|
{"log", math_log},
|
||||||
{"max", math_max},
|
{"max", math_max},
|
||||||
{"min", math_min},
|
{"min", math_min},
|
||||||
@@ -718,8 +720,6 @@ static const luaL_Reg mathlib[] = {
|
|||||||
{"sinh", math_sinh},
|
{"sinh", math_sinh},
|
||||||
{"tanh", math_tanh},
|
{"tanh", math_tanh},
|
||||||
{"pow", math_pow},
|
{"pow", math_pow},
|
||||||
{"frexp", math_frexp},
|
|
||||||
{"ldexp", math_ldexp},
|
|
||||||
{"log10", math_log10},
|
{"log10", math_log10},
|
||||||
#endif
|
#endif
|
||||||
/* placeholders */
|
/* placeholders */
|
||||||
|
|||||||
@@ -8341,6 +8341,17 @@ that rounds the quotient towards zero. (integer/float)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@LibEntry{math.frexp (x)|
|
||||||
|
|
||||||
|
Returns two numbers @id{m} and @id{e} such that @M{x = m2@sp{e}},
|
||||||
|
where @id{e} is an integer.
|
||||||
|
When @id{x} is zero, NaN, +inf, or -inf,
|
||||||
|
@id{m} is equal to @id{x};
|
||||||
|
otherwise, the absolute value of @id{m}
|
||||||
|
is in the range @C{(} @M{[0.5, 1)} @C{]}.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@LibEntry{math.huge|
|
@LibEntry{math.huge|
|
||||||
|
|
||||||
The float value @idx{HUGE_VAL},
|
The float value @idx{HUGE_VAL},
|
||||||
@@ -8348,6 +8359,12 @@ a value greater than any other numeric value.
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@LibEntry{math.ldexp(m, e)|
|
||||||
|
|
||||||
|
Returns @M{m2@sp{e}}, where @id{e} is an integer.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@LibEntry{math.log (x [, base])|
|
@LibEntry{math.log (x [, base])|
|
||||||
|
|
||||||
Returns the logarithm of @id{x} in the given base.
|
Returns the logarithm of @id{x} in the given base.
|
||||||
@@ -8403,7 +8420,7 @@ Converts the angle @id{x} from degrees to radians.
|
|||||||
|
|
||||||
When called without arguments,
|
When called without arguments,
|
||||||
returns a pseudo-random float with uniform distribution
|
returns a pseudo-random float with uniform distribution
|
||||||
in the range @C{(} @M{[0,1)}. @C{]}
|
in the range @C{(} @M{[0, 1)}. @C{]}
|
||||||
When called with two integers @id{m} and @id{n},
|
When called with two integers @id{m} and @id{n},
|
||||||
@id{math.random} returns a pseudo-random integer
|
@id{math.random} returns a pseudo-random integer
|
||||||
with uniform distribution in the range @M{[m, n]}.
|
with uniform distribution in the range @M{[m, n]}.
|
||||||
|
|||||||
@@ -685,6 +685,18 @@ assert(eq(math.exp(0), 1))
|
|||||||
assert(eq(math.sin(10), math.sin(10%(2*math.pi))))
|
assert(eq(math.sin(10), math.sin(10%(2*math.pi))))
|
||||||
|
|
||||||
|
|
||||||
|
do print("testing ldexp/frexp")
|
||||||
|
global ipairs
|
||||||
|
for _, x in ipairs{0, 10, 32, -math.pi, 1e10, 1e-10, math.huge, -math.huge} do
|
||||||
|
local m, p = math.frexp(x)
|
||||||
|
assert(math.ldexp(m, p) == x)
|
||||||
|
local am = math.abs(m)
|
||||||
|
assert(m == x or (0.5 <= am and am < 1))
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
assert(tonumber(' 1.3e-2 ') == 1.3e-2)
|
assert(tonumber(' 1.3e-2 ') == 1.3e-2)
|
||||||
assert(tonumber(' -1.00000000000001 ') == -1.00000000000001)
|
assert(tonumber(' -1.00000000000001 ') == -1.00000000000001)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user