fx-9860GII への移植 - 厄介な 旧来の命令

2015/01/12 追記
2017/06/29 更新


fx-5800P から fx-9860GII への移植

5800と9860、外観 
fx-9860GIIfx-5800P


これまで、fx-5800P のCasio Basicで作ったプログラムを fx-9860GII へ移植してきて、留意点がだいたい分かってきました。以下の項目以外は、ほぼコンパチと思ってよさそうです。


1) Getkey
キーコードはハードウェア依存するのでキーコードさえ変更すれば、Getkey コマンド自体の動作は同じなので移植に問題なし。
 ⇒ Casio Basic コマンドリファレンス - Getkey

2) Locate
Locate コマンドの動作は同じで fx-5800P からそのまま移植可能。fx-9860GII が持つ広い画面に合わせて最適化する場合は、引数を変更すれば良い。
 ⇒ Casio Basic コマンドリファレンス - Locate

3) Cls
fx-5800P 搭載 Casio Basic の Cls は、fx-9860GII では ClrText に相当する。機能は全く同じ。内部カーソル行のリセット機能まで同じ。
 ⇒ Casio Basic コマンドリファレンス - Cls


4) 配列変数
fx-5800P 搭載 Casio Basic の配列変数は、fx-9860GII の Caso Basicには含まれていないため、代わりに行列を使えば良い。


5) ◢ (出力)命令
出力動作後、一時停止状態の際、- DISP - と表示される。その表示行は完全に占拠されるためプログラムで使えなくなる。今のところ - DISP - の表示を止める方法が見つかっていない。fx-5800P で 命令を使った画面構成は、fx-9860GIIでは崩れてしまう。画面構成を壊したくないなら、 命令を使わずに Locate を使い、さらに以下のような [EXE] キー待ちのコード(2行)加えると、 命令と同様に一時停止し  [EXE] キーでプログラムを先に進めるようにできる。

Locate X,Y,"HogeHoge"
Do
LpWhile Getkey≠31



6) " " (出力)命令
fx-9860GII 搭載 Casio Basic の " " (出力)命令は、fx-5800P とは別物といって良く、私はプログラムでは使えないと思う。
以下の2行のコードを、fx-5800P と fx-9860GII の両方で走らすと、その違いが分かるだろう。

Locate 10,1,"RIGHT"
"LEFT"


fx-5800P での出力は、
LEFT     RIGHT

fx-9860GIIでの出力は
LEFT

上の2行のコードの1行目と2行目を入れ替えれば、fx-5800P と fx-9860GII は同じ表示結果になる。

fx-9860II 搭載の Casio Basic の " " (出力)命令は、チョット我が強く、1行丸々自分のために占拠する。◢ (出力)命令も1行丸々占拠するので、このあたりは同じ。fx-9860GII の Casio Basic はマイナーバージョンアップしており、その際に旧来の命令の仕様が変わったと思われる。

[追記]: CFX-9850GC (PLUS は付かない)、PRIZM fx-CG10 (fx-CG20と同じのUS版) でも fx-9860GII と同じ動作とのこと。従って、fx-5800P だけが独自のチューニングを行っていると思われる。


7) ?→ (入力)命令
我の強い " "(出力)命令の性格を引きづり、fx-9860GII では使いにくいものになっている。
上記の" "(入力)命令の違いを示すコードと同様にして、以下を fx-5800P と fx-9860GII で動作させると、違いが分かる。

Locate 10,1,"RIGHT"
"INPUT"?→A


fx-5800Pでの出力は、
INPUT?   RIGHT
[入力桁]

fx-9860GIIでの出力は、
INPUT?
「入力桁]

RIGHT が出力される前提で書いた fx-5800P のコードは、そのまま fx-9860GII では使えない。
RIGHT 表示を右側に残して INPUT? と表示させ、1行下が入力行となるのがfx-5800P の動作だが、fx-9860GII では頑固な " " 出力に占拠された1行目に RIGHT を表示させた状態で入力させることは不可能(と思います)。


8) ?(入力)命令
fx-5800P では、?記号単独で入力命令として使えるが、fx-9860GII ではこれが使えない。

fx-5800P では、以下のコードが書ける。

"INPUT"?A

すると、予め A に代入されている値が表示される。これの良いところは、プログラムを使っていて A の値を変更する必要が無い場合は、数値入力せずに [EXE] キーを押すだけで入力が確定するので、入力の手間が省ける。

fx-9860GII では?に続いて → (代入命令) が必要であり、必ず数値入力をしないと [EXE] で確定できない。

'INPUT"?→A

なお fx-5800P でも上記 8) で示したように、この記法は可能であり、?(入力)命令に柔軟性がある。fx-FD10 Pro でもこの記法が可能なようである。


9) 関数
関数の ( ) の扱いが変更されている。fx-5800P では関数の後に ( が必要なので入力時に ( が自動的に付加される。fx-9860GII では入力時に ( が付かず代わりにスペースが入るように変更されている。但し ( ) を付けても問題なく動作するので fx-5800P からの移植性には影響しない。

しかし、fx-9860GII では関数入力時に ( が自動的に付かないので、計算の優先度については、より注意が必要。例えば、

fx-5800P での

Int(log(X)+1)→G ・・・(1)

は、fx-9860GII でそのまま使える。

fx-5800P で Int を入力すると Int( と表示されますが、fx-9860GII では Int + [スペース] と表示され、以下のように ( ) なしでの記述が可能で、エラー無しに動作する。

log X

sin X

Int log X +1→G ・・・(2)
 
(1) と 式 (2) は異なる結果を与えることに注意が必要だ。

(2)を式 (1) と同じ結果になるように書き換えると、

Int (log X) + 1 → G

となる。

式(1)と(2) が異なる結果を与える原因は、Int 関数が及ぶ範囲が異なっているためだ。つまり  fx-9860GII で関数を使う際には、計算の優先度と順序をよく考えてなくてはいけない。入力時に ( ) を付けなくて良い仕様は、数式通り入力の機能を Casio Basic にそのまま適用したことによると推察されるが、プログラミングの立場から見れば改悪だと思う。fx-5800P の括弧付きの仕様に戻すべきだ。[2017/06/29 更新]

(1)と同じにするには、

Int (log X +1)→G

とする。



fx-5800P から fx-9860GII に Casio Basic プログラムを移植する際、同一の動作をしない命令/コマンドをリストアップしたが、その中でも fx-9860GII 搭載 Caso Basic の " " (出力)命令は、完全互換の動作にするには、旧来の命令を使わずに Basic コマンドのみで互換動作を実現すればなんとかなりますが、fx-5800P からの移植の際に大幅にコードを書き直さなければならないケースがあります (経験済みです)。

これで苦労するくらいなら、" " (出力)命令を使わず、当ブログオリジナルの汎用サブルーチンである 入力ボックス 2.1G (fx-9860GII 専用) を使って入力部分を書き直す方が楽になることもあり(経験済み)、お勧めです。[2017/06/29 更新]

fx-5800P 搭載 Casio Basic は旧来の入出力命令とBasic準拠命令の折り合いがまだ良いのですが、fx-9860GII 搭載のマイナーバージョンアップした Casio Basic は旧来の入出力命令が使いにくくなっています。

旧来の入出力命令は fx-5800P でも柔軟だとは言えないのですが、fx-9860GII でさらに柔軟性が損なわれています。Casio Basic プログラムを書く時は、旧来の入出力命令を使わない方が良いのではないかと、私は思います。

Caso Basic進化に伴って旧来の命令を軽視する方向性が心配されますが、一方で 最新機種 fx-FD10 Pro では、単独の?(入力)命令が復活しています(マニュアルを読む限り)。旧来から慣れ親しんだ命令を多用するユーザーが多いのかも知れず、そのユーザーの利便性に配慮した復活かも知れません。

Basic準拠のコマンドについては、If 文、Do / While / For 文、その他制御命令や、電卓の表示方法を指定する ENG / Norm / FIX コマンドなど互換性はあるようです。




応援クリックをお願いします。励みになるので...
にほんブログ村 IT技術ブログ 開発言語へ


 

keywords: fx-5800P、fx-9860GIICasioBasicプログラム関数電卓

リンク集 | ブログ内マップ


テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-9860GII グラフィックス - モンテカルロ法

2015/02/16
2015/02/17 修正
2015/02/22 追記
2015/02/28 追記

fx-9860GII のCasio Basic でグラフィックス表示のプログラムを作ってみようと、色々なコマンドを試行錯誤して試しています。先ずは第一段階として簡単なプログラムを作ってみました。

以前モンテカルロ法による円周率:π を計算するプログラムを fx-5800P で作ったので、今回はこれにグラフィックス表示を追加したプログラムを fx-9860GII で作ってみることにします。
 ⇒ 海外コミュニティー(UCF)での近況

fx-5800P でのモンテカルロ法のプログラム
0→I:0→O
Lbl 1
Ran#2+Ran#2<1⇒Isz I
Isz O
Locate 1,1,O
Locate 1,2,4I÷O
Getkey=0⇒Goto 1


※ 上記エントリーのコメント欄での sentaro様のご指摘に基づき変更しています。


さて、このコンテカルロ法は、2 x 2 の正方形に内接する半径 1 の円を描いておき、その正方形内にランダムに点を打ってゆく時、正方形の中の点の数と円内の点の数から、円周率を求めようと言う考え方です。

 ・[正方形の面積] = 2 × 2 = 4
 ・[円の面積] = 1 × 1 × π = π
なので、
 [正方形の面積] : [円の面積] = 4:π
となります。

これから、
 π = 4 × [円の面積] / [正方形の面積]
となって、円周率の計算ができます。

ところで、ランダムに点を打ってゆくと、円内の点の数(I) が円の面積、正方形内の点の数(O) が正方形の面積としても良いので、円周率:π は以下のようにして求められます。
 π = 4I ÷ O

上のプログラムは、この理屈で(実際は円の1/4 しか使っていませんが...)計算しています。



そこで、今回は同じ理屈で、正方形と内接円に実際にランダムに点を打ってゆく様子をグラフィックス表示しながら、πの計算値がどのように変化してゆくのかを表示するプログラムを、fx-9860GII で作ってみました。但し円全体を使うようにグラフィックスを描画します(円周率の計算は同じです)。

先ずは、プログラムを示します。

プログラム名: MONTECAR
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow -2.8,1.3,0,-1.0087,1.0087,0

0→I:0→O
Circle 0,0,1
Text 1,3,"C="
Text 7,1,"π="
Text 51,3,"(-):Stop"
Text 58,5,"AC:Quit"

Lbl 1

1-2Ran# →X
1-2Ran# →Y
Plot X,Y
X2+Y2<1⇒Isz I
Isz O
Text 1,11,O
Text 7,11,4I÷O

If Getkey=41:Then
Text 51,1,"EXE:Start"
While Getkey  [2015/02/17 削除]
WhileEnd     [2015/02/17 削除]
While Getkey≠31

WhileEnd
Text 51,1,"  "
 (スペース3個)
Text 51,3,"(-):Stop "
 (スペース2個)
IfEnd

Goto 1



プログラム構造

[座標設定]

[初期化処理]

Lbl 1

 [ランダム点の座標計算]

 [ランダム点の描画]

 [点の総数とπの計算値の表示]

 [一端停止と停止解除の処理]

Goto 1

[2015/02/28 追記]
fx-9860GII のプログラムファイル montecar.g1m のダウンロード




まだ、fx-9860GII の Casio Basic コマンドが、メニュー階層のどこにあるのか、完全に把握しきれていないので、コマンドを探すのにチョット苦労しています。とりあえず、以下の入り口から探せばどこかにあり、最悪は [SHIFT] [4] (CATALOG) で探せば必ずあります。

[SHIFT] [F2] (Zoom)
[SHIFT] [F3] (V-Window)
[SHIFT] [F4] (Sketch)

[OPTN]

[SHIFT] [VARS] (PRGM)


[SHIFT] [MENU] (SET UP)


これを起動したところの画面は以下のようになります。

Montecaro-1 

画面左上のCは打った点の総数、π はこの段階で計算した円周率です。
なお、画面左下に

(-):Stop
 AC:Quit


と表示していて、起動直後に [(-)] キーを押してプログラムを一端停止させると、ランダムの点はまばらで、以下のようになります。

Montecaro-2 

[EXE] キーを押して、一端停止を解除し、計算を続行させます。点が少し増えたところで、再び [(-)] を押して実行を止めると以下のようになります。

Montecaro-3 

さらに計算を継続させると、

Montecaro-4 

点の数がかなり増えています。

放置しておくと、正方形の範囲が殆ど塗りつぶされます。

Montecaro-5 

C=27875 にもなっても、まだ一回も点が打たれていないところがあります。Ran# 関数が本当にランダムではないのでしょう。たまたま、円周率の値にかなり近くなっていますが、この Ran# 関数を使ったモンテカルロ法の精度は、あまり高くないと言えそうです。
本エントリーは、グラフィックス描画を試してみるのが目的なので、精度は気にしないでおきましょう。


ところで、点が次々に増えてゆくダイナミックな状態は、見ていて面白いものです。


※ この動画終了後に Functions と言う表示が出ますが、YouTube が勝手に次の動画を紹介しているだけで、本動画とは無関係ですので、無視してください。

この動画は、ノーマルで 29MHz のところ、オーバークロック 280MHz で動作させた時のものです。

描画に時間のかかるグラフィックスプログラムを作って動作確認をする時、待ち時間を短くして動作結果が速く分かるのは、便利です。時間のかかるグラフィックス描画を作る時は、オーバークロック動作をさせています。

私は、オーバークロックには以下のアドインを愛用しています。

 sentaro様作成:Ftune2

オーバークロックでの動作のリスクはゼロではありませんが、このアドインは、プリセットで5つの設定があり、簡単にクロック数を切り替えられます。そして、表示や動作パラメータを確認しながらの設定変更も可能です。リスク低減の配慮がなされており、納得しながらリスクを減らせられるので愛用しています。詳しくは、以下のエントリーをご覧の上、ご興味があれば自己責任でお使いください。
 ⇒ fx-9860GII のオーバークロック - Ftune2 -



さて、今回のプログラムを作るにあたって試行錯誤の結果、Casio Basic でのグラフィックス描画について、いくつか気がついたことがありますので、それを紹介します。


画面のグラフィックス座標設定

グラフィックスは、横127ドット、縦63ドットのドットマトリックス液晶画面で描画します。

点を打つ時は、Plot コマンドでX座標とY座標を指定して、
 Plot X,Y
の書式で点を描画します。X, Y で決まる位置のドット1つが表示されます。

Plot の入力:
[SHIFT] [F4] (Sketch) [F6] [F1] (PLOT) [F1] (Plot)


円の描画は、Circle コマンドで、円の中心のX座標、Y座標、そして円の半径を指定して、
 Circle [中心のX座標],[中心のY座標],[半径]
の書式で円を描画します。

Circle の入力:
[SHIFT] [4] (Sketch) [F6] [F3] (Crcl)

今回は、円の中心が原点(X=0、Y=0)、半径 1 の円を描くので、
 Circle 0,0,1
となります。

実は、fx-9860GII の Casio Basic では、グラフを描画する際には、ViewWindow コマンドで、X軸とY軸の範囲を指定することで、画面全体の座標系を決めます。これを利用すれば、例えばX軸の範囲、つまりXの最小値と最大値を -2.0 と 2.0 に設定すると座標の原点は中央に来ます。Xの最小値を -3.0、最大値を 1.0 にすれば、原点は中央から右にずれます。

ViewWindow の入力:
[SHIF] [F3] (V・WIN) [F1] (V・WIN

ViewWindow は、グラフ用紙のようなものです。グラフ用紙に円を描き、用紙を右に移動させれば、当然ながら描いた円も一緒に移動します。

そこで、今回のプッログラムでは座標の設定を以下のようにしました。

ViewWindow -2.8,1.3,0,0-1.0087,1.0087,0

書式は、以下になります。
ViewWinow [X最小値],[X最大値],[X軸の目盛り間隔],[Y最小値],[Y最大値],[Y軸の目盛り間隔]

今回のプログラムでは、
 ・X最小値: -2.8
 ・X最大値: 1.3
 ・X軸の目盛り間隔: 0
 ・Y最小値: -1.0087
 ・Y最大値: 1.0087
 ・Y軸の目盛り間隔: 0

としています。

なお、画面のX方向(左右)は、左端のドットの中心と右端のドットの中心の距離は 126 ドット分 、これに対して左右のXの範囲は 1.3 - (-2.8) = 4.1 に相当します。
液晶上端のドット中心と下端ドット中心の距離は 62 ドット分なので、左右と同じ縮尺で上下のYの範囲を設定するには、

4.1:[Yの範囲] = 126:62

従って、[Yの範囲] = 4.1/126 × 62 = 2.017460317 なので、ここでは半分の値を使って、
 ・Y最小値: -1.0087
 ・Y最大値: 1.0087
と、上下は対称になるように設定しました。

画面の横幅(126ドット分)と縦幅(62ドット分)は厳密に 2:1 にはなっていないので、126対62になるように細かく設定することで、原点の回りに対称な円を描けました。

もしX軸とY軸の縮尺が異なると、この円は真円にならず、楕円になります。ゴムの上に円を書き、ゴムを一方向に引っ張ると円が楕円になるのと同じです。

この円の直径は 2 ですが、座標の設定で上下と右端に少し余裕を持たせていることに、お気づきでしょう。敢えて余裕を持たせています。

なお、引数の3つめと6つめのX軸とY軸の目盛り間隔ですが、これを 0 に設定してもエラーにならないので、今回は 0 としました。仮に 1 としても描画に変化がありません。以下に説明するように 座標軸の表示をしない設定(AxesOff コマンド使用)にしているので、影響が無いと思われます。 


このように、fx-9860GII の Casio Basicでは、グラフィックスを描画する前にグラフの描画範囲(座標)をうまく設定するのがコツのようです。最初に ViewWindowで座標を決めれば、PlotCircle はその座標系で描画できます。ViewWindow で座標設定が簡単にできるので、利便性が高いと思います。

但し、ブラフ表示を目的として各種コマンドが準備されていると考えるべきで、その場合は軸の名前(X や Y)の表示、グリッド表示、座標軸表示、目盛り表示、ラベル表示は今回のプログラムでは不要です。幸いなことに、これらの表示をオフにするコマンドが準備されているので、それを使います。

CoordOff
GridOff
AxiesOff
LabelOff


CoordOff の入力:
[SHIFT] [MENU] (SET UP) [F2] (COOR) [F2] (Off)

GridOff の入力:
[SHIFT] [MENU] (SET UP) [F3] (GRID) [F2] (Off)

AxesOff の入力:
[SHIFT] [MENU] (SET UP) [F4] (AXES) [F2] (Off)

LabelOff の入力:
[SHIFT] [MENU] (SET UP) [F5] (LABL) [F2] (Off)



テキスト表示

fx-5800P で作ったプログラムのように、打った点の数と円周率π の計算値を画面表示させます。
Locate コマンドを使うと、画面がちらつきます。Locate" " (出力)命令などのテキスト表示の時にはグラフィックスが表示されず、グラフィックス表示の時にはテキストが表示されません。結果的にテキスト表示とグラフ表示が頻繁に切り替わるので、表示がちらつきます。テキスト表示とグラフィックス表示では異なるRAMを使っていると思われ、同時表示の方法がまだ見つかっていません(できないかも知れません)。

Text の入力:
[SHIFT] [F4] (Sketch) [F6] [F6] [F2] (Text)

Text の書式:
 Text [文字の左上のドットのY座標],[文字の左上のドットのX座標],[表示内容]
 ※ 表示内容には、数値、変数、式、戻り値のある関数が使えます(Locate と同様)

一方、Locate の書式は、Locate [X座標],[Y座標],[表示内容]

なので、座標指定のXとYが互いに逆になっています。

なお、Text コマンドで表示される文字や数字は、Locateコマンド" "(出力)命令 のような見やすいフォントを使った表示ではなくて、液晶のドットを使った単純な文字表示です。そして、1文字の表示で使う縦横のドット数が異なりますので、表示位置のY座標とX座標は文字に合わせて微調整しました。

数字は、縦5ドット、横3ドットのようですが、小さな数字も使えるので、その場合は文字に合わせる必要があります。一方で、表示の位置は Locate コマンドのように縦横の位置が決まっていないので、好きな位置に表示可能な利点もあります(面倒ですが...)。



ランダムな点の位置計算と描画

ランダムな点を Plot X,Y で表示させています。

fx-5800P で作ったプログラムでは、ランダムな点の座標(X,Y) のXとYは、いずれも 0~1 の範囲の正の数としていました。

今回は、グラフィックスの見栄えを考えて、半径1の円に外接する1辺が 2 の正方形の範囲全体にランダムに点を打つようにしています。従って、X と Y は、それぞれ -1 ~ +1 の範囲の値にしたいわけです。

そこで、一旦 Ran# 関数で、0~1 の値を得るまでは同じですが、これを 2 倍して、1 から引き算することで、-1 ~ +1 を算出するように変更しました。

1-2Ran# →X
1-2Ran# →Y


次に、点(X,Y) が円の中に入っているかどうかは、

X2+Y2<1

で判定し、これが正しい時に 円内の点の数 I を1つ増やす処理を行っています。

X2+Y2<1⇒Isz I

X と Y は、必ず -1 ~ +1 の間の数なので、必ず 2x2 の正方形の中の点です。そこで、無条件に Isz O で1つ増やす処理にしています。また、点は 必ず 2x 2 の正方形内に打たれることが、上記から保証されるので、描画範囲を決める座標設定 (ViewWindowコマンド) で、2 x 2 よりも少し広い範囲に設定しても問題がなく、見栄えが良くなるわけです。

打った点の総数やπの計算値の表示には Text コマンドを使って、以下のようにグラフィックス画面に表示します。

初期表示の部分で、

Text 1,3,"C="
Text 7,1,"π="


とし、Lbl 1/Goto 1 ループの中では、点1を1つ打つたびに、以下の表示を行います。

Text 1,11,O
Text 7,11,4I÷O




プログラム操作に関する部分

[(-)] キーを押した時、プログラムを一旦停止させ、[EXE] キーで一旦停止を解除する部分、それに伴う表示の変更は、以下のようにしました。

[(-)] キー(キーコード41)が押された時の必要な処理を行うので、

If Getkey=41:Then
[必要な処理]
IfEnd


としました。
プログラム全体は、Lbl 1 / Goto 1 で無限ループになっていて、If Geykey=41 はループが回るたびに実行されるので、上記のようにできます。

[必要な処理] については、 [EXE] キー(キーコード31)が押されるまでループを回し続けてプログラムが先に進むのを防ぎ、これが押されたら次へ進む、と言うロジックにしています。

表示の変更も織り込みました。

If Getkey=41:Then
Text 51,1,"EXE:Start"

While Getkey≠31
WhileEnd
Text 51,1,"  "
  (スペース3つ)
Text 51,3,"(-):Stop "
 (スペース2つ)
IfEnd


スペースは、上書きして前の表示を違和感なく消すために使っています。


[2015/02/27 修正]
当初、[EXE]のトグル操作で一旦停止と解除を実装していて、そのために以下の赤文字の2行を入れていました。
If Getkey=31:Then
Text 51,1,"EXE:Start"
While Getkey
WhileEnd

While Getkey≠31
WhileEnd
Text 51,1,"EXE:Stop"
IfEnd


その後、グラフィックス以外のコードを単純化するために今回の仕様に変更しましたが、その際不要なコード2行を削除し忘れていました。



今回のプログラムを作ってみて分かったことは、グラフィックス描画の前に、画面全体の座標設定(座標変換)を ViewWindow コマンドで行うと、この座標系で PlotCircle コマンドによる点や円の描画が楽にできるということです。

テキスト表示も Text  コマンドが使えて、Locate コマンドよりも柔軟性が高いことも分かりました。但しフォントが少しお粗末ですが...

実は、今回のプログラムの ViewWindow コマンドの部分を、以下の2行に置き換えるだけで(他の部分の変更無しで)、ほぼ同じように正常動作します。

ViewWindow -20.85,19.35,0,-10.05, 10.05,0
Factor 10,10


これについては、もう少し調べたいことがあるので、とりあえずメモ代わりにここに置かせてもらいます。



[2015/02/22 追記]

グラフィックス描画速度について

今回の Casio Basicプログラムとほぼ同じロジックを使って、sentaro様が Add-in プログラムを作ってくださいました(コメント欄参照)。そこで、画面描画もほぼ同じになるように改造させて頂きました。実行速度に大きな違いはありませんが、add-in 作成の練習を兼ねて改造させてもらいました。
 ⇒ sentaro様作成の Add-in、montecar.g1a: ダウンロード
 ⇒ 私が手を入れた Add-in、monteca2.g1a: ダウンロード
※ ダウンロードした ZIP ファイルには、add-in プログラムと Casio SDK でビルド可能なソースファイルが含まれています。

Add-in プログラム monteca2.g1a を fx-9860GII に転送すると、[MENU] キーで現れる MAIN MENU 画面に、この Add-in が表示されています(画面の右下)。

Main_Menu_Monteca2 

なお、この add-in には、実行時間を計測するルーチンが組み込まれていて、ストップウォッチ無しでも実行時間の計測ができるようになっています(この部分が sentaro様オリジナルの非常に役立つルーチンで、(ここだけがオリジナルの Casio Basic プログラムと異なります)。

Add-in_Monteca2 

Casio Basic プログラムと、ほぼ同じ画面になっていることが分かります。なお、 t= 7.04s と実行時間が表示されています。

やはりC言語で作るプログラムは Casio Basic よりも圧倒的に速いです。どれぐらい速いか、見てみましょう。



これは、ノーマルクロック (29MHz) でのものです。
動作モードメニューで、

 F1:MonteCarlo 1/1
 F2:MonteCarlo 1/10
 F3:MonteCarlo 1/100
 
 F5:MonteCarlo bench
 F6:MonteCarlo bench 2


と表示され、上から順に [F1] から順に [F6] まで実行しています。

オーバークロック (280MHz) では、さらに速くなります。



[F1] から順に [6] まで5つの動作モードで動作しています。圧倒的速さを実感できます。

さて、fx-9860GII のノーマルクロック 約29MHzと、オーバークロックした約 280MHz も併せて試した結果を以下に示します。
測定は、点の総数が100個程度になったら実行を止めて、その時間と点の総数を5回測定。これから点100個あたりの時間を計算し、最大値と最小値を取り除き、残る3回の平均を計算して、ループ1回あたりの実行時間を得ました。Add-in は、複数の動作モードから、オリジナルの Caso Basic に最も近い [F1] のモードを使用しました。

プログラムCasio BasicAdd-in
動作クロック (MHz)約29約280約29約280
ループ1回の実行時間 (ミリ秒)27843.621.07.40
速度比率 (全体)16.4倍13.2倍37.6倍
速度比率 (Basic と Add-inの比較) - 280MHz---1---5.9倍
速度比較 (29MHz と 280Mhzの比較 - Add-in------12.8倍

・ ノーマルクロックでは、Casio Basic のままオーバークロックするよりも、C言語によるAdd-in の高速化が顕著(2倍)です。

・ オーバークロックの効果は、C言語による Add-in よりも Casio Basicの方がその効果は顕著(約2倍)です。

今回のように、画面を埋め尽くすようなグラフィックス描画を高速に動作させたい場合は、C言語による Add-in を考えるべきです。

しかしCasio SDK によるプログラム作成の敷居の高さを考えると、次善の策として Casio Basic で作ってオーバークロックと言う方法があります。

そして、fx-9860GII USB POWER GRAPHIC2 (現行機種) は、他のグラフ関数電卓の現行機種と比べて、オーバークロックツール Ftune2 で最大限の効果が得られます(コメント欄参照)。モノクロ表示ですが、fx-9860GII の価値は高いと言えます。

Casio Basic 搭載のグラフィックス機能は、グラフ描画機能に特化したもので、グラフ作成のための多彩な機能がある一方で、描画点数の多いグラフィックス表示は、かなり遅いことが定量的にわかりました。


なお、この測定のために、円の描画と必要な表示の後に一端停止し、[EXE] キーで停止を解除するように Casio Basic プログラムを変更しました(下記参照、追加した部分を赤文字で示す)。Add-in プログラムの時間測定が、初期描画終了後、ループに入る手前で測定開始するようになっているので、それに合わせました。

※ fx-9860GII に転送して使える Montecar.g1m のダウンロード

fx-9860GII プログラム: Montecar
CoordOff
GridOff
AxesOff
LabelOff
ViewWindow -2.8,1.3,0,-1.0087,1.0087,0

0→I:0→O
Circle 0,0,1
Text 1,3,"C="
Text 7,1,"π="
Text 51,3,"EXE:Start"
Text 58,5,"AC:Quit"

While Getkey≠31
WhileEnd
Text 51.1." "
Text 51,3,"(-):Stop "


Lbl 1

1-2Ran# →X
1-2Ran# →Y
Plot X,Y
X2+Y2<1⇒Isz I
Isz O
Text 1,11,O
Text 7,11,4I÷O

If Getkey=41:Then
Text 51,1,"EXE:Start"
While Getkey≠31
WhileEnd
Text 51,1,"  "
 (スペース3個)
Text 51,3,"(-):Stop "
 (スペース2個)
IfEnd

Goto 1







応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ



 


keywords: fx-9860GIICasioBasicプログラム関数電卓

リンク集 | ブログ内マップ


テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-9860GII への移植 - 素因数分解

2014/12/13: 修正
2015/02/28: 追記

これまで、fx-5800P の Casio Basic で素因数分解のプログラムを紹介してきたが、これを fx-9860GII へ移植してみました。

今回のプログラム移植にあたっては、fx-5800P にある 配列変数 Z[ ] が fx-9860GII には無いので、これをどうするか、が主なテーマです。今回は、配列変数の代わりに行列を用いることにします。

なお、出力命令 ◢ を使った時の動作が、fx-5800P と fx-9860GII では異なることは、ピタゴラス数探索プログラムの fx-9860GII への移植 で経験しています。⇒ こちらの記事

これは、本来表示される筈の行が上書きされて - Disp - と表示されてしまう問題です。今のところ、決定的な解決策がまだ見つかっていないので、表示全体を1行下に下げると言う方法で回避することにします。



配列変数を行列に置き換える

配列変数 Z[N] は、1行N列の行列と同じなので、以下のようにします。

1. 領域確保 (要素20個を確保して、各要素を 0 で初期化する)
  ・配列変数の確保: 20→DimZ
   の代わりに
  ・1行20列の行列確保: {1,20}→Dim Mat Z
   [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]]→Mat Z これでも間違いないが、効率が悪い。
   fx-9860GII の Casio Basic では 最大999行999列の行列まで使えるので、Dim コマンドを用いるべき。

   [2014/12/08 sentaro様のご指摘により記述を修正]

2. 使い方
  ・ 配列変数: Z[K]
   の代わりに
  ・行列 Z : Mat Z[1,K]

3. 領域解放
  ・配列変数の解放: 0→DimZ
   の代わりに
  ・行列 Z の解放: ClrMat Z

要するに、プログラムの記述を、上のように置き換えれば動作するはずです。



- Disp - 表示による問題の回避

Locate コマンドで指定する座標を 下に1つ増やす (Y座標を1つ増やす) ことで対応します。
今回は、多くの Locate コマンドの座標指定に変数や式を用いているので、チョット注意が必要です。但し、今回のプログラムで使っているLocate コマンドのY座標は、変数 L やLを使った式で指定しているので、L の値を1つ増やすように変更すれば良さそうです。具体的には、一番下に示すプログラムを見てください。



全画面消去コマンドの変更

fx-5800P の全画面消去は Cls コマンドを使用します。テキスト表示の全消去機能です。
一方、fx-9860GII は、テキスト表示とグラフィック表示の両方の機能があり、テキスト表示の全消去は ClrText コマンドを使います。
ちなみに、グラフィック表示の全消去は ClrGraph コマンドです。


今回は、配列の扱い、出力命令の動作と画面行数に合わせたLocateコマンド引数の修正のみで、fx-9860GII に移植したプログラムは問題なく動作しました。要所を分かっていれば、Casio Basic は移植性が高いと言えます。



プログラム実行画面

fx-5800P と fx-9860GII の両方で、ほぼ同じ Casio Basic プログラムを走らせた時の、画面表示の比較です。


※プログラムを起動した時の画面:

PD_5800P_1 PD_9860GII_1 


※数を入力する:

PD_5800P_2 PD_9860GII_2  


※素因数分解を最後まで計算したあとで、結果を表示:

PD_5800P_3 PD_9860GII_3  

1行表示されたら [EXE] キーを押して次の行を表示させます。
これを繰り返して、上のように が表示されたらそれが最後の素因数です。
ここで、 [EXE] キーを押せば最初の入力画面に戻ります。

fx-5800P では4行を超えると再び1行目から上書きします。
fx-9860GII では7行を超えると再び行目から上書きします。



計算速度の比較

fx-9860GII は、ノーマル (約29MHz) と オーバークロック (約236MHz) で測定しました。

入力した自然数結果fx-5800Pfx-9860GII (29MHz)fx-9860GII (236MHz)
123453 x 5 x 8232.2秒0.5秒 (4.4倍)計測不能 (一瞬)
12345626 x 3 x 6432.6秒0.6秒 (4.3倍)計測不能 (一瞬)
1234567127 x 97216.5秒1.5秒 (4.3倍)0.3秒
123456782 x 32 x 47 x 145936.6秒1.5秒 (4.3倍)0.4秒
12345678932 x 3607 x 38032分43秒33秒 (4.9倍)7.2秒
98765432132 x 172 x 37972128秒6秒 (4.7倍)1.3秒
9876543223 x 37 x 33366727秒5.5秒 (4.9倍)1.3秒
98765433 x 227 x 1450311秒2.4秒 (4.6倍)0.6秒
9876542 x 3 x 97 x 16975秒1.3秒 (3.8倍)0.4秒
987655 x 197537秒1.6秒 4.3倍)0.3秒
987622 x 3 x 8233秒0.7秒 (4.3倍)計測不能 (一瞬)

今回の速度比較には、表示速度は含まれず、プログラムの実行速度の差が反映されていると考えられます。

※ オーバークロックは、sentaro様作のアドイン Ftune 2 を使用しています。Ftune 2 については、こちら を参照のこと。




プログラムの比較

左が fx-5800P 用プログラム、その右に fx-9860GII 用に変更したプログラムを並べ、変更箇所を赤文字で示しています。

[2015/02/28 追記]
※ fx-9860GII へ転送して使えるプログラムファイル prime.g1m のダウンロード

素因数分解_改造版ソース PD2_9860GII_src 



応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


 

keywords: fx-5800P、fx-9860GII素因数分解、プログラム関数電卓

リンク集 | ブログ内マップ


テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-9860GII への移植 - ピタゴラス数

2014年12月06日
2014/12/07: fx-9860GII オーバークロックでのテストを追加
2014年12月14日: 配列変数の代わりには行列が良い点を追記

fx-9860GII を入手したので、さっそくピタゴラス数探索プログラムを fx-5800P から移植してみました。
 ⇒ fx-5800P でピタゴラス数

このプログラムについて、fx-5800P のプログラムとの違いは、以下を考慮すれば良いだけの筈です。

・キーコード: Getkey が返す値が 全く異なる
・Locate コマンドの引数: 画面が 21 x 7 と広い

ところで、キーコードを調べるプログラム GET KEYCODE (プログラムライブラリ - キーコード取得 参照) は、そのまま100% 互換で移植できます。fx-9860GII はプログラム名を8文字以内で指定しなければならないので、fx-9860GII のプログラム名を KEYCODE としました。
 ⇒ プログラムライブラリ - キーコード取得

具体的な比較は上記参照。これでキーコードを調べると、[EXE] キーは 31、[(-)] キーは 41 でした。


さて、fx-5800P用のピタゴラス数探索プログラムで、キーコードのみを変更してfx-9860GII で走らせてみると、画面の1行目に

- Disp -

と表示されてしまい、1行目の表示に上書きされていまうことが分かったので、Locate の引数を変更して、表示全体を1行下にずらすようにしました。

表示行を1行下にずらした - ステップモード

9860_Pytha1 


表示を1行下にずらした - 連続モード

9860_Pytha2 


fx-9860GIIピタゴラス数探索プログラム: PYTHA
3→M:1→N:1→D:1→D:1→E     (初期化処理)
Locate 1,3,"A="            
(初期画面表示)
Locate 1,4,"B="
Locate 1,5,"C="

Lbl 0

E=0⇒Locate 14,2,"(-):Stop"
(M2-N2)÷2→A             
(ピタゴラス数の計算)
MN→B
(M2+N2)÷2→C

Locate 1,1,D              (見つかった回数の表示)
Locate 3,2,"          "    (スペース19個)
Locate 3,2,A              
(ピタゴラス数の表示)
Locate 3,3,"          "    (スペース19個)
Locate 3,3,B              (ピタゴラス数の表示)
Locate 3,4,"          "    (スペース19個)
Locate 3,4,C              (ピタゴラス数の表示)

Getkey=41⇒1→E
0→K
While Getkey=31
Isz K:K=20⇒Break
WhileEnd:K=20⇒0→E

Locate 14,2,"EXE:Next"◢    
(操作法表示&プログラム一時停止)

Do                     
(次の M と N を探す)
N-2→N
If N<0:Then
M+2→M:M-2→N
IfEnd
N=1⇒Break
LpWhile Frac(M÷N)=0
Isz D                    
(見つかった回数を1つ増やす)

Goto 0



fx-9860GII は fx-5800P よりもかなり動作が速いようで、[EXE] キー長押しの時間を長く設定しないと長押しにならないことから、fx-5800P で長押し時間のカウンタ 7 だったのを、20 に変更しました。

ピタゴラス数100個を探索する時間を比較してみると

・ fx-5800P:                 40秒
・ fx-9860GII (ノーマル 29MHz):       18秒
・ fx-9860GII (オーバークロック 236MHz):  4秒  [2014/12/07 追記]

と、sentaro様のご報告と同様に、fx-9860GII (ノーマル) は約2倍の速さでした。

[2014/12/07 追記]
ちなみに、sentaro様作アドイン Ftune 2 によるオーバークロックで 約236MHz にすると、上記の通り fx-5800P の10倍の速度となりました。

Ftune 2 は、
こちら
このアドインを起動後、メモリーチェックを行い、F5 キーで上記設定ができました。

なお、オーバークロックに合わせて、長押し検出のカウンタは 150 にしています(そうでないと速すぎてステップモードに切り替えが難しい)。



実際見た目も速くなっています。

ノーマル (29MHz)




オーバークロック (236MHz)



これは、凄い速さですね!



fx-9860GII は、並行輸入品 (¥9,000) なので、マニュアル類に日本語はありません。ところが、添付CDに、日本語のマニュアルがありました。但し、fx-5800P と同様、プログラミングに関しては殆ど役に立たない、最低限の内容しか記載がありません。

そこで、開封し、電池を入れて、マニュアルなしでいきなり キーコード取得プログラムを入力してみました。
たった20行のプログラムですが、コマンドをどこから選んで良いのか、最初はサッパリ分からず、結構な時間をかけて入力完了!
これで、大雑把に、どこにどのコマンドがあるのかが分かりました。

このプログラムは、手直し無しで正常動作しました。fx-5800P から fx-9860GII への互換性がかなり高いことが証明されました。

次にピタゴラス数探索プログラムの入力は、かなり楽になりましたが、ここで - Disp - 表示という思わぬ罠がありました。
この表示は、出力命令 ◢ を使うと、現れるようです。

例えば、1行だけのプログラム

Locate 1,1 "1ST LINE"

を実行すると、1行目の左端から、

1ST LINE

と表示されますが、出力命令 ◢ を使って、

Locate 1,1,"1ST LINE"◢

として、実行してみると、1行目の右端に

- Disp -

と表示され、1ST LINE が表示されません。

- Disp - が表示されるとき、その行全体を左端から上書きして表示されているために、1ST LINE が消えているようです。

次に、

""
""
""
""
""
""
Locate 1,1,"1ST LINE"◢


を実行してみると、"" で内部カーソルが6回改行され、7行目に - Disp - が表示されるので、1行目の 1ST LINE は上書きされずに、きちんと表示されます。

このことから、- Disp - は現在の内部カーソルの位置を示していると思われます。

Locate 1,1,"1ST LINE"◢

が正常に表示されない問題を避ける方法がないものか、もう少し調べて見ようと思います。


他にも、色々と触っていて気付いたのですが、fx-9860GII には配列変数がありません。その代わりに List コマンドを使うしかないのかなぁ、と思いますが、その処理速度がどの程度か、いずれ調べてみようと思います。

[2014年12月13日 追記]
fx-9860GII (ノーマルクロック: 約29MHz) でリストと行列のアクセス速度を測定したところ、行列の方が速いことが分かりました。速度と汎用性を考えると、fx-5800P の配列変数の代わりに fx-9860GII で行列を使うのが正解です。

処理内容処理時間 (ミリ秒)
リスト読み出し13.2
リスト書き込み17.6
行列読み出し10.7
行列書き込み12.0
※ 測定はココ の方法に準じて実施。但しループ回数は2000回とした。


fx-9860GII は標準で 29MHz程度。クロックが8倍速くなっているのに、表示まで含めた速度は4.5倍程度にとどまっている、という上記の結果から、表示(描画)速度がかなり遅くて、これが全体の速度を決めてしまう(律速)ことになっているようです。

fx-5800P が14MHzも無いとするならば、fx-5800P の描画速度がfx-9860GII に比べて速いと言えます。




fx-9860GII 用ピタゴラス数探索プログラム: PYTHA

※ fx-9860GII へ転送して使える プログラムファイル pytha.g1m のダウンロード

fx-9860GII PYTHA_src 
 ※ 13行目、15行目、17行目の Locateコマンドの空白はスペース19個




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ

 

keywords: プログラム関数電卓、fx-5800P、fx-9860GII、キー長押し、CasioBasic、 ピタゴラス数

リンク集 | ブログ内マップ

テーマ : プログラム関数電卓
ジャンル : コンピュータ

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム関数電卓は、プログラムを作り・使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR