說明:計算
外觀
維基百科使用手冊 |
元維基有相關資訊:Help:Calculation
藉助於Mediawiki的擴展「函數解析器」,計算變得可行。
- 注意:目前此功能還有bug,詳情見meta:Talk:ParserFunctions#Bugs。
expr函數,計算數學表達式。語法為:
|
表達式支持的運算符有:
運算符 | 名稱 | 優先級 | 元數 | 結合性 | 樣例 |
---|---|---|---|---|---|
+ | 正 | 9 | 1 | 右 | {{#expr: + 7}} = 7 |
- | 負 | 9 | 1 | 右 | {{#expr: - 7}} = -7 |
not | 邏輯非 | 9 | 1 | 右 | {{#expr: not 7}} = 0 |
* | 乘 | 8 | 2 | 左 | {{#expr: 30 * 7}} = 210 |
/ | 除 | 8 | 2 | 左 | {{#expr: 30 / 7}} = 4.2857142857143 |
div | 除 | 8 | 2 | 左 | {{#expr: 30 div 7}} = 4.2857142857143 |
mod | 模 | 8 | 2 | 左 | {{#expr: 30 mod 7}} = 2 |
+ | 加 | 6 | 2 | 左 | {{#expr: 30 + 7}} = 37 |
- | 減 | 6 | 2 | 左 | {{#expr: 30 - 7}} = 23 |
round | 捨入 | 5 | 2 | 左 | {{#expr: 30 / 7 round 7}} = 4.2857143 |
= | 等於 | 4 | 2 | 左 | {{#expr: 30 = 7}} = 0 |
< | 小於 | 4 | 2 | 左 | {{#expr: 30 < 7}} = 0 |
> | 大於 | 4 | 2 | 左 | {{#expr: 30 > 7}} = 1 |
<= | 小於等於 | 4 | 2 | 左 | {{#expr: 30 <= 7}} = 0 |
>= | 大於等於 | 4 | 2 | 左 | {{#expr: 30 >= 7}} = 1 |
<> | 不等於 | 4 | 2 | 左 | {{#expr: 30 <> 7}} = 1 |
!= | 不等於 | 4 | 2 | 左 | {{#expr: 30 != 7}} = 1 |
and | 邏輯與 | 3 | 2 | 左 | {{#expr: 30 and 7}} = 1 |
or | 邏輯或 | 2 | 2 | 左 | {{#expr: 30 or 7}} = 1 |
round運算對運算數正負,位數正負都有不同的表現,參見下例。
邏輯運算符把假映射為0,把真映射為非0,且返回值只有0或1。
同一表達式中先計算高優先級運算。括號優先級高於一切。
樣例
[編輯]{{#expr: (100 - 32) / 9 * 5 round 0 }}
= 38:轉換攝氏華氏溫度{{#expr: 3 < 2 < 1}}
= 1{{#expr: 2 = 2 = 1}}
= 1:與數學表達式不同,「=」、「<」、「>」等運算符有返回值{{#expr: 999 * 999 round -2}}
= 998000{{#expr: 999 * 999 round -20}}
= 0{{#expr: 999 * 999 round -2.9}}
= 998000:round的危險用法{{#expr: 1 or 1 and 0}}
= 1:優先級演示{{#expr: 10.9 mod 2}}
= 0:mod的危險用法{{#expr: 30------7}}
= 23{{#expr: 30+++++7}}
= 37:「+」、「-」運算符有兩種含義{{#expr: .}}
= 0{{#expr: .1.1}}
= 0.1:實數表達法的多樣性(會無視多出的小數點){{#expr: ( ( ) )}}
= :特殊的括號用法,沒有實際意義{{#expr: 999999999*...*999999999}}
= INF:數字上溢的結果{{#expr:(-1)^0.5}}
= NAN:無法計算虛數單位{{Root|(-1)}}
= i:使用根號模板(詳見Template:複變運算){{複變運算|(-1)^0.5}}
= i:使用複變運算模板{{複變運算|e^(((-1)^0.5) * pi)}}
= -1:歐拉恆等式{{#expr:e^(((-1)^0.5) * pi)}}
= NAN:對比使用普通運算功能的歐拉恆等式
詳細運算子、函數、常數說明
[編輯]表達式 | 參數 | 運算子 | PHP | 資料型態 | 優先級 | 範例 | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | 1 | 一元 - 符號 (負號) | - | 與參數相同 | 10 |
| ||||||||||||||||||
e (位於子表達式之間) |
2 | *10^ 以10為底的指數 科學記號 |
* pow (10,..) | 浮點數,除非左邊的參數是整數且指數是非負整數 | 10 |
錯誤範例:
| ||||||||||||||||||
exp |
1 | 自然指數函數 ex | exp | 浮點數 | 9 |
比較:
| ||||||||||||||||||
ln |
1 | 自然對數 | log | 浮點數 | 9 |
可用換底公式轉換為常用對數,例如 log 2 ≒ 0.3010:
| ||||||||||||||||||
abs |
1 | 絕對值 | abs | 同於輸入值,並且非負 | 9 |
| ||||||||||||||||||
sqrt |
1 | 平方根 | sqrt | 浮點數 | 9 |
此平方根計算無法處理結果為虛數或複數的情況,
| ||||||||||||||||||
trunc |
1 | 截尾函數 | (int), 即轉換型態為整數 | 整數 | 9 |
| ||||||||||||||||||
floor |
1 | 向下取整函數 | floor | 浮點數 | 9 |
| ||||||||||||||||||
ceil |
1 | 向上取整函數 | ceil | 浮點數 | 9 |
| ||||||||||||||||||
sin |
1 | 正弦函數 | sin | 浮點數 | 9 |
若要使用角度(如30°)可表達為:
| ||||||||||||||||||
cos |
1 | 餘弦函數 | cos | 浮點數 | 9 |
| ||||||||||||||||||
tan |
1 | 正切函數 | tan | 浮點數 | 9 |
| ||||||||||||||||||
asin |
1 | 反正弦 | asin | 浮點數 | 9 |
| ||||||||||||||||||
acos |
1 | 反餘弦 | acos | 浮點數 | 9 |
| ||||||||||||||||||
atan |
1 | 反正切 | atan | 浮點數 | 9 |
| ||||||||||||||||||
not |
1 | 邏輯非 | ! | 以整數表達 的布林值 (1 或 0) |
9 |
| ||||||||||||||||||
^ |
2 | 冪 (指數) | pow | 原則上為浮點數。若底數為整數且指數為非負整數則為整數 | 8 |
| ||||||||||||||||||
* |
2 | 乘法 | * | 若兩參數為整數,則為整數,否則為浮點數 | 7 |
| ||||||||||||||||||
/ (或寫作div) |
2 | 除法 (div非整數除法[1]) |
/ | 原則上為浮點數。若兩參數皆為整數且整除則為整數 | 7 |
| ||||||||||||||||||
mod |
2 | 模除。 實行帶餘除法 時會將前後兩數截 成整數。[1] |
% | 整數 | 7 |
| ||||||||||||||||||
fmod |
2 | 模除,浮點數版本。 返回減去第二參數之整數 倍的第一參數。 |
fmod | 浮點數 | 7 |
| ||||||||||||||||||
+ |
2 | 加法 | + | 若兩參數皆為整數則為整數,其餘浮點數 | 6 |
| ||||||||||||||||||
- |
2 | 減法 | - | 若兩參數皆為整數則為整數,其餘浮點數 | 6 |
| ||||||||||||||||||
round |
2 | 將指定的小數位數 做四捨五入,若為 負值則會對指數 為數做四捨五入。 |
round | 浮點數 | 5 |
| ||||||||||||||||||
= |
2 | 相等(數字或邏輯的 相等運算,不支援 字串比對) |
== | 以整數表達 的布林值 (1 或 0) |
4 |
錯誤用法:
| ||||||||||||||||||
< |
2 | 小於(不適用於字串 比較) |
< | 以整數表達 的布林值 (1 或 0) |
4 |
wrong:
| ||||||||||||||||||
> |
2 | 大於(當參數顛倒時 與 < 相同) |
> | 以整數表達 的布林值 (1 或 0) |
4 |
| ||||||||||||||||||
<= |
2 | 小於等於(當參數 顛倒時與 >= 相同) |
<= | 以整數表達 的布林值 (1 或 0) |
4 |
| ||||||||||||||||||
>= |
2 | 大於等於(<的否定) | >= | 以整數表達 的布林值 (1 或 0) |
4 |
| ||||||||||||||||||
and |
2 | 邏輯與 | && | 以整數表達 的布林值 (1 或 0) |
3 |
| ||||||||||||||||||
or |
2 | 邏輯或 | || | 以整數表達 的布林值 (1 或 0) |
2 |
| ||||||||||||||||||
+ |
1 | 一元 + 符號 (正號) | (不適用) | 與參數相同 | 不適用 |
| ||||||||||||||||||
(數字) | 0 | 普通十進制的無符號 數字(一元加減和 e 被視為運算符,請 參見本表的其他地方) |
floatval | 浮點數 | 不適用 |
| ||||||||||||||||||
e 作為子表達式 |
0 | 數學常數e | exp(1) | 浮點數 | 不適用 |
| ||||||||||||||||||
pi |
0 | 數學常數圓周率 π | pi | 浮點數 | 不適用 |
|
錯誤
[編輯]此函數檢查錯誤並給出信息。
- Expression error: stack exhausted:表達式太長,棧耗盡;
- Expression error: unexpected number:不可預期的數字;
- Expression error: unexpected preg_match failure:運算符匹配失敗;
- Expression error: unrecognised word "$1":不可識別的運算符;
- Expression error: unexpected $1 operator:不可預期的運算符;
- Expression error: Missing operand for $1:缺少運算數;
- Expression error: unexpected closing bracket:不可預料的「)」
- Expression error: unrecognised punctuation character "$1":不可識別的標點字符;
- Expression error: unclosed bracket:缺少「)」
- Division by zero:零除錯誤;
- In sqrt: Result is not a number:計算結果為虛數。
- Invalid argument for "$1": "$2":超出"$1"的定義域。
錯誤的樣例
[編輯]{{#expr: ---...---1}}(110个“-”)
= 表達式錯誤:堆棧耗盡。{{#expr: ( ) 1}}
= 表達式錯誤:預期外的數字。{{#expr: 2 d 1}}
= 表達式錯誤:無法識別詞語「d」。{{#expr: * 1}}
= 表達式錯誤:預期外的*運算符。{{#expr: -}}
= 表達式錯誤:缺少-的操作數。{{#expr: ( 1 ) )}}
= 表達式錯誤:預期外的反括號。{{#expr: 壹}}
= 表達式錯誤:無法識別標點符號「壹」。{{#expr: ( 1}}
= 表達式錯誤:未封閉的括號。{{#expr: 1 / 0}}
= 除以零。{{#expr:sqrt-1}}
= sqrt內:結果不是數字。{{#expr:ln0}}
= ln的參數無效:小於或等於0。{{#expr:asin-22}}
= asin的參數無效:小於-1或大於1。
誤差
[編輯]浮點誤差有可能造成某些運算的結果不可預料,特別是最後幾位數不精確。使用此函數運算實數時,注意不要比較運算。
注意內部數字表示
[編輯]{{#expr: 100000000000000000}}
= 1.0E+17{{#expr: {{#expr: 100000000000000000}}}}
= 1.0E+17{{#expr: (-1.5-0.5 round 0)+2}}
= 0{{#expr: -0.1 round 0}}
= -0{{#expr: 2017.5000 round 3}}
= 2017.5:使用時會有無法補零的情形。欲補零,可以使用{{Round}}模板來解決
在返回值中,有可能出現無法再計算的數的情況,或者有一部分有效數字沒有顯示出來。使用此函數運算時須注意這些問題。
參見
[編輯]- Template:複變運算:MediaWiki原生的運算功能只懂得運算實數。若要計算複數或複變數甚至四元數可使用Template:複變運算模板,如上述示例中對負值取平方根時。
- Help:模板擴展語法
- 更多資料可參見m:help:Calculation(英文)。
- ^ 1.0 1.1
div
andmod
are different from all programming languages, see phab:T8068