در حال ویرایش پودمان:Math
این ویرایش را میتوان خنثی کرد. لطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که میخواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثیسازی ویرایش را به پایان ببرید.
نسخهٔ فعلی | متن شما | ||
خط ۵: | خط ۵: | ||
]] | ]] | ||
local yesno | local yesno = require('Module:Yesno') | ||
local getArgs = require('Module:Arguments').getArgs | |||
local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules. | local p = {} -- Holds functions to be returned from #invoke, and functions to make available to other Lua modules. | ||
خط ۱۶: | خط ۱۷: | ||
local function err(msg) | local function err(msg) | ||
-- Generates wikitext error messages. | -- Generates wikitext error messages. | ||
return mw.ustring.format('<strong class="error"> | return mw.ustring.format('<strong class="error">خطای قالببندی: %s</strong>', msg) | ||
end | end | ||
خط ۴۹: | خط ۵۰: | ||
end | end | ||
local function | local function applyFuncToArgs(func, ...) | ||
-- 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 | ||
خط ۶۳: | خط ۶۴: | ||
end | end | ||
return ret, count | return ret, count | ||
end | end | ||
خط ۱۱۷: | خط ۱۱۰: | ||
local input_number = p._cleanNumber(input_string); | local input_number = p._cleanNumber(input_string); | ||
if input_number == nil then | if input_number == nil then | ||
return err(' | return err('ورودی مرتبه بزرگی بنظر میآید غیر عددی باشد') | ||
else | else | ||
return p._order(input_number) | return p._order(input_number) | ||
end | end | ||
end | end | ||
خط ۱۴۲: | خط ۱۳۵: | ||
local input_number; | local input_number; | ||
if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]]. | if yesno(trap_fraction, true) then -- Returns true for all input except nil, false, "no", "n", "0" and a few others. See [[Module:Yesno]]. | ||
local pos = string.find(input_string, '/', 1, true); | local pos = string.find(input_string, '/', 1, true); | ||
خط ۱۵۴: | خط ۱۴۴: | ||
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); | ||
if input_string == nil then | if input_string == nil then | ||
return err(' | return err('ورودی دقت بنظر میآید غیر عددی باشد') | ||
else | else | ||
return p._precision(input_string) | return p._precision(input_string) | ||
end | end | ||
end | end | ||
خط ۱۸۰: | خط ۱۷۰: | ||
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 | ||
خط ۱۹۸: | خط ۱۸۸: | ||
return result | return result | ||
end | end | ||
--[[ | --[[ | ||
خط ۲۱۶: | خط ۲۰۵: | ||
function p._max(...) | function p._max(...) | ||
local | local function maxOfTwo(a, b) | ||
if a > b then | |||
return a | |||
else | |||
return b | |||
end | |||
end | |||
local max_value = applyFuncToArgs(maxOfTwo, ...) | |||
if max_value then | if max_value then | ||
return max_value | return max_value | ||
خط ۲۲۳: | خط ۲۱۹: | ||
--[[ | --[[ | ||
min | |||
min | |||
Finds the minimum argument | Finds the minimum argument | ||
خط ۲۷۲: | خط ۲۳۷: | ||
function p._min(...) | function p._min(...) | ||
local | local function minOfTwo(a, b) | ||
if a < b then | |||
return a | |||
else | |||
return b | |||
end | |||
end | |||
local min_value = applyFuncToArgs(minOfTwo, ...) | |||
if min_value then | if min_value then | ||
return min_value | return min_value | ||
خط ۲۷۹: | خط ۲۵۱: | ||
--[[ | --[[ | ||
average | |||
average | |||
Finds the average | Finds the average | ||
خط ۳۲۲: | خط ۲۶۸: | ||
function p._average(...) | function p._average(...) | ||
local | local function getSum(a, b) | ||
return a + b | |||
end | |||
local sum, count = applyFuncToArgs(getSum, ...) | |||
if not sum then | if not sum then | ||
return 0 | return 0 | ||
خط ۳۴۴: | خط ۲۹۳: | ||
local precision = p._cleanNumber(args[2] or args.precision or 0) | local precision = p._cleanNumber(args[2] or args.precision or 0) | ||
if value == nil or precision == nil then | if value == nil or precision == nil then | ||
return err(' | return err('ورودی گرد بنظر میآید غیر عددی باشد') | ||
else | else | ||
return p._round(value, precision) | return p._round(value, precision) | ||
end | end | ||
end | end | ||
خط ۳۵۳: | خط ۳۰۲: | ||
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 | end | ||
خط ۳۸۲: | خط ۳۱۸: | ||
local y = p._cleanNumber(args[2]) | local y = p._cleanNumber(args[2]) | ||
if not x then | if not x then | ||
return err(' | return err('نخستین آرگومان برای mod بنظر میآید غیر عددی باشد') | ||
elseif not y then | elseif not y then | ||
return err(' | return err('دومین آرگومان برای mod بنظر میآید غیر عددی باشد') | ||
else | else | ||
return p._mod(x, y) | return p._mod(x, y) | ||
end | end | ||
end | end | ||
خط ۴۲۴: | خط ۳۶۰: | ||
return oldr | return oldr | ||
end | end | ||
local result, count = | local result, count = applyFuncToArgs(findGcd, ...) | ||
return result | return result | ||
end | end | ||
خط ۴۳۱: | خط ۳۶۷: | ||
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. | ||
خط ۴۵۴: | خط ۳۹۰: | ||
-- Check for non-numeric input | -- Check for non-numeric input | ||
if value == nil or precision == nil then | if value == nil or precision == nil then | ||
return err(' | return err('ورودی نامعتبر هنگام گرد کردن') | ||
end | end | ||
خط ۴۶۳: | خط ۳۹۹: | ||
-- 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) | |||
precision = 13 - order; | if order + orig_precision >= 14 then | ||
end | precision = 13 - order; | ||
end | |||
end | end | ||
خط ۴۷۲: | خط ۴۰۹: | ||
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)) | ||
خط ۴۸۲: | خط ۴۱۹: | ||
else | else | ||
sign = '' | sign = '' | ||
end | end | ||
-- Handle cases requiring scientific notation | -- Handle cases requiring scientific notation | ||
خط ۴۹۱: | خط ۴۲۸: | ||
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 | ||
خط ۵۰۹: | خط ۴۴۶: | ||
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 | ||
خط ۵۲۶: | خط ۴۶۳: | ||
else | else | ||
order = lang:formatNum(order) | order = lang:formatNum(order) | ||
end | end | ||
formatted_num = formatted_num .. '<span style="margin:0 . | formatted_num = formatted_num .. '<span style="margin:0 .25em 0 .15em">×</span>۱۰<sup>' .. order .. '</sup>' | ||
end | end | ||
خط ۵۳۵: | خط ۴۷۲: | ||
--[[ | --[[ | ||
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. | ||
خط ۵۵۴: | خط ۴۹۱: | ||
-- If failed, attempt to evaluate input as an expression | -- If failed, attempt to evaluate input as an expression | ||
if number == nil then | if number == nil then | ||
local | local frame = mw.getCurrentFrame() | ||
if | local attempt = frame:callParserFunction('#expr', number_string) | ||
number = | attempt = tonumber(attempt) | ||
if attempt ~= nil then | |||
number = attempt | |||
number_string = tostring(number) | number_string = tostring(number) | ||
else | else | ||
خط ۵۷۹: | خط ۵۱۸: | ||
]] | ]] | ||
local | local function makeWrapper(funcName) | ||
return function(frame) | return function (frame) | ||
local args = getArgs(frame) -- Argument processing is left to Module:Arguments. Whitespace is trimmed and blank arguments are removed. | |||
return wrap[funcName](args) | |||
end | end | ||
end | end | ||
for funcName in pairs(wrap) do | |||
p[funcName] = makeWrapper(funcName) | |||
end | |||
return | return p |