2. 操作方法の詳細

  …

目次

1章   Getting Started
2章   操作方法の詳細
  2.1  データ型の種類
  2.2  変数のスコープ
  2.3  コードブロックと総和関数 Σ
  2.4  コードブロックさらに
  2.5  繰り返し関数
  2.6  ログ機能
  2.7  行列式・固有値
  2.8  McCalとMcCal-liteの違いについて
  2.9  キーの説明
  2.10  免責事項

 

2.1 データ型の種類

McCalでは、整数、浮動小数点、複素数、文字列を扱えます。整数は64bit, 浮動小数点は倍精度で計算され、整数同士の演算は可能な限り整数で計算されますが、オーバーフローする時などは浮動小数点に自動的に変換されます。

条件判定は、評価値が0ならば「偽」0以外ならば「真」として扱われます。比較演算子は整数の0あるいは1を返します。

データ型の宣言は必要ありません。型は自動的に判定され適切な処理が行われるようになっています。

文字列の場合は、演算として加算(+)のみ可能で、文字列の連結が行われます。また文字列と数の加算は、数を文字列に変換した後、連結されます。

配列も扱えるようになっています。配列の要素は、上記の型のどれでも取ることができます。配列のサイズを予約したい場合は、"Dim" (dimension) 宣言文を使います。

次の例では、#input関数の引数に注目して下さい。引数を一つ取る関数ですが、文字列の加算で引数を合成しています。また変数'k'は、#times関数のカウンタ変数で、ループ毎に増えて行きます。

Dim @freq[10]
#times(10, { @freq[k]=#input("freq[" + k + "]を入力") }
freq[0]を入力 ? 100
freq[1]を入力 ? 120
freq[2]を入力 ? 

この例では、配列@freqの各要素に、順番に入力を促すことができます。

2.2 変数のスコープについて

変数のスコープについて、次の図で説明します。Version 3 からスコープの扱いが変更されましたので注意してください。

scope

McCalの電卓画面で使われる変数は、グローバル変数(Global variables)として扱います。 これがMcCal Viewerの変数タブで内容を確認できる変数です。

ユーザが定義した関数を呼び出すと、まず引数の値が求められます(上図では1, a+1)。次にその関数呼び出し毎に、関数内でのみ参照できるローカル変数のための領域が確保されます(上図において、Local Variables 1)そして関数定義での引数リストの変数a, bがこの領域内に確保され、最後に、その関数を呼び出した環境での引数の評価値がコピーされます(Call by Value)。関数内で、ローカル変数を参照・変更できるのは、その関数内だけになります。

Version 3より、関数内からグローバル変数にアクセスすることが可能になりました。アクセス制御子'@'を変数名の前に付けます。関数内でこれらの変数を変更した場合、実体はグローバル変数空間にありますので、グローバル変数を書き換えることが可能になります。また、'@'の後ろに続く英数字を変数名と見なしますので、グローバル変数空間では、単語を変数名として使えるようになります。

計算結果を返すには、Return文を使う方法が一般的です。アクセス修飾子'@'を用いてグローバル変数に書き込む方法もありますが、避けたほうが良いです。

Version 3より、前節で説明したコードブロックは、呼び出し元の変数名空間が使用されます。

第1.6章で説明した繰り返し関数の多くは、カウンタとして変数'k'を使います。Version 3から、この変数kは呼び出し元の変数空間に属すると見なされます。 変数kの値は、繰り返し関数は、ループを実行するたびに変数'k'を変更しますので、必要であれば、あらかじめ別の変数に値を退避して下さい。

[ページトップに戻る][MilimaCode HomePage]

2.3 コードブロックと総和関数 Σ

McCalは、関数呼び出し時に、ひとまとまりの手続き(コードブロックと呼んでいます)を渡すことができます。1章でloop関数を簡単に紹介しましたが、ここでは総和関数と反復関数を説明します。まずは、以下の様にキーを打ってください。

100 eval()

a ; Σ 1 →□ a →□ 1 ÷ k x2 eval()

sigma

(注意)ここでは100を評価した後、後置代入演算子を使っています。これで変数aに100が代入されます。

Σ関数は、引数を3個取りますが、一番目は、初期値、2番目が終了値です。清書部分から判るように、McCalの総和関数は、ローカル変数kをカウンタとして特別に扱います。また変数aを第二引数に置いていますので、aの評価値である100が、総和関数に渡されます。C言語などで一般的な「値引き渡し」で、McCalでもこれが標準ですが、 三番目の引数は、コードプロックと呼ばれる特殊な物です。

コードブロックとは、波括弧でプログラムコードの並び(ここでは1/k2)を括った物で、値を評価せずに計算式を関数に渡すことが出来る仕組みです。評価遅延ともよばれる手法です。総和関数が評価するべき式を柔軟に変更できます。また、コードブロックの中がセミコロンで区切られた複文の場合、最後の文の評価値の総和が計算されます。

sigma-euler

ところでこの無限級数は オイラーによって、1734年に、π2/6=1.644934066...に収束すると証明されています。変数aの値を1000に変えてみると、さらに近づくことがわかります。

1000 Hist eval()

sigma-1000

(注意)この例では、historyキーによって、過去に入力された式:

a ; Σ 1 →□ a →□ 1 ÷ k x2 eval()

が呼び出されています。

[ページトップに戻る][MilimaCode HomePage]

2.4 コードブロックさらに

McCalのユーザ関数呼び出しにおいて、ユーザ関数に与える引数は値渡しで行われます。JavaやCと似ているといえるでしょう。しかし、コードブロックの中の変数は、呼び出し時の値から変化していきます。

Version 3以降のMcCalでは、コードブロックの中の変数は、呼び出し元の変数が使われます。 テイラー展開を例にとって説明します。

taylor

上は、sin(x)を原点近傍でテイラー展開した式です。ここでは2n-1 (n=1, 2, 3...)次までテイラー展開し、数値計算を行うとします。n=4をもちいて任意のxに対してMcCalで計算するには、次のようになります。ただし、x=π/6としておいてから、計算するとします。

 n   ⇐   4   ;  x π ÷ 6 eval()
Σ 1  →□   n   →□   (   -   1   )   xy   k   +   1   →□   (   2   k   -   1   )   !   ×   x   xy   2   k   -   1  eval()

となり、sin(π/6) = 0.5(角度の単位はラジアン)ですから、かなり良い近似になっていることがわかります。

二番目に渡した引数'n'の値(4)がコピーされます。一方、コードブロック内で使われている変数 k, xは、呼び出しもと(電卓画面から直接呼び出した場合、グローバル変数)のk,xが使われます。値を変更した場合、その結果も反映されます。

注意するべき事としては、不用意にグローバル変数を書き換えると、呼び出し元の環境が変わることになり、危険です(サイドエフェクト)。上級者にとっては便利な機能ですが、初心者は注意して下さい。

[ページトップに戻る][MilimaCode HomePage]

 

2.5 繰り返し関数 (#repeat)

総和関数は、カウンタ変数kが1増える毎に式を計算し総和をとりましたが、繰り返し関数(#repeat)は、総和をとらずに、汎用的な繰り返し計算を実現します。

繰り返し関数は、5個の引数を取ります。初期値、終了値、{initializer}、{main code}、{finalizer}の順です。総和関数と似ていますが、{initializer}, {finalizer}が増えています。それぞれ、繰り返しの直前と直後に一度だけ実行されるコードを指定します。また{main code}の結果の総和は計算しません。繰り返し関数が返す値は、最後に評価された値、つまり{finalizer}を実行して得られる値です。

それぞれの引数は、次の様に清書されます。

Text Editor input: #repeat(start, end, {initializer}, {main}, {finalizer})

それでは例をあげてみましょう。フィボナッチ数は、次のような漸化式で定義されます。

ak+2 = ak+1 + ak, a0 = 0, a1 = 1

次の画面は50番目のフィボナッチ数を求めています。

repeat 2 →□ 50 →□ a 0 ; b 1 →□ c a b ; a b ; b c →□ c eval()

repeat-fibonacchi

同じ問題を配列を使って計算した例をあげておきます。最初に配列を宣言しています。

Dim a [ 51 ] 0 eval()

repeat 2 →□ 50 →□ a [ 0 ] = 0 ; a [ 1 ] = 1 ; →□ a [ k ] = a [ k - 1 ] + a [ k - 2 ] →□ a [ 50 ]

repeat-fibonacchi

[ページトップに戻る][MilimaCode HomePage]

 

2.6 ログ機能

Version 2より、計算結果、ユーザ入力などを記録する機能をつけました。CSV format のファイルとして記録され、メールの添付書類として転送することにより、パソコンのスプレッドシートプログラム(例 Microsoft Excel)に取り込めます。

eval() キーを押した時の評価式と評価結果が記録されます。マクロ内でPrint命令を使えば、文字列や計算結果も書き出せます。

記録を開始するには、メニューの中に"Log.."がありますので選択してください。Android ver.3以降のシステムでは破線縦棒のメニューバーをタップします。

log

ログ記録は、SD cardが利用できる機種ではSD card, それ以外では内部ストレージに保存します。ファイルフォーマットはCSV (comma separated values)、文字コードはUnicode、符号化はUTF-8あるいはUTF-16、コンマの代わりにタブを区切り記号として使えます。上の図では、オプションのUTF-16, TAB区切りを選択しています。オプションはお使いのスプレッドシートに応じて選んでください。たとえばMicrosoft Excel for Mac 2008では、UTF-16, TAB delimitedが一番簡単に取り込めました。

"Start Logging"ボタンでログ記録を開始します。記録を停めたい時は、ふたたび"Log.."メニューを開き、"Stop Logging"ボタンを選択します。この時、ただちにデータを転送するためにメールソフトを起動します。

CSV ファイルを添付できるメールクライアントのリストが表示されます。すくなくとも "Gmail"クライアントソフトの動作は確認しています。これでユーザが転送したいアカウントに送ってください。メールクライアントは適切に設定されている必要があります。

Print命令の出力は、コンマで区切るとスプレッドシートの別のセルに書き込まれます。たとえば、

Print a, b*c, "面積= ", r^(2)#pi 
Print "面積= " +  r^(2)#pi 

上の一番目の例では、"面積="と、r2πの計算結果が別のセルに、二番目の例では文字列として連結されて一つのセルに書き込まれます。

[ページトップに戻る][MilimaCode HomePage]

2.7 行列式・固有値

逆行列、行列式、固有値、固有ベクターの計算がサポートされました。

引数として渡す行列は、各要素が実数(整数または浮動小数点)で、正方行列である必要があります。現在、配列の要素数は1000個までに制限がかけてありますので、30X30 程度の行列の計算が可能です。 (Mx) ボタン(のシフトポジション)で現れるダイアログから選択可能です。

バージョン3.3より、複素数の固有値と固有ベクトルを求めることができます。

例:平面上で、X軸方向に1/2, Y軸方向に2倍にするスケーリングをおこなう行列の固有値と固有ベクトル

Dim a=[[0.5,0],[0,2]]
Print #mxEigVal(a)
▽ 0.5000  ▽ 2.0000  
Print #mxEigVec(a)
▽ 1.0000  ▽ 0  
▽ 0  ▽ 1.0000  

固有値は0.5と2です。固有ベクトルを計算する関数(#mxEigVec)は、2X2の行列を返しますが、縦のカラムがそれぞれの固有値に対応する固有ベクトルになっています。この例では、[1.0000, 0]と[0, 1.0000]が、それぞれ0.5, 2の固有値に対する固有ベクトルです。また、固有ベクトルを定数倍して得られるベクトルもまた固有ベクトルですので注意して下さい。

例:原点を中心に20°回転をおこなう行列の固有値と固有ベクトル

a=20; c=#cos(a); s=#sin(a)
Dim m=[[c, -s], [s, c]]
Print #mxEigVal(m)
▽ 0.9397 +0.3420i ▽ 0.9397 -0.3420i
Print #mxEigVec(m)
▽ -1.0000 ▽ -1.0000
▽ 0 +1.0000i ▽ 0 -1.0000i

実数の固有値は無い例で、複素数の固有値が二つあります。cosθ+isinθ, cosθーisinθ (θ=20). 複素数の固有値に対応するベクトルは、それぞれ[-1, i] と [-1, -i]です。

行列Mの、固有値,λ,と固有ベクトル, v, の定義は:

Mv = λv

ですから

Mv - λv = O

になるはずです。試してみます。
e = #mxEigVec(m)
v = #Usr.getCol(#mxEigVec(m), 0)
Print m*v - e[0]*v
▽ 0.0 ▽ 0.0

#Usr.getCol(m, n)は、行列mのn番目のカラムを取り出す関数で、”コードの例”セクションにソースコードを掲載しておきます。

次の関数eigentest(n)では、"Mv - λv = O" をもう少し大きな行列で計算しています。

Function #Usr.eigentest(n) {
 Dim d=[[ 1, 2, 3, 7,4], [2 ,2, 1,-4,-3],[-1,3,5, 7,5],[6,-2,4,8,1], [1,3,-7,5,-3]] 
 v= #mxEigVal(d) 
 e= #mxEigVec(d) 
 Println "==== Mv - λ*v ===="
 Println d*v- e[n]* #Usr.getCol(v,n) 
}

計算結果は n=2の時:

#Usr.eigentest(2)				
▽ ==== Mv - λ*v ====			
▽ -3.552713678800501E-15 +4.218847493575595E-15i	
▽ 8.881784197001252E-16 -3.552713678800501E-15i	
▽ -4.440892098500626E-15 +3.1086244689504383E-15i	
▽ -4.440892098500626E-15 -6.217248937900877E-15i	
▽ 2.6645352591003757E-15 -5.329070518200751E-15i

数字のフォーマットは設定から"そのまま"に設定してあります。計算誤差が10-14以下になっていることがわかります。

[ページトップに戻る][MilimaCode HomePage]

 

2.8 McCalとMcCal-liteの違いについて

McCalに存在し、McCal-liteに存在しない機能の一覧です。

2.9 キーの説明

主要なキーをブロックごとに説明します。

数字ブロック 画面下に数字キーを含む大型のキーが並んでいます

数字キー 0〜9および小数点
Exp

10の指数を入力できます。たとえば、23.4×10-2+0.5を入力したい場合、23.4 Exp -2+0.5と入力した後、 eval() キーを押すと、答えとして0.734を返します。テキスト表示は、23.4E-2 + 0.5です。

Ans 直前の計算結果を呼び出すことができます。テキスト表示は#ansです。複数の文をセミコロンで区切って一行として評価した場合、一つの文が終わる毎に返り値が更新されますので、注意が必要。
eval() 入力された式の評価を行い、結果を表示します。
+ − × ÷ 四則演算
π 円周率。テキスト表示は#pi です。
BS バックスペースキー。カーソルの直前の文字を消去します。式の修正に使います。

関数ブロック 画面中央に関数キーおよび特別な機能をもったスペシャルキーが縦4×横4行に並んでいます。

Shift シフト機能(各ボタンに黄色で表示)をよびだすためのボタン。トグル動作をしますので、オン状態('S-ON')でもう一度押すと解除できます。
( ) 括弧を用いて演算の優先順位を変更できます。
矢印

カーソルを移動します。矢印キーのシフト機能は、行の先頭 (|←) あるいは行の末端 (→|) にカーソルを移動させるジャンプキーです。

→□ 右上のこの矢印キーは、カーソルより後ろ方向に入力用ボックスを探し、選択します。入力用ボックスが無い場合、閉じ括弧あるいはコンマの次に位置に移動します。
Hist ヒストリーキー (History)。過去に入力した数式を呼び出せます。続けて押す事で、履歴を遡ることができます。シフト機能は、McCal Viewerを起動し、履歴の一覧表を表示します。
アイコン キーボードのアイコンを持つキーを押すと、ソフトウェアキーボードが現れます。McCalのボタンを使わずにソフトウェアキーボードから入力することも可能です。
変数に値を代入するための演算子。左辺は変数である必要があります。右辺を評価しその値を左辺の変数に代入します。シフト機能は後置型の代入演算子⇒です。左辺を評価して右辺の変数に値を代入します。
Mac ユーザ定義の式(マクロ)などをViewerを用いて呼び出した時、次回からこのキーを押すと同じ式が呼び出されます。何度も同じ処理を行う場合に便利です。
i 虚数単位(imaginary unit)。複素数はa⇐2+3iのように入力します。この場合、変数aに複素数2+3iが代入されます。
°' "

度分秒あるいは時分秒を入力します。例えば、東京麻布にある「日本緯経度原点」の経度である東経 139°44'28.8759"は、 139 °'" 44 °'" 28.8759 °'" と入力します。表示ウィンドウには、最初139°44°28.8759°と表示されます。内部的には、度分秒を度の浮動小数点、時分秒の場合は時間の浮動小数点として保持し、計算します。シフト機能は、反対に浮動小数点を度分秒(時分秒)に変換して表示する関数です。

hyp-

双曲線関数を入力するための補助キーです。この[hyp-]を押した後(表示が[h-ON]になる)、三角関数キーを押すと、それぞれの双曲線関数(sinh, cosh, tanh)を入力することができます。Shiftキーと組み合わせると逆双曲線関数(asinh, acosh, atanh)を入力できます。

sin cos tan 三種の三角関数。シフト機能は、逆関数のarcSine (#asin)など。複素数の引数もサポート(McCal-only)。
ln log10 対数関数。それぞれネイピア数 (e)、10を底とする対数関数。複素数の引数もサポート(McCal-only)。 シフト機能は、対応する指数関数で、複素数の引数もサポート(McCal-only)。
frac 分数関数。分子、分母の順で引数を取ります。
1/x 逆数。べき乗を使っています。
xy べき乗 (例)28-1は、 2 x y 8 →□ - 1 と押します。→□キーは、べき乗関数から出るために必要です。yが複素数の場合はサポートしていません。
x2 二乗。変数aの二乗を入力するには、  a  x2 の順に押します。
平方根(square root) 、複素数の引数もサポート(McCal-only)。
[AC] All Clear. 入力をすべて消去します。

設定ダイアログ McCalキーから設定ダイアログなどを呼び出すことができます。

(format) 数のフォーマットダイアログを表示します。
(区切り) 区切り記号入力のためのダイアログを表示
(Angle) 角度モード設定ダイアログ (Degree/Radian/Grad)の表示 (McV) McCal-Viewerを開始
(show) McCal-Viewerを開始して履歴タブを選択。
(cmplx) 複素数のための関数を入力するためのダイアログの表示
(radix) 基数変換の関数と、ビット演算の演算子のダイアログ/td>
(Mx) 行列演算のための関数のダイアログ

シフト位置に登録されている関数キーで、上記の表で説明されていないもの。

abs

絶対値をかえします。引数が複素数の場合、ガウス平面上での原点からの距離を返します。例 #abs(3+4i)は5.0を返す。

ex ネイピア数(オイラー数、自然対数の底)の指数関数。xは複素数も可(McCal-only)
10x 10の指数関数。
x! 階乗。xは整数である必要があります(ガンマ関数も参照)。McCalは、64bitの精度で整数演算を行いますが、21!ですでに64bitをオーバーフローしますので、xが21以上の場合、浮動小数点を返します。
x√ 引数のx乗根を返します。Javaの指数演算子(^(1/x))を利用して計算します。複素数はサポートしません。
3√ 引数の3乗根を返します。#cbrt (cubic root)
e ネイピア数(オイラー数、自然対数の底)を返します。
Γ(x) Γ関数(ガンマ関数)。xが自然数の時はΓ(x+1)=x!になります。xが大きくなるにつれて非常に早く返り値が大きくなります。#gammaがテキスト表示。
lnΓ(x) 上記Γ関数の対数(自然対数)を返します。
% 剰余演算子。x%yで、整数xを整数yで割った時の余(剰余)を返す。
mCn 組み合わせ(Combination)。#combi(m, n)がテキスト表示です。m, nは負でない整数。
mPn 順列(Permutation)。#perm(m, n)がテキスト表示です。m, nは負でない整数。
rand

0以上1以下の疑似乱数(浮動小数点)を返す。

max 引数のうち、大きい値を返す。引数の数は可変であり、配列を引数にとることができます。配列中の最大の要素の値を返します。
min 引数のうち、小さい方を返す。引数の数は可変であり、配列を引数にとることができます。配列中の最小の要素の値を返します。
round 引数を四捨五入して整数値を返す。
floor 引数と同じか超えない最も大きな整数値を返す。
ceil 引数と同じか超える、最も小さな整数値を返す。

The second key pad. Ver. 2より、2枚目のキーパッドが用意されました。スワイプによって切り替えます。

Func ユーザ定義関数を宣言します。
Σ 総和関数。説明を参照.
repeat 汎用繰り返し関数。説明を参照.
while 条件式が真の間、コードブロックを繰り返し実行する関数。
times 指定した回数だけコードブロックを実行する関数。
loop コードブロックの無限回実行。ただしループの最後で停止する。
Cancel 繰り返し関数やユーザ定義関数の実行をキャンセルする。
Dim 配列の宣言。
Break #loopからの脱出。#loop実行中のみ有効になる。
Print プリント命令。.
Prln 改行つきプリント命令。
input 引数の文字列を表示した後、ユーザの入力を待つ。入力を評価してその結果を返す。
getStr #inputと同じように引数の文字列を表示した後、ユーザの入力を待つ。入力を文字列としてそのまま返す。
if 条件分岐関数。 #if( condition, {then_文}, {else_文});
Conditional operators 整数の 1 (真) あるいは 0 (偽)をかえす。
Logical operators 論理的 AND, OR. ビット演算AND, OR, XORは、(radix)ダイアログを使って下さい。

[ページトップに戻る][MilimaCode HomePage]

2.10 免責事項

バグなどのソフトウェアの瑕疵については全力で除去しておりますが、もし発見された場合、ご一報いただければ幸いです。本ソフトウェアの使用により生じた損害、または第三者からのいかなる請求について、作者はその責任を負えませんので、あらかじめご了承ください。

 

[ページトップに戻る][MilimaCode HomePage]