最強の電卓を作るプロジェクトを開始しました。

過去のブログのアーカイブ
この記事は前身のブログのアーカイブを引き継いだものです. 画像が正しく表示できないなど,コンテンツの表示に問題がある恐れがあります.

実はこの前、暗号理論という授業のために多機能電卓を購入したのですが、あまりにもの高性能っぷりに感動しまして、せっかくだからパソコン版多機能電卓を作ろうということでプロジェクトを作ってみました。

目標

世の中にある数式を全て計算できるようにする。できるだけ高精度な結果を出すために分数や変数等を含む計算に対応。もちろん全て実装なので行列や複素数等にも対応させるつもりです。[mathjax]

Webでも試せます

Webで次々と計算する場合はコンソール版を
http://app.yryr.me/test/calc-console.html
1つの式の解析結果等を表示させるモードはこちら
http://app.yryr.me/test/calc-console.html
普通の表記の他にLISP表記にも対応させています。LISPの機能が使えるわけではないです
http://app.yryr.me/test/calc-console-lisp.html

使い方一例

自然な入力で計算させることができます。独自の入力方法等は特にないと思います。

変数を使用する

変数をそのまま使用して計算をすることができます。例えば

5x + 3
>> 5x + 3

>>の後ろは結果を表しています。xの内容が不明な場合、xはそのまま結果として現れます。しかしxの内容をあらかじめ指定してあげると…

x = 2
5x + 3
>> 13

きちんとxの内容が代入されて計算されました。

x^2 + 5x + 10 の微分

基本的に合成関数以外は微分もスムーズにできます。合成関数に関しては完全に度合いによります。まあ基本的には問題ないはず。

(x^2 + 58 10)'
(diff x (+ (^ x 2) (* 8 x) 10))

微分はdiff関数、または’演算子を使って行います。diff関数を使用する場合は第1引数に何で微分するか、第2引数に式を指定します。

x log(x)の積分

$$ \int {(x log(x)})dx $$とかの積分は部分積分法を使用して結果を出します。このようにある程度シンプルな式の積分なら問題なくできると思います。置換積分法に関しては正直怪しい。
intg-e-log-e

intg(x, x * log(e, x) )
(intg x (* x (log e x)))

積分はintg関数を使用して行います。第1引数に何で積分をするか。第2引数に式を指定します。
logは(底, 式) という形で指定します。底にeを指定した場合、それは変数ではなく自然対数として扱われます。

現在の状況

気がついたところから順に実装していってるので割とガバガバです。一部実装されていなかったり、正常な結果が出てこなかったりするので結果を信用しないでください。
もしおかしな点があったらコメントに報告、または連絡(Twitter: @sharo0331)していただけるとありがたいです。

初めてGitを使ってソース管理

開発言語はC#で、世の中にある基本的な計算を全て実装する気でやってるのでともかくソースコードが大量に。あと私だけではキツイものがあるので初めてGitを使ってソース管理をしてみることにしました。
https://github.com/sharoron/FuncCalc/
基本的にdevelopブランチでコミットしています。masterにマージすることはあんまり多くないかも。
割とぐちゃぐちゃなソースコードですが、連絡していただけるとどの処理がどこにあるのか回答します。もし何か気になる点があって、協力していただけるとなんか奢るのでお願いします。