Module:Math: Difference between revisions

From Test Wiki
Content deleted Content added
Anoop Rao (talk | contribs)
m 1 revision imported: IRC template
 
m 1 revision imported
 
(3 intermediate revisions by 3 users not shown)
Line 52: Line 52:
-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
-- Use a function on all supplied arguments, and return the result. The function must accept two numbers as parameters,
-- and must return a number as an output. This number is then supplied as input to the next function call.
-- and must return a number as an output. This number is then supplied as input to the next function call.
local vals = makeArgArray(...)
local vals = makeArgArray(...)
local count = #vals -- The number of valid arguments
local count = #vals -- The number of valid arguments
if count == 0 then return
if count == 0 then return
-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
-- Exit if we have no valid args, otherwise removing the first arg would cause an error.
nil, 0
nil, 0
end
end
local ret = table.remove(vals, 1)
local ret = table.remove(vals, 1)
for _, val in ipairs(vals) do
for _, val in ipairs(vals) do
Line 120: Line 120:
else
else
return p._order(input_number)
return p._order(input_number)
end
end
end
end


Line 154: Line 154:
return math.log10(denom_value);
return math.log10(denom_value);
end
end
end
end
end
end
end
end


input_number, input_string = p._cleanNumber(input_string);
input_number, input_string = p._cleanNumber(input_string);
Line 163: Line 163:
else
else
return p._precision(input_string)
return p._precision(input_string)
end
end
end
end


Line 180: Line 180:
x = string.sub(x, 1, exponent_pos - 1)
x = string.sub(x, 1, exponent_pos - 1)
result = result - tonumber(exponent)
result = result - tonumber(exponent)
end
end


if decimal ~= nil then
if decimal ~= nil then
Line 223: Line 223:


--[[
--[[
median
min

Find the median of set of numbers

Usage:
{{#invoke:Math | median | number1 | number2 | ...}}
OR
{{#invoke:Math | median }}
]]

function wrap.median(args)
return p._median(unpackNumberArgs(args))
end

function p._median(...)
local vals = makeArgArray(...)
local count = #vals
table.sort(vals)

if count == 0 then
return 0
end

if p._mod(count, 2) == 0 then
return (vals[count/2] + vals[count/2+1])/2
else
return vals[math.ceil(count/2)]
end
end

--[[
min


Finds the minimum argument
Finds the minimum argument
Line 248: Line 279:


--[[
--[[
sum
average

Finds the sum

Usage:
{{#invoke:Math| sum | value1 | value2 | ... }}
OR
{{#invoke:Math| sum }}

Note, any values that do not evaluate to numbers are ignored.
]]

function wrap.sum(args)
return p._sum(unpackNumberArgs(args))
end

function p._sum(...)
local sums, count = fold((function(a, b) return a + b end), ...)
if not sums then
return 0
else
return sums
end
end

--[[
average


Finds the average
Finds the average
Line 290: Line 347:
else
else
return p._round(value, precision)
return p._round(value, precision)
end
end
end
end


Line 296: Line 353:
local rescale = math.pow(10, precision or 0);
local rescale = math.pow(10, precision or 0);
return math.floor(value * rescale + 0.5) / rescale;
return math.floor(value * rescale + 0.5) / rescale;
end

--[[
log10

returns the log (base 10) of a number

Usage:
{{#invoke:Math | log10 | x }}
]]

function wrap.log10(args)
return math.log10(args[1])
end
end


Line 317: Line 387:
else
else
return p._mod(x, y)
return p._mod(x, y)
end
end
end
end


Line 361: Line 431:
precision_format
precision_format


Rounds a number to the specified precision and formats according to rules
Rounds a number to the specified precision and formats according to rules
originally used for {{template:Rnd}}. Output is a string.
originally used for {{template:Rnd}}. Output is a string.


Line 393: Line 463:
-- some circumstances because the terminal digits will be inaccurately reported.
-- some circumstances because the terminal digits will be inaccurately reported.
if order + precision >= 14 then
if order + precision >= 14 then
orig_precision = p._precision(value_string)
if order + p._precision(value_string) >= 14 then
precision = 13 - order;
if order + orig_precision >= 14 then
end
precision = 13 - order;
end
end
end


Line 403: Line 472:
value = p._round(value, precision)
value = p._round(value, precision)
current_precision = p._precision(value)
current_precision = p._precision(value)
end
end


local formatted_num = lang:formatNum(math.abs(value))
local formatted_num = lang:formatNum(math.abs(value))
Line 413: Line 482:
else
else
sign = ''
sign = ''
end
end


-- Handle cases requiring scientific notation
-- Handle cases requiring scientific notation
Line 422: Line 491:
formatted_num = lang:formatNum(math.abs(value))
formatted_num = lang:formatNum(math.abs(value))
else
else
order = 0;
order = 0;
end
end
formatted_num = sign .. formatted_num
formatted_num = sign .. formatted_num


-- Pad with zeros, if needed
-- Pad with zeros, if needed
if current_precision < precision then
if current_precision < precision then
local padding
local padding
Line 440: Line 509:


formatted_num = formatted_num .. string.rep('0', padding)
formatted_num = formatted_num .. string.rep('0', padding)
end
end
else
else
padding = precision - current_precision
padding = precision - current_precision
if padding > 20 then
if padding > 20 then
Line 457: Line 526:
else
else
order = lang:formatNum(order)
order = lang:formatNum(order)
end
end


formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>'
formatted_num = formatted_num .. '<span style="margin:0 .15em 0 .25em">×</span>10<sup>' .. order .. '</sup>'
Line 466: Line 535:


--[[
--[[
Helper function that interprets the input numerically. If the
Helper function that interprets the input numerically. If the
input does not appear to be a number, attempts evaluating it as
input does not appear to be a number, attempts evaluating it as
a parser functions expression.
a parser functions expression.