2
0
mirror of https://github.com/koreader/koreader synced 2024-11-16 06:12:56 +00:00
koreader/frontend/optmath.lua

106 lines
2.0 KiB
Lua
Raw Normal View History

--[[--
Simple math helper functions
2016-12-25 20:05:48 +00:00
]]
local bit = require("bit")
2013-10-18 20:38:07 +00:00
local Math = {}
local band = bit.band
--[[--
Rounds a percentage.
@tparam float percent
@treturn int rounded percentage
]]
function Math.roundPercent(percent)
return math.floor(percent * 10000) / 10000
end
--[[--
Rounds away from zero.
@tparam float num
@treturn int ceiled above 0, floored under 0
]]
2013-10-18 20:38:07 +00:00
function Math.roundAwayFromZero(num)
2014-03-13 13:52:43 +00:00
if num > 0 then
return math.ceil(num)
else
return math.floor(num)
end
end
--[[--
Rounds a number.
No support for decimal points.
@tparam float num
@treturn int rounded number
]]
2013-10-18 20:38:07 +00:00
function Math.round(num)
2014-03-13 13:52:43 +00:00
return math.floor(num + 0.5)
end
--[[--
Determines if a number is odd or even.
@int number
@treturn string "odd" or "even"
]]
2013-10-18 20:38:07 +00:00
function Math.oddEven(number)
if band(number, 1) == 1 then
2014-03-13 13:52:43 +00:00
return "odd"
else
return "even"
end
end
2013-10-18 20:38:07 +00:00
local function tmin_max(tab, func, op)
2014-03-13 13:52:43 +00:00
if #tab == 0 then return nil, nil end
local index, value = 1, tab[1]
for i = 2, #tab do
2014-03-13 13:52:43 +00:00
if func then
if func(value, tab[i]) then
index, value = i, tab[i]
end
elseif op == "min" then
if value > tab[i] then
index, value = i, tab[i]
end
elseif op == "max" then
if value < tab[i] then
index, value = i, tab[i]
end
end
end
return index, value
end
2016-12-13 16:06:02 +00:00
--[[--
Returns the minimum element of a table.
The optional argument func specifies a one-argument ordering function.
2016-12-13 16:06:02 +00:00
2016-12-25 20:05:48 +00:00
@tparam table tab
@tparam func func
@treturn dynamic minimum element of a table
]]
2013-10-18 20:38:07 +00:00
function Math.tmin(tab, func)
2014-03-13 13:52:43 +00:00
return tmin_max(tab, func, "min")
end
2016-12-13 16:06:02 +00:00
--[[--
Returns the maximum element of a table.
The optional argument func specifies a one-argument ordering function.
2016-12-13 16:06:02 +00:00
2016-12-25 20:05:48 +00:00
@tparam table tab
@tparam func func
@treturn dynamic maximum element of a table
]]
2013-10-18 20:38:07 +00:00
function Math.tmax(tab, func)
2014-03-13 13:52:43 +00:00
return tmin_max(tab, func, "max")
end
2013-10-18 20:38:07 +00:00
return Math