Math

Documentation for this module may be created at ሞድዩል:Math/doc

--[[  This module provides a number of basic mathematical operations.  ]] local z = {}  -- Generate a random number function z.random(frame)     local first = tonumber(frame.args[1])     local second = tonumber(frame.args[2])     local seed = tonumber(frame.args.seed)     if seed then         math.randomseed(seed * os.time())    -- pseudorandom initialization     end     if first and second then         if first < second then             return math.random(first,second)    -- integer between [first,second]         else             return math.random(second,first)         end     elseif first then         if first > 0 then             return math.random(first)    -- integer between [1,first]         else             return math.random(first,-1)         end     else         return math.random()    -- real number between [0,1)     end end  --[[ order  Determine order of magnitude of a number  Usage:     {{#invoke: Math | order |  }} ]] function z.order(frame)     local input_string = (frame.args[1] or frame.args.x or '0');     local input_number;          input_number = z._cleanNumber( frame, input_string );     if input_number == nil then         return 'Format error: Order of magnitude input appears non-numeric'     else         return z._order( input_number )     end     end function z._order(x)     if x == 0 then return 0 end     return math.floor(math.log10(math.abs(x))) end  --[[ precision  Detemines the precision of a number using the string representation  Usage:     {{ #invoke: Math | precision |  }} ]] function z.precision( frame )     local input_string = (frame.args[1] or frame.args.x or '0');     local trap_fraction = frame.args.check_fraction or false;     local input_number;          if type( trap_fraction ) == 'string' then         trap_fraction = trap_fraction:lower();         if trap_fraction == 'false' or trap_fraction == '0' or                 trap_fraction == 'no' or trap_fraction == '' then             trap_fraction = false;         else             trap_fraction = true;         end     end          if trap_fraction then         local pos = string.find( input_string, '/', 1, true );         if pos ~= nil then             if string.find( input_string, '/', pos + 1, true ) == nil then                 local denominator = string.sub( input_string, pos+1, -1 );                 local denom_value = tonumber( denominator );                 if denom_value ~= nil then                     return math.log10(denom_value);                 end             end                                 end     end              input_number, input_string = z._cleanNumber( frame, input_string );     if input_string == nil then         return 'Format error: Precision input appears non-numeric'     else         return z._precision( input_string )     end     end function z._precision( x )         x = string.upper( x )      local decimal = string.find( x, '.', 1, true )     local exponent_pos = string.find( x, 'E', 1, true )     local result = 0;          if exponent_pos ~= nil then         local exponent = string.sub( x, exponent_pos + 1 )         x = string.sub( x, 1, exponent_pos - 1 )         result = result - tonumber( exponent )     end              if decimal ~= nil then         result = result + string.len( x ) - decimal         return result     end              local pos = string.len( x );     while x:byte(pos) == string.byte('0') do         pos = pos - 1         result = result - 1         if pos <= 0 then             return 0         end     end          return result end  --[[ max  Finds the maximum argument  Usage:     {{#invoke:Math| max |  |  | ... }} or     {{#invoke:Math| max }}  Note, any values that do not evaluate to numbers are ignored. ]] function z.max( frame )     local args = frame.args;          if args[1] == nil then         local parent = frame:getParent();         args = parent.args;     end     local max_value = nil;          local i = 1;     while args[i] ~= nil do         local val = z._cleanNumber( frame, args[i] );         if val ~= nil then             if max_value == nil or val > max_value then                 max_value = val;             end         end                 i = i + 1;     end        return max_value end  --[[ min   Finds the minimum argument  Usage:     {{#invoke:Math| min |  |  | ... }} or     {{#invoke:Math| min }}  When used with no arguments, it takes its input from the parent frame.  Note, any values that do not evaluate to numbers are ignored. ]] function z.min( frame )     local args = frame.args;          if args[1] == nil then         local parent = frame:getParent();         args = parent.args;     end     local min_value = nil;          local i = 1;     while args[i] ~= nil do         local val = z._cleanNumber( frame, args[i] );         if val ~= nil then             if min_value == nil or val < min_value then                 min_value = val;             end         end                 i = i + 1;     end        return min_value end  -- Function that counts the number of reported parameters function z.counts( frame )     local result = 0;     local Arguments = frame.args;          if Arguments[1] == nil then         local parent = frame:getParent();         Arguments = parent.args;     end              local i = 1;     while Arguments[i] ~= nil do       if Arguments[i] ~= '' then      result = result + 1   end      i = i + 1;     end        return result end  -- Finds the sum function z.sum( frame )     local result = 0;     local Arguments = frame.args;          if Arguments[1] == nil then         local parent = frame:getParent();         Arguments = parent.args;     end              local i = 1;     while Arguments[i] ~= nil do       if Arguments[i] ~= '' then      result = result +  Arguments[i]   end      i = i + 1;     end        return result end  --[[ round  Rounds a number to specified precision  Usage:     {{#invoke:Math | round |  |  }}      --]] function z.round(frame)     local value, precision;          value = z._cleanNumber( frame, frame.args[1] or frame.args.value or 0 );     precision = z._cleanNumber( frame, frame.args[2] or frame.args.precision or 0 );          if value == nil or precision == nil then         return 'Format error: Round input appears non-numeric'     else         return z._round( value, precision );     end     end function z._round( value, precision )     local rescale = math.pow( 10, precision );     return math.floor( value * rescale + 0.5 ) / rescale; end  --[[ precision_format  Rounds a number to the specified precision and formats it according to the rules originally used for {{Template: Rnd}}. The output is a string. Usage:     {{#invoke: Math | precision_format |  |  }} ]] function z.precision_format( frame )     -- To access Mediawiki incorporating formatter.     local lang = mw.getContentLanguage();          local value_string, value, precision;     value, value_string = z._cleanNumber( frame, frame.args[1] or 0 );     precision = z._cleanNumber( frame, frame.args[2] or 0 );          -- Checks for a non-numeric input     if value == nil or precision == nil then         return 'Format error: Invalid data to round'     end          local current_precision = z._precision( value );      local order = z._order( value );          -- Due to rounding effects, it is necessary to limit the returned precision under     -- some circumstances, because the terminal digits were reported incorrectly.     if order + precision >= 14 then         orig_precision = z._precision( value_string );         if order + orig_precision >= 14 then             precision = 13 - order;                 end             end      -- If rounding, truncate additional digits     if precision < current_precision then         value = z._round( value, precision );         current_precision = z._precision( value );     end              local formatted_num = lang:formatNum( math.abs(value) );     local sign;          -- Uses the appropriate unary minus sign before the default ASCII     if value < 0 then         sign = '−';     else         sign = '';     end                  -- Handle cases that require scientific notation     if string.find( formatted_num, 'E', 1, true ) ~= nil or math.abs(order) >= 9 then         value = value * math.pow( 10, -order );         current_precision = current_precision + order;         precision = precision + order;         formatted_num = lang:formatNum( math.abs(value) );     else         order = 0;             end     formatted_num = sign .. formatted_num;          -- Pad with zeros if necessary         if current_precision < precision then         local padding;         if current_precision <= 0 then             if precision > 0 then                 local zero_sep = lang:formatNum( 1.1 );                 formatted_num = formatted_num .. zero_sep:sub(2,2);                  padding = precision;                 if padding > 20 then                     padding = 20;                 end                                  formatted_num = formatted_num .. string.rep( '0', padding );             end                     else                                padding = precision - current_precision             if padding > 20 then                 padding = 20;             end             formatted_num = formatted_num .. string.rep( '0', padding );         end     end      -- Add exponential notation, if necessary     if order ~= 0 then         -- Uses the appropriate unary minus sign before the default ASCII         if order < 0 then             order = '−' .. lang:formatNum( math.abs(order) );         else             order = lang:formatNum( order );         end                      formatted_num = formatted_num .. '×10' .. order .. ''     end          return formatted_num; end  --[[ Helper function that interprets numeric input. If the input is not a number, it tries to evaluate it as a "parser function" (parser). ]]  function z._cleanNumber( frame, number_string )     if number_string == nil or number_string:len() == 0 then         return nil, nil;     end              -- Try the basic conversion     local number = tonumber( number_string )          -- If it fails, it tries to evaluate the input as an expression     if number == nil then                 local attempt = frame:preprocess( '{{#expr: ' .. number_string .. '}}' );         attempt = tonumber( attempt );         if attempt ~= nil then             number = attempt;             number_string = tostring( number );         else             number = nil;             number_string = nil;         end     else     -- String is valid but may contain padding, clean it.         number_string = number_string:match( "^%s*(.-)%s*$" );     end          return number, number_string; end  return z 

Tags:

🔥 Trending searches on Wiki ትግርኛ:

APA styleቻይናተርጓሚ ጉግልጉግልዞባ ደቡባዊ ቀይሕ ባሕሪሳን ማሪዮጀርመንኔዘርላንድእንግሊዝኛቦሊቭያፉልደቡብ ኣመሪካመበገሲ ገጽባንዴራ ኤርትራኣግኣዝያንእንስሳዞባ ዓንሰባከሚካል ሪኣክሽንሓጋጊ ኣካልህንዲዊኪፐድያሩስያስጳኛኣቡበከር ናስርዞባ ሰሜናዊ ቀይሕ ባሕሪሊለ ዶወንሡGrace Wanሊብያዩክሬንጋናሃገርኩሽ (መጽሓፍ ቅዱስ)ቱርኪበርሊንኢሳይያስ ኣፈወርቂሃገራዊ መዝሙርቺሌመቐለባንዴራ ቤልጎሮድቋንቋ ኣምሓርኛኬንያናቕፋ (ከተማ)ማክዶናልድስዩቱብቋንቋ ትግርኛትግርኛ ፊደልሰሉሰሕቡራት ሃገራትሃንስ ማርቲን ሱተርማይስተርታሪኽኢትዮጵያፖርቱጋልኛ ፊደልፊንላንድጉግል ካርታታት🡆 More