Permanently protected module

모듈:수학

Module

--[[  이 모듈은 여러 가지 기본적인 수학적 연산을 제공합니다.  ]]  현지의 예 아니오, args를 얻다 게으르게 초기화된.  현지의 p = {} #invoke에서 반환할 기능과 다른 Lua 모듈에서 사용할 수 있도록 하는 기능을 보유합니다. 현지의 싼다 = {} #invoke의 인수를 처리하는 래퍼 함수를 보유합니다.이들은 #invoke에 대한 함수와 Lua에 대한 함수 사이의 중간 역할을 합니다.  --[[ 중복 코드를 방지하는 데 사용되는 도우미 기능입니다. ]]  현지의 기능. 잘못한(메시지)  위키텍스트 오류 메시지를 생성합니다.  돌아가다 mw.ustring.서식을('<strong class="오류">포맷 오류: %s</strong>', 메시지) 끝.  현지의 기능. 압축 풀기 번호아그스(논병아리)  숫자 키로 지정된 인수의 언팩 목록을 반환합니다.  현지의 리트 = {}  위해서 k, v  쌍들(논병아리) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   한다면 유형(k) == '숫자' 그리고나서    표.삽입(리트, v)   끝.  끝.  돌아가다 짐을 풀다(리트) 끝.  현지의 기능. makeArgArray(...)  nil을 포함할 수 있는 인수 목록에서 인수 배열을 만듭니다.  현지의 논병아리 = {...} 인수 테이블입니다.nil 또는 숫자가 아닌 값이 포함될 수 있으므로 ipairs를 사용할 수 없습니다.  현지의 숫자들 = {} 유효한 숫자 인수의 수를 저장합니다.  현지의 리트 = {}  위해서 k, v  쌍들(논병아리) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   v = p._cleanNumber(v)   한다면 v 그리고나서    숫자들[#숫자들 + 1] = k    논병아리[k] = v   끝.  끝.  테이블. 테이블.(숫자들)  위해서 i, 번호  짝을 짓다(숫자들) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   리트[#리트 + 1] = 논병아리[번호]  끝.  돌아가다 리트 끝.  현지의 기능. 접이식의(펑크, ...)  제공된 모든 인수에 함수를 사용하고 결과를 반환합니다.함수는 두 개의 숫자를 매개 변수로 사용해야 합니다.  숫자를 출력으로 반환해야 합니다.그런 다음 이 번호는 다음 함수 호출에 입력으로 제공됩니다.  현지의 밸브 = makeArgArray(...)  현지의 세어보세요 = #밸브 유효한 인수 수입니다.  한다면 세어보세요 == 0 그리고나서 돌아가다   유효한 인수가 없으면 종료합니다. 그렇지 않으면 첫 번째 인수를 제거하면 오류가 발생합니다.   영의, 0  끝.  현지의 리트 = 테이블.제거(밸브, 1)  위해서 _,   짝을 짓다(밸브) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   리트 = 펑크(리트, )  끝.  돌아가다 리트, 세어보세요 끝.  --[[ 값을 선택하여 인수를 접습니다(func는 현재 "지배적인" 값을 선택할 때 반환해야 합니다). ]] 현지의 기능. 이진 접기(펑크, ...)  현지의 가치 = 접이식의((기능.(a, b) 한다면 펑크(a, b) 그리고나서 돌아가다 a 또 다른 돌아가다 b 끝. 끝.), ...)  돌아가다 가치 끝.  --[[ 난수의  난수 생성  용도: {{#선택사항:수학 랜덤 }} {{#선택사항:산술 랜덤 최대값 } {{#선택사항:산술 랜덤 최소값 최대값 } ]]  기능. 싼다.난수의(논병아리)  현지의 첫번째 = p._cleanNumber(논병아리[1])  현지의 둘째 = p._cleanNumber(논병아리[2])  돌아가다 p._지루한(첫번째, 둘째) 끝.  기능. p._지루한(첫번째, 둘째)  수학.채찍 종자(mw.위치.통계학.편집. + mw.위치.통계학.페이지들 + os.time() + 수학.플로어(os.clock() * 1000000000))  명시적인 nil 매개 변수가 지정되면 math.dll이 오류를 발생시키므로 if 문을 사용하여 매개 변수를 확인해야 합니다.  한다면 첫번째 그리고. 둘째 그리고나서   한다면 첫번째 <= 둘째 그리고나서 math.dll은 첫 번째 숫자가 두 번째 숫자보다 큰 것을 허용하지 않습니다.    돌아가다 수학, 수학,수학(첫번째, 둘째)   끝.  그렇지 않으면 첫번째 그리고나서   돌아가다 수학, 수학,수학(첫번째)  또 다른   돌아가다 수학, 수학,수학()  끝. 끝.  --[[ 주문  숫자의 크기 순서 결정  용도: {{#선택사항:산술 순서 값 }} ]]  기능. 싼다.주문(논병아리)  현지의 input_string = (논병아리[1] 또는 논병아리.x 또는 '0');  현지의 input_number = p._cleanNumber(input_string);  한다면 input_number == 영의 그리고나서   돌아가다 잘못한('크기 입력 순서가 일치하지 않는 것으로 나타납니다.')  또 다른   돌아가다 p._순서(input_number)  끝. 끝.  기능. p._순서(x)  한다면 x == 0 그리고나서 돌아가다 0 끝.  돌아가다 수학.플로어(수학.로그 10(수학, 수학, 수학 시험답(x))) 끝.  --[[ 정확  문자열 표현을 사용하여 숫자의 정밀도를 결정합니다.  용도: #선택:산술 정밀도 값 }} ]]  기능. 싼다.정확(논병아리)  현지의 input_string = (논병아리[1] 또는 논병아리.x 또는 '0');  현지의 덫에 걸린 = 논병아리.체크_레귤러;  현지의 input_number;   한다면 것은 아니다. 예 아니오 그리고나서   예 아니오 = 요구하다('모듈:'예스노')  끝.  한다면 예 아니오(덫에 걸린, 진실의) 그리고나서 nil, false, "no", "n", "0" 및 기타 몇 가지 입력을 제외한 모든 입력에 대해 true를 반환합니다.[[모듈:[예스노]].   현지의 포스 = 줄을 대다(input_string, '/', 1, 진실의);   한다면 포스 ~= 영의 그리고나서    한다면 줄을 대다(input_string, '/', 포스 + 1, 진실의) == 영의 그리고나서     현지의 분모 = string.sub(input_string, 포스+1, -1);     현지의 액면가 = 수에 달하여(분모);     한다면 액면가 ~= 영의 그리고나서      돌아가다 수학.로그 10(액면가);     끝.    끝.   끝.  끝.   input_number, input_string = p._cleanNumber(input_string);  한다면 input_string == 영의 그리고나서   돌아가다 잘못한('잘못된 입력이 유효하지 않은 것으로 나타납니다.')  또 다른   돌아가다 p._지루한(input_string)  끝. 끝.  기능. p._지루한(x)  한다면 유형(x) == '숫자' 그리고나서   x = 끈으로 묶는(x)  끝.  x = 현.상단(x)   현지의 십진의 = x:찾아내다('%.')  현지의 지수_pos = x:찾아내다('E')  현지의 결과 = 0;   한다면 지수_pos ~= 영의 그리고나서   현지의 지수의 = string.sub(x, 지수_pos + 1)   x = string.sub(x, 1, 지수_pos - 1)   결과 = 결과 - 수에 달하여(지수의)  끝.   한다면 십진의 ~= 영의 그리고나서   결과 = 결과 + string.len(x) - 십진의   돌아가다 결과  끝.   현지의 포스 = string.len(x);  하는 동안에 x:바이트(포스) == string.바이트('0') 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다   포스 = 포스 - 1   결과 = 결과 - 1   한다면 포스 <= 0 그리고나서    돌아가다 0   끝.  끝.   돌아가다 결과 끝.   --[[ 맥스.  최대 인수를 찾습니다.  용도: {{#선택사항:산술 최대값1 값2 ... }  숫자를 계산하지 않는 모든 값은 무시됩니다. ]]  기능. 싼다.맥스.(논병아리)  돌아가다 p._max(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._max(...)  현지의 max_value = 이진 접기((기능.(a, b) 돌아가다 a > b 끝.), ...)  한다면 max_value 그리고나서   돌아가다 max_value  끝. 끝.  --[[ 중앙값  숫자 집합의 중위수 찾기  용도: {{#선택사항:수학 중위수 1번 숫자 2...}} OR {{#선택사항:산술 중위수 }} ]]  기능. 싼다.중앙값(논병아리)  돌아가다 p._지루한(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._지루한(...)  현지의 밸브 = makeArgArray(...)  현지의 세어보세요 = #밸브  테이블. 테이블.(밸브)   한다면 세어보세요 == 0 그리고나서   돌아가다 0  끝.   한다면 p._모드(세어보세요, 2) == 0 그리고나서   돌아가다 (밸브[세어보세요/2] + 밸브[세어보세요/2+1])/2  또 다른   돌아가다 밸브[수학, 수학,수학(세어보세요/2)]  끝. 끝.  --[[   최소 인수를 찾습니다.  용도: {{#선택사항:산술 최소값1 값2 ... }} OR {{#선택사항:수학 최소값 }}  인수 없이 사용할 경우 상위 항목에서 입력을 가져옵니다. 프레임. 참고로 숫자를 계산하지 않는 모든 값은 무시됩니다. ]]  기능. 싼다.(논병아리)  돌아가다 p._min(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._min(...)  현지의 min_value = 이진 접기((기능.(a, b) 돌아가다 a < b 끝.), ...)  한다면 min_value 그리고나서   돌아가다 min_value  끝. 끝.  --[[   합계를 찾습니다.  용도: {{#선택사항:산술 합계 값1 값2 ... }} OR {{#선택사항:수학 합계 }}  숫자를 계산하지 않는 모든 값은 무시됩니다. ]]  기능. 싼다.(논병아리)  돌아가다 p._합(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._합(...)  현지의 합계, 세어보세요 = 접이식의((기능.(a, b) 돌아가다 a + b 끝.), ...)  한다면 것은 아니다. 합계 그리고나서   돌아가다 0  또 다른   돌아가다 합계  끝. 끝.  --[[ 평균  평균을 찾습니다.  용도: {{#선택사항:산술 평균 값1 값2 ... }} OR {{#선택사항:수학 평균 }}  숫자를 계산하지 않는 모든 값은 무시됩니다. ]]  기능. 싼다.평균(논병아리)  돌아가다 p._평균의(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._평균의(...)  현지의 , 세어보세요 = 접이식의((기능.(a, b) 돌아가다 a + b 끝.), ...)  한다면 것은 아니다.  그리고나서   돌아가다 0  또 다른   돌아가다  / 세어보세요  끝. 끝.  --[[ 둥그런  지정된 정밀도로 숫자를 반올림합니다.  용도: {{#선택사항:산술 라운드 값 정밀도 }  --]]  기능. 싼다.둥그런(논병아리)  현지의 가치 = p._cleanNumber(논병아리[1] 또는 논병아리.가치 또는 0)  현지의 정확 = p._cleanNumber(논병아리[2] 또는 논병아리.정확 또는 0)  한다면 가치 == 영의 또는 정확 == 영의 그리고나서   돌아가다 잘못한('원형 입력이 아닌 것으로 나타납니다.')  또 다른   돌아가다 p._원형의(가치, 정확)  끝. 끝.  기능. p._원형의(가치, 정확)  현지의 축척을 다시 짜다 = 수학.pow(10, 정확 또는 0);  돌아가다 수학.플로어(가치 * 축척을 다시 짜다 + 0.5) / 축척을 다시 짜다; 끝.  --[[ 로그 10  숫자의 로그(기본값 10)를 반환합니다.  용도: {{#선택사항:수학 로그 10 x }} ]]  기능. 싼다.로그 10(논병아리)  돌아가다 수학.로그 10(논병아리[1]) 끝.  --[[ 모드  모듈로 연산자 구현  용도: {{#선택사항:산술 modx y}}  --]]  기능. 싼다.모드(논병아리)  현지의 x = p._cleanNumber(논병아리[1])  현지의 y = p._cleanNumber(논병아리[2])  한다면 것은 아니다. x 그리고나서   돌아가다 잘못한('mod에 대한 첫 번째 인수가 유효하지 않은 것 같습니다.')  그렇지 않으면 것은 아니다. y 그리고나서   돌아가다 잘못한('mod에 대한 두 번째 인수가 유효하지 않은 것 같습니다.')  또 다른   돌아가다 p._모드(x, y)  끝. 끝.  기능. p._모드(x, y)  현지의 리트 = x % y  한다면 것은 아니다. (0 <= 리트 그리고. 리트 < y) 그리고나서   리트 = 0  끝.  돌아가다 리트 끝.  --[[ gcd  여러 숫자의 최대 공약수를 계산합니다.  용도: {{#선택사항:함수 gcd 값 1 값 2 값 3 ... }} --]]  기능. 싼다.gcd(논병아리)  돌아가다 p._gcd(압축 풀기 번호아그스(논병아리)) 끝.  기능. p._gcd(...)  현지의 기능. Gcd 찾기(a, b)   현지의 r = b   현지의 연장자 = a   하는 동안에 r ~= 0 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다    현지의 상당의 = 수학.플로어(연장자 / r)    연장자, r = r, 연장자 - 상당의 * r   끝.   한다면 연장자 < 0 그리고나서    연장자 = 연장자 * -1   끝.   돌아가다 연장자  끝.  현지의 결과, 세어보세요 = 접이식의(Gcd 찾기, ...)  돌아가다 결과 끝.  --[[ precision_format  규칙에 따라 숫자를 지정된 정밀도와 형식으로 반올림합니다. 원래는 {{filename}에 사용되었습니다.Rnd}}. 출력이 문자열입니다.  용도: {{#선택사항:산술 정밀도_형식 번호 정밀도 } ]]  기능. 싼다.precision_format(논병아리)  현지의 value_string = 논병아리[1] 또는 0  현지의 정확 = 논병아리[2] 또는 0  돌아가다 p._filename_format(value_string, 정확) 끝.  기능. p._filename_format(value_string, 정확)  Mediawiki 내장 포맷터에 액세스할 수 있습니다.  현지의 랑그 = mw.콘텐츠 언어 가져오기();   현지의 가치  가치, value_string = p._cleanNumber(value_string)  정확 = p._cleanNumber(정확)   숫자가 아닌 입력을 확인합니다.  한다면 가치 == 영의 또는 정확 == 영의 그리고나서   돌아가다 잘못한('반올림할 때 입력이 잘못됨')  끝.   현지의 현재의 = p._지루한(가치)  현지의 주문 = p._순서(가치)   반올림 효과로 인해 반환되는 정밀도를 다음과 같이 제한해야 합니다.  터미널 디짓이 부정확하게 보고되기 때문에 일부 상황이 발생합니다.  한다면 주문 + 정확 >= 14 그리고나서   한다면 주문 + p._지루한(value_string) >= 14 그리고나서    정확 = 13 - 주문;   끝.  끝.   반올림한 경우 추가 숫자 잘라내기  한다면 정확 < 현재의 그리고나서   가치 = p._원형의(가치, 정확)   현재의 = p._지루한(가치)  끝.   현지의 formated_num = 랑그:formatNum(수학, 수학, 수학 시험답(가치))  현지의 서명하다   ASCII 기본값 대신 올바른 단항 빼기 기호 사용  한다면 가치 < 0 그리고나서   서명하다 = '−'  또 다른   서명하다 = ''  끝.   과학적 표기가 필요한 사건 처리  한다면 줄을 대다(formated_num, 'E', 1, 진실의) ~= 영의 또는 수학, 수학, 수학 시험답(주문) >= 9 그리고나서   가치 = 가치 * 수학.pow(10, -주문)   현재의 = 현재의 + 주문   정확 = 정확 + 주문   formated_num = 랑그:formatNum(수학, 수학, 수학 시험답(가치))  또 다른   주문 = 0;  끝.  formated_num = 서명하다 .. formated_num   0이 있는 패드(필요한 경우)  한다면 현재의 < 정확 그리고나서   현지의 패딩   한다면 현재의 <= 0 그리고나서    한다면 정확 > 0 그리고나서     현지의 영점의 = 랑그:formatNum(1.1)     formated_num = formated_num .. 영점의:후보선수(2,2)      패딩 = 정확     한다면 패딩 > 20 그리고나서      패딩 = 20     끝.      formated_num = formated_num .. string.rep('0', 패딩)    끝.   또 다른    패딩 = 정확 - 현재의    한다면 패딩 > 20 그리고나서     패딩 = 20    끝.    formated_num = formated_num .. string.rep('0', 패딩)   끝.  끝.   필요한 경우 지수 표기법을 추가합니다.  한다면 주문 ~= 0 그리고나서   ASCII 기본값 대신 올바른 단항 빼기 기호 사용   한다면 주문 < 0 그리고나서    주문 = '−' .. 랑그:formatNum(수학, 수학, 수학 시험답(주문))   또 다른    주문 = 랑그:formatNum(주문)   끝.    formated_num = formated_num .. '<span style="flash:0.15em 0.25em">×</span>10<sup>' .. 주문 .. '/sup'  끝.   돌아가다 formated_num 끝.  --[[ 나누다  나눗셈 연산자 구현  용도: {{#선택사항:수학 나눗셈 x y 라운드 = 정밀도 = }  --]] 기능. 싼다.나누다(논병아리)  현지의 x = 논병아리[1]  현지의 y = 논병아리[2]  현지의 둥그런 = 논병아리.둥그런  현지의 정확 =  논병아리.정확  한다면 것은 아니다. 예 아니오 그리고나서   예 아니오 = 요구하다('모듈:'예스노')  끝.  돌아가다 p._지루한(x, y, 예 아니오(둥그런), 정확) 끝.  기능. p._지루한(x, y, 둥그런, 정확)  한다면 y == 영의 또는 y == "" 그리고나서   돌아가다 잘못한("공백제")  그렇지 않으면 것은 아니다. 수에 달하여(y) 그리고나서   한다면 유형(y) == '끈' 그리고. string.sub(y, 1, 1) == '<' 그리고나서    돌아가다 y   또 다른    돌아가다 잘못한("숫자가 아닙니다." .. y)   끝.  그렇지 않으면 x == 영의 또는 x == "" 그리고나서   돌아가다 잘못한("빈 배당금")  그렇지 않으면 것은 아니다. 수에 달하여(x) 그리고나서   한다면 유형(x) == '끈' 그리고. string.sub(x, 1, 1) == '<' 그리고나서    돌아가다 x   또 다른    돌아가다 잘못한("숫자가 아닙니다." .. x)   끝.  또 다른   현지의 z = x / y   한다면 둥그런 그리고나서    돌아가다 p._원형의(z, 0)   그렇지 않으면 정확 그리고나서    돌아가다 p._원형의(z, 정확)   또 다른    돌아가다 z    끝.  끝. 끝.  --[[ 입력을 숫자로 해석하는 도우미 기능입니다.만약에 입력이 숫자가 아닌 것 같습니다. 다음과 같이 평가하려고 합니다. 파서 함수식 ]]  기능. p._cleanNumber(number_string)  한다면 유형(number_string) == '숫자' 그리고나서   우리는 번호를 전달받았기 때문에 어떤 처리도 할 필요가 없습니다.   돌아가다 number_string, 끈으로 묶는(number_string)  그렇지 않으면 유형(number_string) ~= '끈' 또는 것은 아니다. number_string:찾아내다('%S') 그리고나서   문자열이 없거나 빈 문자열이 전달되었으므로 종료합니다.   돌아가다 영의, 영의;  끝.   기본 변환 시도  현지의 번호 = 수에 달하여(number_string)   실패한 경우 입력을 식으로 평가합니다.  한다면 번호 == 영의 그리고나서   현지의 성공., 결과 = pcall(mw.다음의.파서 함수.수출의, number_string)   한다면 성공. 그리고나서    번호 = 수에 달하여(결과)    number_string = 끈으로 묶는(번호)   또 다른    번호 = 영의    number_string = 영의   끝.  또 다른   number_string = number_string:경기("^%s*(.)%s*$") 문자열이 유효하지만 패딩을 포함할 수 있습니다. 정리하십시오.   number_string = number_string:경기("^%+(.*)$") 또는 number_string 선행 + 기호를 모두 트림합니다.   한다면 number_string:찾아내다('^%-?0[xX]') 그리고나서    숫자는 0xnnn 표기법을 사용하여 기준 16을 나타냅니다. 대신 Lua가 탐지한 숫자를 사용하십시오.    number_string = 끈으로 묶는(번호)   끝.  끝.   돌아가다 번호, number_string 끝.  --[[ 기본 인수 처리를 수행하는 래퍼 함수입니다.이렇게 하면 #invoke의 모든 기능이 전류 중 하나를 사용할 수 있습니다. 또한 모든 인수에 대한 공백을 잘라내고 빈 인수를 제거합니다. ]]  현지의 mt = { __index = 기능.(t, k)  돌아가다 기능.()   한다면 것은 아니다. args를 얻다 그리고나서    args를 얻다 = 요구하다('모듈:인수').args를 얻다   끝.   돌아가다 싼다[k](args를 얻다())  인수 처리는 모듈에 맡겨집니다.논쟁들.공백이 잘리고 빈 인수가 제거됩니다.  끝. 끝. }  돌아가다 상을 차리다(p, mt)