支持的函数与常数
下表列出了解析器接受的全部内容;出于安全考虑,任何其他记号都会被拒绝。
| 类别 | 可用内容 | 示例 |
|---|---|---|
| 三角函数 | sin, cos, tan, asin, acos, atan | sin(pi/2) = 1(弧度制) |
| 方根与绝对值 | sqrt, cbrt, abs | sqrt(16) = 4; cbrt(27) = 3 |
| 对数与指数 | ln, log (以 10 为底), log2, exp | log(1000) = 3; ln(e) = 1 |
| 取整 | floor, ceil, round | floor(2.7) = 2; ceil(2.1) = 3 |
| 双参数函数 | min(a, b), max(a, b) | max(3, 7) = 7 |
| 常数 | pi, e, tau | tau = 2 x pi = 6.283185... |
| 运算符 | + - * / % ^ 以及括号 | 2^10 = 1024; 10 % 3 = 1 |
- 角度单位只影响三角函数:角度模式会把 sin/cos/tan 的输入从角度转换,并把 asin/acos/atan 的结果以角度返回。
- 这里的 log 表示以 10 为底的对数;自然对数请用 ln,以 2 为底的对数请用 log2。
- 该解析器是一种安全白名单机制:表达式从不会传给 eval,无法识别的标识符会使整个表达式无效,而不是被猜测处理。
- 结果受双精度浮点运算的限制(约 15-16 位有效数字);像 0.1 + 0.2 得到 0.30000000000000004 这样的微小舍入误差是浮点数运算固有的现象。
这个科学计算器是什么?
科学计算器能计算超出基本四则运算的数学表达式:三角函数、对数、指数、方根和常数。这个计算器接受一整段文本形式的表达式,并按照标准的运算顺序求值——先括号,再指数,然后乘法、除法与取余,最后加法与减法。
支持的函数:sin、cos、tan 及其反函数 asin、acos、atan;sqrt(平方根)和 cbrt(立方根);abs(绝对值);ln(自然对数)、log(以 10 为底的对数)、log2(以 2 为底的对数)和 exp(e 的幂);floor、ceil 和 round(取整函数);以及双参数函数 min(a, b) 和 max(a, b)。支持的常数:pi(3.14159…)、e(2.71828…)和 tau(2 × pi)。支持的运算符:+ - * / %(取余)和 ^(幂),以及括号和一元负号。
表达式由一个安全的白名单解析器求值:输入会依据固定的允许函数、常数、数字和运算符列表进行分词,任何不在列表中的内容都会被拒绝。计算器从不把你的输入传给 JavaScript 引擎的 eval,因此任意代码永远不会被执行——未知的名称只会导致没有结果,而不会被执行。
角度单位设置只影响三角函数:在角度模式下,sin、cos、tan 的参数会被解释为角度,asin、acos、atan 的结果也会以角度返回。在弧度模式(数学中的默认约定)下,所有角度都以弧度为单位。
如何使用这个科学计算器
- 输入你的表达式,例如:sin(pi/6) + sqrt(16) * 2^3。函数参数放在括号内;乘法必须用 * 明确写出(写作 2*pi,而不是 2pi)。
- 在计算三角函数之前,先选择角度单位——弧度或角度。角度模式下 sin(30) 是 0.5;弧度模式下 sin(30) 约为 −0.988。
- 查看结果。数值极大或极小的结果会以科学 e 记法显示。
- 如果没有出现结果,检查是否有括号不匹配、未知的函数名,或者省略了乘号——白名单解析器会拒绝任何它无法识别的内容。
运算顺序(PEMDAS)
表达式按以下顺序求值:括号(由内到外),然后是函数运算,接着是幂运算 ^(右结合),然后是一元负号,接着是从左到右的 * / %,最后是从左到右的 + -。这与数学中教授的标准 PEMDAS/BODMAS 惯例一致。
演示:弧度模式下的 sin(pi/6) + sqrt(16) * 2^3。第一步——括号和函数:pi/6 = 0.523599,sin(0.523599) = 0.5;sqrt(16) = 4。第二步——指数:2^3 = 8。第三步——乘法先于加法:4 * 8 = 32。第四步——加法:0.5 + 32 = 32.5。
有两点值得注意:幂运算是右结合的,所以 2^3^2 = 2^(3^2) = 2^9 = 512,而不是 (2^3)^2 = 64;而 % 运算符是取余(模)运算,所以 10 % 3 = 1——它不表示百分比。
常见错误
- 在错误的角度单位下计算三角函数:sin(30) 只有在角度模式下才是 0.5;在弧度模式下 sin(30) 约为 −0.988。
- 写出省略乘号的表达式,如 2pi 或 3(4+1)——解析器要求明确写出 *:2*pi、3*(4+1)。
- 以为 % 表示百分比:它其实是取余运算符,所以 50 % 8 = 2;要计算 8 的 50%,应写作 0.5*8。
- 误解运算符优先级:−3^2 会先计算幂运算,得到 −9;要得到 9,应写作 (−3)^2。
- 以为幂运算是左结合的:2^3^2 是 2^(3^2) = 512,而不是 64。
常见问题
这个科学计算器支持哪些函数?
三角函数 sin、cos、tan 及其反函数 asin、acos、atan;方根函数 sqrt 和 cbrt;abs;对数函数 ln(自然对数)、log(以 10 为底)和 log2;exp;取整函数 floor、ceil 和 round;双参数函数 min 和 max;常数 pi、e 和 tau;以及运算符 + - * / % ^ 和括号。任何不在此列表中的内容都会被白名单解析器拒绝。
怎样在角度制和弧度制之间切换?
使用角度单位选择器。在角度模式下,sin、cos、tan 会把它们的参数解释为角度,反函数也会返回角度;在弧度模式(数学中的默认约定)下,一切都以弧度为单位。同样的表达式在两种模式下可能给出不同的结果:sin(30) 在角度制下是 0.5,但在弧度制下约为 −0.988。
计算器采用怎样的运算顺序?
标准的 PEMDAS 惯例:先括号,然后函数,接着幂运算(右结合),然后一元负号,接着从左到右的乘法、除法和取余,最后是从左到右的加法和减法。所以 1 + 2 * 3^2 = 1 + 2 * 9 = 19,而 2^3^2 = 2^9 = 512。
为什么我的表达式没有返回结果?
解析器只接受白名单中的记号。常见原因包括:省略乘号(应写作 2*pi,而不是 2pi)、括号不匹配、未知的函数名(支持的列表是固定的)、无效的数学运算(比如对负数开平方,或产生无穷大的除法),或者表达式长度超过 300 个字符。这种拒绝是有意为之的——计算器从不猜测,也从不执行任意代码。
% 运算符是做什么的?
它计算的是除法的余数(取模运算):10 % 3 = 1,因为 10 = 3 × 3 + 1。它并不计算百分比。要计算百分比,应使用乘法:80 的 15% 是 0.15*80 = 12。
在表达式输入框中随便输入内容安全吗?
安全。输入内容会经过一个手写的白名单分词器和调度场算法求值器处理;它从不会传给 JavaScript 的 eval 或任何代码执行机制。任何超出固定白名单(数字、列出的函数、常数和运算符)的记号,都会导致整个表达式被直接拒绝。
参考文献
- ISO 80000-2:2019. Quantities and units — Part 2: Mathematics (standard notation for functions, logarithms and angular measure).
- Abramowitz M, Stegun IA (eds). Handbook of Mathematical Functions. National Bureau of Standards, 1964 (definitions of elementary transcendental functions).
- Weisstein, Eric W. "Precedence." MathWorld — A Wolfram Web Resource. mathworld.wolfram.com.