piapia123
ja

数式の評価

Web

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

1 行に 1 式を書くと、行ごとに結果を返します。`+ - * / %` と `^`(べき乗)、括弧と単項の符号、定数 `pi` と `e`、そして `sqrt` `abs` `round` `floor` `ceil` `exp` `log` `log2` `log10` `min` `max` `pow` に対応します。 ⚠️ このツールは `eval` を使いません。潔癖ではなく理由があります。`eval` で作ると、入力欄の中身は現在のページの環境で実行されます。`fetch("/x")` は本当に送信され、`location="https://…"` は本当に遷移し、このページには他にもデータがあります。よくある対処の「数字と演算子だけを通す正規表現」は漏れやすいことでも知られています。そこで字句解析・優先順位・評価をすべて自前で書き(操車場アルゴリズムで後置記法に直してから評価)、一覧にない文字は一切受け付けません。 先に知っておきたい点が二つ。`^` はべき乗であってビット単位の排他的論理和ではなく(ビット演算は専用のツールをお使いください)、しかも右結合なので `2^3^2` は 64 ではなく 512 です。三角関数は入力と出力を一緒に変換します。片方だけ変えると `sin(asin(0.5))` が 0.5 でなくなります。

機能

  • 四則演算・剰余・べき乗と括弧、単項の符号(`-3`、`2 * -3`、`2^-1` に対応)
  • ⚠️ `^` はべき乗で右結合:`2^3^2` は 512。ビット単位の排他的論理和はビット演算ツールへ
  • 定数 `pi` と `e`、関数は sqrt / abs / round / floor / ceil / exp / log / log2 / log10 / min / max / pow
  • 三角関数はラジアンと度を切り替えられ、入力と出力が一緒に変わります(度で `sin(30)` は 0.5)
  • 変数を定義できます。変数欄に `a=3` と書けば式から使え、後ろの定義は前の定義を参照できます
  • 小数点以下の桁を指定でき、元の精度は別の行に表示します
  • 1 行に 1 式なので、まとめて一列を計算できます
  • ⚠️ 評価器は自前で、`eval` は使いません。定数表と関数表にない名前はすべて拒否します
  • 処理はすべてブラウザ内で完結し、式は外へ出ません

使い方

  1. 1 行に 1 式を貼り付けます
  2. 度を使うなら「角度の単位」を切り替え、中間結果を使い回すなら変数を定義します
  3. 丸めたいときは桁数を指定します。元の値は別の行に出ます
  4. 結果は 1 行ずつ、またはまとめてコピーできます

よくある質問

eval を使わないことが特徴になるのはなぜですか
このツールを eval で作るのは簡単で、しかも入力欄の中身を現在のページのコードとして実行してしまいます。`fetch("/x")` は実際に送信され、`location="https://…"` は遷移し、`constructor.constructor("…")()` はほとんどのブラックリストを回避します。よくある緩和策の「数字と演算子だけを許す正規表現」も厳密ではなく、しかも失敗は静かです。そこで字句解析・優先順位・評価をすべて書き下しました。任意の関数は支えられないという代償と引き換えに、数字・演算子・括弧・一覧の関数名以外は何も実行されないという保証を得ています。
`2^-1` のようにべき乗の右側にマイナスがあっても計算できますか
できます。単項のマイナスは最も優先順位が高いので、`2^-1` は `2^(-1)` と解釈され 0.5 になります。先頭のマイナスを「-1 を掛ける」に置き換える実装は、まさにこの位置で破綻します。そこでここでは独立した単項演算子を使っています。
変数の使い方を教えてください
変数欄に 1 行 1 定義で `a=3` のように書きます。右辺は式でもよく(`b=a*3`)、後ろの定義から前の定義を参照できます。`a=2` の次の行に `b=a*3` と書けます。式の中の変数名は大文字小文字を区別しませんが、定数が優先されます。`pi=3` と定義しても本当の π は隠れません。
`1/0` が Infinity にならないのはなぜですか
この場面で Infinity はほぼ常に「計算が間違っている」合図で、求めている答えではないからです。ゼロ除算、負の数の平方根、0 以下を渡した log のどれでも出ますが、原因はそれぞれ別です。Infinity をそのまま返すと、どこが誤りなのかを自分で推測することになります。そこで三つをまとめて「無限または未定義」として報告し、よくある原因を並べて示します。

関連ツール