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. |