逆ポーランド表記電卓JavaScript

逆ポーランド表記(後置表記)の電卓です。 例えば、(1+2)*(3-4) は 1 2 + 3 4 - * と書きます。 この表記法は多少読み難いのが欠点ですが、ある意味合理的なので、括弧が不要、処理が楽などの利点があります。 Stack: もしくは Formula: の欄に計算式を書いて Eval を押すと、Stack: の欄に計算結果が表示されます。 詳しい仕様については、こちらを参照してください。

Stack:

Formula:






CAPS


仕様

下記の演算子以外の文字列で、.0123456789 のいずれかの文字で始まるもの、もしくはその前に - が付いたものは数値とみなされ、それ以外で末尾が = でないものは変数名とみなされます。 式の入力の際には、数値、変数名および演算子の間を、空白もしくは改行(スタックに直接書き込む時)で区切っておいてください。 なお、これらの仕様は、作者の気紛れによってどんどん変わっていくものと思われます。

演算子表:
名称表記形式説明
算術関数sqrt exp log sin cos tan asin acos atan floor round ceil absn1 op n1 を op(n1) の値で置き換える。 n1 が数値でない場合、n1 op を連結した形となる。 (例) 4 sqrt ⇒ 2
二項演算+ - * / % pow max minn2 n1 op n2 n1 を (n2)op(n1) または op(n2,n1) の結果で置き換える。 n2 n1 が数値でない場合、n2 n1 op を連結した形となる。 (例) 2 3 pow ⇒ 8
代入=f3 v2 f1 = 式 f3 中の変数 v2 を 式 f1 に置き換えて再び評価する。 (例) x x * x 7 = ⇒ 49
級数sumf4 v3 n2 n1 sum 式 f4 中の変数 v3 を n2 から n1 まで変化させた総和を求める。 ただし、n2>n1 の場合、和は 0 となる。 内部的には、f4 v3 n2 = f4 v3 n2+1 n1 sum + に置き換えて再び評価する。 n2 n1 が数値でない場合、f4 v3 n2 n1 sum を連結した形となる。 (例) n n 1 10 sum ⇒ 55
乗積prodf4 v3 n2 n1 prod 式 f4 中の変数 v3 を n2 から n1 まで変化させた乗積を求める。 ただし、n2>n1 の場合、積は 1 となる。 内部的には、f4 v3 n2 = f4 v3 n2+1 n1 prod * に置き換えて再び評価する。 n2 n1 が数値でない場合、f4 v3 n2 n1 prod を連結した形となる。 (例) n n 1 10 prod ⇒ 3628800
反復forf5 v4 n3 n2 o1# for 式 f5 中の変数 v4 を n3 から n2 まで変化させて、各々に演算 o1# eval を施す。 ただし、n3>n2 の場合、スタックには何も積まれない。 内部的には、f5 v4 n3 = o1# eval f5 v4 n3+1 n2 o1# for に置き換えて再び評価する。 n3 n2 が数値でない場合、f5 v4 n3 n2 o1# for を連結した形となる。 (例) n n 1 10 dup# *# # for ⇒ 1 4 9 16 25 36 49 64 81 100
スタック操作swaps2 s1 swaps2 と s1 を入れ替える。 (例) a b swap ⇒ b a
dups1 dups1 を再びスタックに積む。 (例) a dup ⇒ a a
dels1 dels1 を削除する。 (例) a b del ⇒ a
tops1 tops1 をスタックの先頭に移動する。
clearclearスタックの内容を全て消去する。
分離splits1 splits1 の末尾の未解決演算子を削除して、再び評価する。
連結#s2 s1 #s2 s1 # を連結した形でスタックに積む。
多重連結{ }{ ... } 対応する { } 間の各要素の末尾に # を付加し、# 演算子で連結する。 (例) { 1 2 + } ⇒ 1# 2# # +# #
評価evals1# eval s1# 中の各要素の末尾の # および # 演算子を削除して、再び評価する。 (例) 1 2 # +# # eval ⇒ 3
JavaScriptjavas1 java s1 のJavaScript式を評価(with (Math) を掛けてある)して、その結果を再び評価する。 なお、スタックの文字列は、内部変数 s5 s4 s3 s2 s1 で得られる。 (例) random() java
定義変数名=s1# op= 以後文字列 op が出現した時に、s1# eval に置き換えて再び評価するようにする。 スタック中の定義式を削除するか、何か演算を施して op= を末尾以外にすれば、定義は無効となる。 多重定義の場合、以前の定義式はそのままスタックに残るが、例えば a という変数の定義式をまとめて消去したい場合、del# a== top clear# a=== top とすればよい。 なお、x 1 + x= の様な再帰的な定義をした場合、後で置き換えの際に無限ループに陥る事に注意。


インデックスページに戻る

Copyright (C) 1996-99, 2003 by H. Tanuma. tanuma_hideki@hotmail.com