Changes

Jump to navigation Jump to search
820 bytes added ,  09:15, 14 March 2022
m
1 revision imported
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 238: Line 238:     
function p._median(...)
 
function p._median(...)
local vals = makeArgArray(...)
+
local vals = makeArgArray(...)
 
local count = #vals
 
local count = #vals
 
table.sort(vals)
 
table.sort(vals)
+
 
 
if count == 0 then
 
if count == 0 then
 
return 0
 
return 0
 
end
 
end
+
 
 
if p._mod(count, 2) == 0 then
 
if p._mod(count, 2) == 0 then
 
return (vals[count/2] + vals[count/2+1])/2
 
return (vals[count/2] + vals[count/2+1])/2
Line 254: Line 254:     
--[[
 
--[[
min  
+
min
    
Finds the minimum argument
 
Finds the minimum argument
Line 279: Line 279:     
--[[
 
--[[
sum  
+
sum
    
Finds the sum
 
Finds the sum
Line 305: Line 305:     
--[[
 
--[[
average  
+
average
    
Finds the average
 
Finds the average
Line 347: Line 347:  
else
 
else
 
return p._round(value, precision)
 
return p._round(value, precision)
end  
+
end
 
end
 
end
   Line 387: Line 387:  
else
 
else
 
return p._mod(x, y)
 
return p._mod(x, y)
end  
+
end
 
end
 
end
   Line 431: 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 463: 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
if order + orig_precision >= 14 then
+
precision = 13 - order;
precision = 13 - order;      
+
end
end      
   
end
 
end
   Line 473: 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 483: Line 482:  
else
 
else
 
sign = ''
 
sign = ''
end  
+
end
    
-- Handle cases requiring scientific notation
 
-- Handle cases requiring scientific notation
Line 492: 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 510: 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 527: 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 536: Line 535:     
--[[
 
--[[
Helper function that interprets the input numerically.  If the  
+
divide
 +
 
 +
Implements the division operator
 +
 
 +
Usage:
 +
{{#invoke:Math | divide | x | y | round= | precision= }}
 +
 
 +
--]]
 +
function wrap.divide(args)
 +
local x = args[1]
 +
local y = args[2]
 +
local round = args.round
 +
local precision =  args.precision
 +
if not yesno then
 +
yesno = require('Module:Yesno')
 +
end
 +
return p._divide(x, y, yesno(round), precision)
 +
end
 +
 
 +
function p._divide(x, y, round, precision)
 +
if y == nil or y == "" then
 +
return err("Empty divisor")
 +
elseif not tonumber(y) then
 +
if type(y) == 'string' and string.sub(y, 1, 1) == '<' then
 +
return y
 +
else
 +
return err("Not a number: " .. y)
 +
end
 +
elseif x == nil or x == "" then
 +
return err("Empty dividend")
 +
elseif not tonumber(x) then
 +
if type(x) == 'string' and string.sub(x, 1, 1) == '<' then
 +
return x
 +
else
 +
return err("Not a number: " .. x)
 +
end
 +
else
 +
local z = x / y
 +
if round then
 +
return p._round(z, 0)
 +
elseif precision then
 +
return p._round(z, precision)
 +
else
 +
return z
 +
end
 +
end
 +
end
 +
 
 +
--[[
 +
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.

Navigation menu