145 lines
3.5 KiB
Lua
145 lines
3.5 KiB
Lua
--- Extends Lua 5.2 math.
|
|
-- @module math
|
|
-- @see math
|
|
|
|
local M = {}
|
|
|
|
local floor = math.floor
|
|
local ceil = math.ceil
|
|
local min = math.min
|
|
local max = math.max
|
|
local log10 = math.log10
|
|
|
|
--- Round a number.
|
|
-- @tparam number x
|
|
-- @treturn number the rounded number
|
|
function M.round(x)
|
|
return x >= 0 and floor(x + 0.5) or ceil(x - 0.5)
|
|
end
|
|
|
|
-- Various average (means) algorithms implementation
|
|
-- See: http://en.wikipedia.org/wiki/Average
|
|
|
|
--- Calculates the sum of a sequence of values.
|
|
-- @tparam array x and array of numbers
|
|
-- @treturn the sum
|
|
function M.sum(x)
|
|
local s = 0
|
|
for _, v in ipairs(x) do
|
|
s = s + v
|
|
end
|
|
return s
|
|
end
|
|
|
|
--- Calculates the arithmetic mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the arithmetic mean
|
|
function M.arithmetic_mean(x)
|
|
return (M.sum(x) / #x)
|
|
end
|
|
|
|
M.avg = M.arithmetic_mean
|
|
|
|
--- Calculates the geometric mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the geometric mean
|
|
function M.geometric_mean(x)
|
|
local prod = 1
|
|
for _, v in ipairs(x) do
|
|
prod = prod * v
|
|
end
|
|
return (prod ^ (1 / #x))
|
|
end
|
|
|
|
--- Calculates the harmonic mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the harmonic mean
|
|
function M.harmonic_mean(x)
|
|
local s = 0
|
|
for _, v in ipairs(x) do
|
|
s = s + (1 / v)
|
|
end
|
|
return (#x / s)
|
|
end
|
|
|
|
--- Calculates the quadratic mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the quadratic mean
|
|
function M.quadratic_mean(x)
|
|
local squares = 0
|
|
for _, v in ipairs(x) do
|
|
squares = squares + (v * v)
|
|
end
|
|
return math.sqrt((1 / #x) * squares)
|
|
end
|
|
|
|
--- Calculates the generalized mean (to a specified power) of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @tparam number p power
|
|
-- @treturn number the generalized mean
|
|
function M.generalized_mean(x, p)
|
|
local sump = 0
|
|
for _, v in ipairs(x) do
|
|
sump = sump + (v ^ p)
|
|
end
|
|
return ((1 / #x) * sump) ^ (1 / p)
|
|
end
|
|
|
|
--- Calculates the weighted mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @tparam array w an array of number weights for each value
|
|
-- @treturn number the weighted mean
|
|
function M.weighted_mean(x, w)
|
|
local sump = 0
|
|
for i, v in ipairs(x) do
|
|
sump = sump + (v * w[i])
|
|
end
|
|
return sump / M.sum(w)
|
|
end
|
|
|
|
--- Calculates the midrange mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the midrange mean
|
|
function M.midrange_mean(x)
|
|
return 0.5 * (min(unpack(x)) + max(unpack(x)))
|
|
end
|
|
|
|
--- Calculates the energetic mean of a set of values.
|
|
-- @tparam array x an array of numbers
|
|
-- @treturn number the energetic mean
|
|
function M.energetic_mean(x)
|
|
local s = 0
|
|
for _, v in ipairs(x) do
|
|
s = s + (10 ^ (v / 10))
|
|
end
|
|
return 10 * log10((1 / #x) * s)
|
|
end
|
|
|
|
-- Returns the number floored to p decimal spaces.
|
|
-- @tparam number x
|
|
-- @tparam[opt=0] int p the number of decimal places to floor to
|
|
-- @treturn number floored to p decimal spaces.
|
|
function M.floor_to(x, p)
|
|
if (p or 0) == 0 then
|
|
return floor(x)
|
|
end
|
|
local e = 10 ^ p
|
|
return floor(x * e) / e
|
|
end
|
|
|
|
-- Returns the number rounded to p decimal places.
|
|
-- @tparam number x
|
|
-- @tparam[opt=0] int p the number of decimal places to round to
|
|
-- @treturn number rounded to p decimal spaces.
|
|
function M.round_to(x, p)
|
|
local e = 10 ^ (p or 0)
|
|
return floor(x * e + 0.5) / e
|
|
end
|
|
|
|
-- Extend into math
|
|
for k, v in pairs(M) do
|
|
math[k] = v -- luacheck: globals math (Allow mutating global string)
|
|
end
|
|
|
|
return M
|