帮助:计算
外观
维基百科使用手册 |
元维基有相关资讯: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