対応する関数と定数
パーサーが受け付けるものをすべて以下に示します。これ以外のトークンは、安全のためすべて拒否されます。
| カテゴリー | 利用できるもの | 例 |
|---|---|---|
| 三角関数 | 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 |
| 2引数 | min(a, b), max(a, b) | max(3, 7) = 7 |
| 定数 | pi, e, tau | tau = 2 × 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になるような小さな丸め誤差は、浮動小数点演算に固有のものです。
この関数電卓とは?
関数電卓とは、基本的な四則演算を超えた数式、すなわち三角関数、対数、指数、根号、定数などを評価するものです。この電卓は式全体をテキストとして受け取り、標準的な演算順序、すなわち括弧、指数、乗算・除算・剰余、加算・減算の順(PEMDAS/BODMAS)を適用します。
対応する関数:sin、cos、tanとその逆関数asin、acos、atan。sqrt(平方根)とcbrt(立方根)。abs(絶対値)。ln(自然対数)、log(常用対数)、log2(底2の対数)、exp(eのべき乗)。floor、ceil、round。2引数の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。関数の引数は括弧内に書きます。乗算は*を使って明示的に書く必要があります(2piではなく2*piと書きます)。
- 三角関数を評価する前に、角度の単位(ラジアンまたは度)を選びます。度モードのsin(30)は0.5ですが、ラジアンモードでは約−0.988です。
- 結果を確認します。非常に大きい値や小さい値は科学的なe表記で表示されます。
- 結果が表示されない場合は、括弧の対応が取れているか、関数名が正しいか、暗黙の乗算がないかを確認してください。ホワイトリスト方式のパーサーは、認識できないものをすべて拒否します。
演算順序(PEMDAS)
式は次の順序で評価されます:括弧(内側から先に)、関数の適用、べき乗^(右結合)、単項マイナス、*と/と%を左から右へ、そして+と−を左から右へ。これは、数学で教えられる標準的なPEMDAS/BODMASの慣例と一致します。
計算例:ラジアンモードでのsin(pi/6) + sqrt(16) * 2^3。ステップ1(括弧と関数):pi/6 = 0.523599、sin(0.523599) = 0.5。sqrt(16) = 4。ステップ2(指数):2^3 = 8。ステップ3(加算より先に乗算):4 * 8 = 32。ステップ4(加算):0.5 + 32 = 32.5。
特に注意すべき2つの慣例があります。べき乗は右結合なので、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。2引数のminとmax。定数pi、e、tau。そして演算子+ − * / % ^と括弧です。これ以外のものは、ホワイトリスト方式のパーサーによって拒否されます。
度とラジアンはどうやって切り替えますか?
角度単位の選択欄を使います。度モードでは、sin、cos、tanは引数を度として解釈し、逆関数は度で結果を返します。ラジアンモードでは、数学的な既定値であるラジアンがすべてに使われます。同じ式でも2つのモードで異なる結果になります。例えば、sin(30)は度では0.5ですが、ラジアンでは約−0.988です。
この電卓はどのような演算順序を使っていますか?
標準的なPEMDASの慣例です。括弧が先、次に関数、次にべき乗(右結合)、次に単項マイナス、次に乗算・除算・剰余を左から右へ、最後に加算・減算を左から右へ処理します。したがって、1 + 2 * 3^2 = 1 + 2 * 9 = 19であり、2^3^2 = 2^9 = 512です。
式を入力しても結果が表示されないのはなぜですか?
パーサーはホワイトリストに載ったトークンしか受け付けません。よくある原因は、暗黙の乗算(2piではなく2*piと書く必要があります)、括弧の対応が取れていないこと、未知の関数名(対応する関数は固定リストです)、負の数のsqrtや無限大になる除算のような無効な計算、あるいは式が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.