RPN関数電卓

ice458 / 2024年06月29日 — 電子工作・電卓

逆ポーランド記法 (RPN) で入力する自作の関数電卓。 二進浮動小数点数による誤差を避けるため18桁の十進浮動小数点演算ライブラリを自作して演算コアとし、 PIC32CM Lx (Arm Cortex-M23) と動的クロック制御により単4電池1本・待機1mW / 計算時9mWで動作する。

仕様

RPN (逆ポーランド記法) とは

演算子を被演算子のに置く記法。中置記法の電卓が [1][+][2][=] と入力するのに対し、 RPN電卓では [1][Enter][2][+] と入力する。 実装はスタックマシンそのもので、数値入力はプッシュ、演算子は「2値ポップ → 演算 → 結果をプッシュ」に対応する。 構文解析器も優先順位表も不要で、限られた資源上でも実装できる。

括弧と「=」が不要になるため、式が複雑になるほど打鍵数が減る ((1+2)×(3−4) は中置11打鍵に対しRPNは9打鍵)。 さらに「1に2を足して、3から4を引いて、その二つを掛ける」という日本語の語順のまま入力でき、 式全体を先に組み立てる必要がない点が実用上大きい。スタック全体のロールや任意段のスワップも備える。

自作ならではの機能

電子回路でよく使う演算を専用キーとして持たせている。 並列抵抗演算 (x×y)÷(x+y) や、RC・LCフィルタのカットオフ周波数を直接求める関数を実装した。

電源制御回路

市販電卓と同じ「キー押下で電源ON、時間経過や特定キーでOFF」を実現するため、PMOSを電源スイッチとし、 そのゲート電圧をモーメンタリスイッチとNMOSのORで制御する。 キー押下でDCDCが起動 → マイコンが起動直後に power_en をHighにして自己保持し、OFF時はLowに戻して回路全体の電源を落とす。 単4アルカリ1本では0.9V程度でPMOSをONさせる必要があるため、Vth = −0.3〜−0.9V の AO3415A を採用した。

二進浮動小数点数の問題

float / double は数値を二進で表現するため、十進で有限桁の値が二進では循環小数となる。 十進の0.1は二進で 0.000110011001100… と無限に続き、有限桁では正確に表現できない。 結果として入力値と内部値に差が生じ、連続演算では誤差が累積する (=(100.01-100)*100-1 が0にならないExcelの例が有名)。 電卓としては「表示した値がそのまま内部値である」ことが要求されるため、この差は許容できない。

十進浮動小数点演算ライブラリ

解決策として、内部演算も十進で行う。二進化十進数 (BCD) は各桁を十進数として直接保持するため、 0.1のような値を誤差なく表現できる (十進で循環する値については同じ問題が残る)。 浮動小数点数を次の構造体で表現した (下は3桁の例、実際は18桁)。

typedef struct { // [0][1,0,0][0] → 1.0E0 // [0][3,1,4][-1] → 3.14E-1 // [1][3,1,4][2] → -3.14E2 uint8_t sign; // 符号 uint8_t mantissa[3]; // 仮数部 int16_t exponent; // 指数部 } df_t;

四則演算は筆算を基本に実装する。四則演算が揃えば、 テイラー展開やニュートン法によって三角関数・対数・平方根などの数学関数も構成できる。 この18桁ライブラリを電卓のコアとした。

開発の経緯

後継機として、演算コアをIntel® Decimal Floating-Point Math Library (decimal128 / 34桁) に、 MCUをRP2350に置き換えたRPN35を頒布している (別紙参照)。

RPN関数電卓 — 図とリンク
電源回りの回路図
電源回りの回路図。SW29 (POWER) で起動し、マイコンが power_en をHighにしてQ1経由でPMOS (AO3415A) のゲートを保持する
プロジェクトページのQRコード
プロジェクトページ
ice458.github.io/project-18775/
設計データのQRコード
設計データ (GitHub)
github.com/ice458/RPN_Scientific_Calc
詳細解説同人誌のQRコード
詳細解説 (同人誌)
ice458.booth.pm/items/7218610