1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Windows標準電卓では扱いづらい数式を、C# + xFunc でどう実装しているか(複素数・三角関数・置換処理の工夫)

Posted at

はじめに

Windows 10/11 に標準搭載されている電卓ソフトはとても便利ですが、
実際の業務や学習現場では複素数・三角関数・対数・統計など
より複雑な式を扱うケースも多くあります。

本記事では、私がC#/WPFで関数電卓ソフトを実装する際に、

  • 複素数の表記揺れをどう内部表現に変換しているか
  • xFunc.Mathを使った式解析のコツ
  • Windows標準電卓との演算仕様の違い
  • 三角関数の度数法/弧度法切替の実装ポイント

といった実装寄りの知見をまとめます。

※記事内では私が開発している関数電卓ソフト(S-Calc)を例に説明しますが、
内容は任意のC#電卓ソフトで応用可能な実装手法です。


1. xFunc.Mathを採用した理由

C#で電卓ソフトを開発するとき、自分で構文解析器を作成する方法もありますが、
今回は次の理由でxFunc.Mathを採用しました。

  • 四則演算・三角関数・対数・統計・複素数などを包括的にサポート
  • パース → 評価までの流れがシンプルに書ける
  • ExpressionTreeが扱いやすい
  • .NET 8 + WPFの環境でも安定動作する

特に複素数三角関数の入れ子などの評価を自前実装するのは手間なので、
電卓ソフトの開発効率が大きく向上しました。


2. 複素数の表記揺れを統一する実装

ユーザは複素数を以下のように入力する傾向があります:

2i + 3i
-1 + 2i
sqrt(-5)
3 + i

しかし、xFunc.Methの入力仕様では、

3 + 2*i

のようにiの前に係数を明示する必要があります。

そのため、私のソフトではxFuncに渡す前に
次のような置換処理を行っています:

// "3i" → "3*i"
expression = Regex.Replace(expression, @"(\d+)i", "$1*i");

// "+i" → "+1*i"
expression = Regex.Replace(expression, @"\+i", "+1*i");

// "-i" → "-1*i"
expression = Regex.Replace(expression, @"-i", "-1*i");

この処理により、ユーザは電卓で一般的な複素数入力ができ、
内部では正確な数式として評価できます。

3. 三角関数(度数法・弧度法)の切り替え

xFuncは内部的に全て弧度法(radian)で演算します。

そのため、次のように変換しています:

double ToRadian(double degree) => degree * Math.PI / 180.0;
double ToDegree(double rad)    => rad    * 180.0 / Math.PI;

ユーザが「sin(30)」と入力した場合:

UI設定がDegree → xFuncに渡す前にradianに変換
UI設定がRadian → そのまま評価

また、逆三角関数(asin, acos, atan)では
xFuncの返す値はradianなので、必要に応じてdegreeに戻します。

image.png

image.png

4. Windows電卓との演算仕様の違い(技術的観点)

特に誤解されがちですが、Windows電卓は
「関数電卓の実装例」ではあっても、数式パーサではありません。

例えば:

  • 演算子の結合規則

    • 三角関数の入れ子
    • 複素数を含む式
    • iの扱い
    • πの扱い

など、評価規則が明確な構文仕様に基づいて厳密に評価するため、
複雑な式でも一貫性のある結果が得られます。

例:

var processor = new Processor();
var result = processor.Solve("sin(log(30 + pi/3))");

これはWindows電卓では扱いづらい式です。

5. 実際に評価してみた例(複素数を含む)

以下のような式も安定して評価できます。

image.png

Windows標準電卓では複素数演算をサポートしないため、
このような式の評価は難しいですが、xFuncを使うと非常に簡潔です。

6. 実装全体の流れ

まとめると、電卓ソフトの内部では次のような流れになっています:

  • ユーザの式を受け付ける
  • 複素数表現などを正規化
  • 三角関数の設定(Degree/Radian)を反映
  • xFuncでExpressionTreeを生成
  • 評価結果をUIに返す
  • 複素数はa+bi形式に整形して表示

このように処理を分離することで、
実装の見通しが良くなり、拡張もしやすくなりました。

おわりに

本記事では、C#とxFunc.Mathを使って
複雑な数式を扱う関数電卓ソフトを実装する際の実践的なテクニックを紹介しました。

  • 複素数表記の揺れを吸収する置換処理
  • 三角関数の度数法/弧度法対応
  • xFuncの構文木ベースの評価
  • Windows標準電卓との仕様差

といったポイントは、
これから電卓ソフトを作る方にも役に立つはずです。

質問やフィードバックがあれば気軽にコメントください。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?