fx-5800P 素因数分解 - 高速化

追記修正 2020/01/24

[2020/01/24]
ソースコード表示を追加し、C.Basicでの実行例の説明を追加しました。



今回は、fx-5800P の素因数分解プログラムの高速化の話題です。

素因数分解の一般的な方法は、"エラストテレスのふるい" と言われるものです。最初に入力した数 N を小さい順に素数で割り算を繰り返す方法です。最大の素因数は N の平方根以下の整数なので、平方根以下の整数を対象に2と3以上の奇数で割り算を行う方法で fx-5800P での素因数分解プログラムを作っています。
⇒ fx-5800P 素因数分解 - バグ修正と表示変更

さらに高速化する方法は無いものかと、色々と考えたり、試したりしていました。
例えば Casio 関数電卓の素因数分解 など。



最速の素因数分解プログラム

最近、目からうろこの高速化を達成した記事を見つけました。
A fast prime factorizing program for Casio fx-5800P 
このトピックで、作者の slugrustle 様 は、2つのプログラムを公開されています。いずれもプログラム名は FACTOR です。
オリジナルは、上のサイトをご覧ください。

これらには、面白い工夫がなされています。その部分には手を付けず、表示やユーザーインターフェースの不具合(と私が思うだけですが...)を解消するために、チョット変更しました。


1本目のプログラムの変更版:
結果の表示を 3^2 と乗数を表示し、List にも乗数の結果が FREQ に反映するように変更しました。
FACTOR-M1 のダウンロード

FACTOR-M1_1 FACTOR-M1_2 
FACTOR-M1 の結果出力 - 左: 乗数表示、- 右: [MODE] [3] で現れる List表示


2本目のプログラムの変更版:
オリジナルプログラムでは、結果表示画面を、複数ページで切り替えて自由に見られるようになっています。[EXE] [▲] [▶] [+] で次のページを表示、[(ー)] [▼] [◀] で前のページを表示、[EXIT] [DEL] でプログラムを終了するようになっています。計算が高速化しているだけでなく、結果表示も良くなっています。

このキーの使い方がチョット馴染まないので、[▼] で次のページ、[▲] で前のページ、[+] は使えないようにし、指定以外のキーを押した時の誤動作を抑制するように修正しました。時間をかけて計算できた結果が、誤動作で見えなくなるのは嫌ですから...
さらに、オリジナルはキーを軽く押しても応答せず長押しが必要、つまり応答がとても悪いので、キー入力待ちを最小のループにして応答を十分高速にしました。軽くキーを1回押すだけで、チョット待ちますが必ず画面が変わります。
またオリジナルでは結果表示一覧で素因数として 1 が表示されますが、1 は素数ではないので、素因数として 1 が表示されないように修正しました。
FACTOR-F1 のダウンロード
※ ソースコードはこのページの一番下に掲載

FACTOR-F1_1  FACTOR-F1_2 
FACTOR-F1 の結果表示 - 全結果を画面切り替えで確認、左: 2/1ページ、右: 2/2ページ


比較のための以前作った PRIME DECOMP:
PRIME DECOMP のダウンロード

Prime_Decomp_2 Prime_Decomp_3 


上記でダウンロードしたZIPファイルには、それぞれ CCL ファイルと TEXT ファイルが含まれています。CCL ファイルは CcLinker を使って fx-5800P に転送できます。或いは、下のリンクからテキストファイルを参考にしてください。



計算時間の比較

先ずは、fx-5800P でどのくらい高速化されたかの結果を示します。

PRIME DECOMP
ソースコード
FACTOR-M1
ソースコード
FACTOR-F1
ソース (メインルーチン)
ソース (サブルーチン)
123,456,789
= 32 x 3607 x 3803
170 秒60 秒
3 倍高速化
42 秒
4 倍高速化
6,666,666,667
= 19 x 1627 x 215659
77 秒27 秒
3 倍高速化
20 秒
4 倍高速化
7,849,516,203
= 32 x 9811 x 88897
458 秒165 秒
3 倍高速化
111 秒
4 倍高速化

1本目の FACTOR-M1 で3倍高速化、さらに2本目の FACTOR-F1 は4倍高速化されていることが分かります。

素因数分解は、与えられた数を小さい数から順に割ってゆく時、その操作の回数を減らせば、高速化に繋がります。
PRIME DECOMP では入力した数に、先ず平方根をとって一気に探査範囲を狭め、2と3以上の奇数で小さい方から順に割り算してゆく作戦です。

一方で、理想的なのは、小さい素数から素数だけで順に割り算してゆくことです。それには素数リストが必要ですが、それがあれば苦労しません。素数を算出する計算式などありません。

さて、slugursite様の工夫は、高い確率で素数を見つけるだけでなく、割り算する候補 (例えば、2 や 3 だけでなく、一旦割り算で使った素数の倍数) を効果的にふるい分ける手法にあります。そして、最初の FACTOR-M1 よりも 次の FACTOR-F1 の方が、素数を見つける確率が高くなっているので、さらに高速化されています。



最速プログラムでの工夫 [2019/07/31]

読者のまつ様から、高速プログラムの考え方をご説明頂きました。私はこれに大変納得しましたので、それを掲載致します。以前の記述は撤回させて頂きます。

素因数分解プログラムで通常行われている割り算では,「2,および,3以上の奇数」を割る数としています。
これですと,ご存知のように,例えば3で割り切った後に9でも割るという無駄が出てしまいます。
FACTOR-M1は,「2, 3, 3より大きい3の倍数を除く奇数」を割る数としており,3で割ったあと9や15で割ることはないようにしています。

3より大きい3の倍数を除く奇数について考えてみます。

まず,3より大きい3の倍数でない整数は次の(1),(2)のどちらかです。
 3m+1 (1)
 3m+2 (2)
 (m>=1)

次に(1),(2)が奇数となる式をそれぞれ求めます。

(1)は (2m+1)+m と変形できます。2m+1 は奇数ですから,(1)が奇数であるためには m が偶数である必要があります。そこで m=2n (n>=1) とおけば,(1)は 6n+1 となります。

(2)は 2(m+1)+m と変形できます。2(m+1) は偶数ですから,(2)が奇数であるためには m が奇数である必要があります。そこで m=2n+1 (n>=1) とおけば,(2)は 6n+5 となります。

5とこれらの式を並べ,さらに,隣り合う式の差も書き加えると次のようになります。(n=1とします)
式の並び隣り合う式の差
52
6n + 14
6n + 52
6(n+1) + 14
6(n+1) + 52
6(n+2) + 14
6(n+2) + 52
:
:
:
:
このような訳で,2, 4, 2, 4, ... と加算していると思われます。
この繰り返しは,6n+1 および 6n+5 の式からも分かるように,2と3の最小公倍数6を周期としています。

FACTOR-F1は,これを拡張して,割る数として
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
を順番に求めていく方法をとっていると思われます。
2,3,5,7の最小公倍数は210ですから,隣り合う割る数の差(2,4,6,8など)の並びは210が1周期です。
FACTOR-F1の場合は,13+210n〜13+210(n+1)-1 [n>=0]の範囲で,2,3,5,7のいずれの倍数でもない整数を並べて,隣り合う整数の差をリストにしていると思われます。

ちなみに,13〜222の210個の整数のうち,
 奇数,かつ,3の倍数でない,かつ,5の倍数でない,かつ,7の倍数でない整数
の個数は,FACTOR-F1の「While 1」の下にある
 B+2→B:A÷B→D:Frac(D)=0⇒Prog "WFSUB":B>C⇒Goto 1
のパターンの行数と同じ48個です。

48個となる理由は次の通りです。

まず,2,3,5,7の倍数に関わるそれぞれの個数を求めます。

2の倍数の個数=210/2=105
3の倍数の個数=210/3= 70
5の倍数の個数=210/5= 42
7の倍数の個数=210/7= 30
 
2と3の公倍数の個数= 6の倍数の個数=210/ 6=35
2と5の公倍数の個数=10の倍数の個数=210/10=21
2と7の公倍数の個数=14の倍数の個数=210/14=15
3と5の公倍数の個数=15の倍数の個数=210/15=14
3と7の公倍数の個数=21の倍数の個数=210/21=10
5と7の公倍数の個数=35の倍数の個数=210/35= 6
 
2,3,5の公倍数の個数= 30の倍数の個数=210/ 30=7
2,3,7の公倍数の個数= 42の倍数の個数=210/ 42=5
2,5,7の公倍数の個数= 70の倍数の個数=210/ 70=3
3,5,7の公倍数の個数=105の倍数の個数=210/105=2
 
2,3,5,7の公倍数210の個数=210/210=1

重複を考慮すると,
2,3,5,7のいずれかの倍数の個数
=(105+70+42+30)-(35+21+15+14+10+6)+(7+5+3+2)-1
=162

従って,2,3,5,7のうちどの倍数でもない整数の個数は,
 210-162=48
で 48個となります。


素因数分解の正しい動作を検証

この作者は自分のプログラムを検証するテストプログラムまで作って、ソースコード (C++) を公開しています。fx-5800P 用なので、素因数分解する数は最大10桁と決まっています。この条件下でアルゴリズムの正しさを検証しています。

検証プログラムのソースコードが公開されています。そこで Visual Studio 2019 Community でビルドしました。


 FACTOR-F1 のテストプログラム Factor.exe のダウンロード [2019/08/28 リンクを修正]

コマンドプロンプトで、Factor.exe のあるデイレクトリに移動し、そこで

 Factor 1000 50000 4

と入力してエンターキーで実行すると、1000 から 50000まで 4 刻みで入力を変化させて FACTOR-F1 を実行した結果を一気に連続して自動実行してくれます。そして、結果が素数がどうか判定し、素数でないものが出てくるとエラーを出し、素数であれば実行を継続します。正常終了すれば、正しく素因数分解が実行されたことになります。

factor_1
正常終了しているので、1000 から 50000 までの素因数分解は問題ないことが検証されました。


fx-5800P 用のプログラムなので、入力値は 1 ~ 9,999,999,999 (10桁) の範囲なので、完璧にテストするには、

 Factor 1 9999999999 1

とすれば良いのですが、試しに私のPCだと、1晩で150億回分の検査が済みました。 10桁に相当する (1000億 - 1) 個全部のテストは、夜のみ終夜運転で計算させるとして1週間程度必要になりそうです。

factor_2
1 ~ 9,999,999,999 までのテスト中

テストが正常終了すれば、このアルゴリズムが正しいことが検証されます。但し、他のパラメータ設定でも正しい組み合わせは有りそうです。



グラフ関数電卓用に移植

FACTOR-F1 をグラフ関数電卓用に移植しました。素因数分解の計算部分は変更の余地がありませんが、結果表示は7行全部を使うように変更しました。

グラフ関数電卓用 FactorG のダウンロード

FactorG 
FactorG の結果表示

この画面は、fx-CG50 にインストールした アドインCasio Basic  - C.Basic for CG を fx-CG50 で実行した画面です。C.Basic は純正Casio Basic の上位互換なので、グラフ関数電卓用 FactorG.g3m がそのまま実行できます。C.Basic は純正Casio Basic よりも高速に動作するので、上記の例だと一瞬で結果が表示されます。
アドインCasio Basic - トップページ



Factor-F1 (fx-5800P用) のソースコード

FACTOR-F1_src



今回は、slugrustle 様の Universal Casio Forum への投稿プログラムの解説記事になってしまいましたが、私としては十分楽しませてもらったので、記事にして残そうと思いました。



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


 


keywords: プログラム関数電卓、fx-5800P、素因数分解、プログラミング、Casio Basic

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


関連記事

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

Casio 関数電卓の素因数分解

  追記 2020/01/24

本ブログでは、素因数分解プログラムについて取り上げています。

 ・ fx-5800P で素因数分解
 ・ fx-5800P で素因数分解再び
 ・ fx-5800P 素因数分解 - バグ修正と表示変更
 ・ fx-9860GII への移植 - 素因数分解
 ・ VBAで素因数分解
 ・ fx-5800P 素因数分解 - 高速化 [2020/01/07 追記]

これらの記事の発端は、カシオのスタンダード関数電卓 fx-995ES に因数分解機能が搭載されたことです。素因数分解機能が内蔵されたのなら、プログラム電卓で作ってみようと思ったわけです。但し、自作プログラムは、逆立ちしたって内蔵機能よりも速く計算できません。これは、チョット気になっていました。

そこで、今回は、素因数分解のアルゴリズムの話題です。

実は、すけっぴぃ様から、素因数分解アルゴリズムの効率化に関するコメント(ここ)を頂いており、すぐには役に立つ情報を返信できなかったのですが、心の隅に引っかかっていたこともあって、この話題を少し掘り下げてみます。


 
私の手持ちの電卓で素因数分解ができるのは、最初から機能が内蔵されている fx-995ESfx-JP900、それに作ったプログラムが走る fx-5800P と fx-9860GII の4機種。
Int_fx-995ES Int_fx-JP900 Int_fx-5800P Int_fx-9860GII 
順に、fx-995ESfx-JP900、fx-5800P、fx-9860GII

最近、fx-JP900 を入手し、素因数分解機能を試したところ、fx-995ES よりも大幅に計算が速くなっていて、さらに得られる素因数の桁数が増えています。

幾つかの素因数分解結果を、fx-995ES、fx-JP900、fx-5800P のプログラム、カシオの高精度計算サイトKe!san で行った結果の一覧表を再掲載します。← Casio fx-JP900 (その3) から抜粋

整数fx-955ESfx-JP900fx-5800PKeisan
1,234,567127x(9721)127x9,721127x9721127x9721
98,765,43223x37x(333667)
(1.7秒)
23x37x333,667
(0.4秒)
23x37x333667
(27秒)
23x37x333667
9,516,208,47332x172x(3,658,673)32x172x(3,658,673)32x172x365867332x172x3658673
123,456,78932x(13717421)32x(13,717,421)32x3607x380332x3607x3803

因数分解できない場合は ( ) 付きで表示される仕様で、そこは fx-955ES も fx-JP900 も同じ。
但し、fx-995ES は素因数が4桁以上で ( ) 付きになっていましたが、fx-JP900 では素因数の桁数制限が大幅に緩和され、上の例ですと6桁まではOK。

また、fx-JP900 の取扱説明書17ページを見ると、素因数が 1,018,081 以上の素因数を持つ時は計算エラーになると書かれていますが、上の1つめ、2つめ、3つめの例では、( ) 付きで結果が表示されています。これ以上計算できないが、たまたまそれが素因数だったと解釈すれば良さそうです。( ) 付きの場合は、それが正しいかどうかの保証が無いと言うことでしょう。

4つめの例では、( ) 付きの結果は、さらに因数分解できるが、これ以上計算できないことを示しています。

[2015/06/18 追記]
コメント欄での sentaro様とのやりとりから、求める素因数の桁数を制限すること、そしてCPUの演算速度の簡単な比較から、2と3以上の奇数で順次割り算する単純なロジックても、それぞれの実行時間をほぼ説明できそうだ、と今のところの結論です。(追記終わり)

[2020/01/24 追記]
上記のすけっぴぃさんのご提案にあるように、一旦3で割ればその後は3の倍数でない奇数で割り算すると効率があがります。これを拡張して、割る数として 奇数、かつ 3でない、かつ 5でない、 かつ 7でない整数を順次求めて行くアルゴリズムで3~4倍の高速化ができました。⇒ fx-5800P 素因数分解 - 高速化



素数は整数論の一分野で研究されていて、素数が無限個存在することは、紀元前300年頃に証明されています。しかし、未だに素数を求める公式が見つかっていないし、素数の密度を求める式も見つかっていません。ケースバーケースの近似的な式があるだけです。それだけ神秘的な数が素数と言えるのですが、だからこそ素数は暗号通信の要として、実用上極めて重要なものになっています。応用工学で重要な素数だからこそ、数学教育において素数は重要だと考え、カシオは素因数分解機能を内蔵したのかも知れません。

ところで、遅いCPUを搭載した fx-5800P で走らせた素因数分解プログラムは、処理が遅いので、あまり凝ったアルゴリズムを実装できません。それに比べて内蔵機能の計算が桁違いに速いことが、気になっていました。

そんなとき、fx-JP900 の評価をしていて、正しく計算する条件として求める素数の桁数に制限があることを改めて考えてみました。桁数の制限をかけるアルゴリズムがあって、それを使えば Casio Basic でも速いアルゴリズムを実装できるかもしれないと思いました。そこで、具体的なプログラムにするには、まだ不完全ですが、取りあえず書いてみます。


fx-995ES では3桁以内の素因数に分解して表示することができるのですが、正しい計算が保証できるときの素因数が3桁と言うのは、どういうことか? 例えば、何十個かの素数の表をメモリ内に持っていて、それを使って計算すれば、かなり計算量が節約できるかも知れません。3桁つまり1~999の範囲にある素数は168個で、最大の素数は 997 です。168個程度のデータならメモリに入れておくのは現実的です。与えられた自然数をこの168個の素数で次々と割り算してゆけば、2と奇数で順次割り算するよりも、遙かに計算量が少なそうです。

ある整数の素因数分解を行う時、素因数はその整数の平方根以下になることを使い、さらに2と奇数を順に割り算して素因数を求める計算を、fx-5800P や fx-9860GII 用に書いたプログラムで行っています。このとき、3桁の素数で最大は 997 なので、9972 = 994009 以下の素因数分解は、メモリに保存された168個の素数で順割り算すれば、かなり計算量は節約できます。fx-5800P や fx-9860GIi で作ったプログラムでは、2と奇数で割り算するので、499個の数で割り算しています。つまり、計算量は 168÷499 = 0.3367 つまり 約33%、1/3 にに抑えられます。
Casio Basic での変数参照や配列参照のアクセスに比べて、関数計算する際のテーブル参照は遙かに速いと考えられるので、これで内蔵機能が速いことが説明できそうです。この方法を Casio Basic のプログラムに反映する際は、算術演算に 1~1.5ms 程度かかり、配列変数や行列へのアクセスに20ms程度かかること、そしてこの差を考慮して、本当に速くなるのかどうかを検討する必要があります。


一方 fx-JP900 は、1,018,081 以上の素因数を持っている整数ではエラーになる仕様です。ちなみに 1,018,081 は素数でなくて、これを素因数分解すると 10092 です。fx-5800P のプログラムで計算してみると、1,018,081 未満で最大の素数は、1,018,057 だと分かります。1,000,000 (100万)までの素数は 78,498個あるので、8万個近くある素数の表を不揮発メモリに持っておくのは、関数電卓としてはあまり現実的ではないでしょう。1,018,081 以上でエラーになることから、ひょっとしてこれを実装していることも考えられますが、素因数分解だけのために原価を押し上げるメモリを使うのは疑わしいわけです。

そこで、メモリに保存された素数テーブルを使わず、完全ではないものの、素数を計算して、それで順次割り算してゆく方法は、うまくすると計算量を減らして、高速化できるのかも知れません。或いは、メモリ上の素数テーブル参照と計算の併用も現実的な折衷案かも知れません。

素数の計算については、以下の式が非常に効率よく素数を計算するものとして知られています。
オイラの素数の式 
これはオイラーが見つけた、素数 p を求める式です。全ての素数をもれなく見つけることはできません。
ただ、この式の面白いのは、x  が 0 から 39 の時に得られる数が全て素数だと言う点にあります。但し、x=39 の時得られる素数 1601 以下には、この式で得られない素数が沢山あります。1601 以下の全ての素数を算出できるわけではありません。

さらに、 が 0 から 60 の時は、x = 40, 41, 42, 44, 49, 50, 57 の7個の x 以外で、 p は素数になります。素数を算出する効率は、x が 0 から 60 で計算した61個の値のうち88.5% が素数になります。繰り返しますが、これで得られる3071 以下には、この式の結果以外に多くの素数があります。

xpxpxp
0411322326743
1431425127797
2471528128853
3531631329911
4611734730971
57118383311033
68319421321097
79720461331163
811321503341231
913122547351301
1015123593361373
1117324641371447
1219725691381523
391601
 ・・・・・・
603701
10081017113

ちなみに、x = 1009 の時 p = 1,019,131、x = 1008 の時 p = 1,017,113 となります。つまり、x = 1008 で得られる1,017,113 がこの式でエラーにならない最大素因数 1,018,057 に最も近いものだと分かります。この式では、100万までの素数の47.5% が求められることが調べられていて、効率は半分以下に落ちます。しかし、現在 fx-5800P や fx-9860GII に実装しているプログラムのロジック「2と奇数で約 50万回近く割り算する」よりも、1000回程度の割り算をする方が、計算量が 1/500程度になります。仮に3分かかっていた計算は1秒以下になりそうです。

与えられた整数に対して、先ず先に、このオイラーの式で得られる計算値から素数を選んで、それで順次割り算して、残った余りについて、2と奇数で順次割り算して計算すると言うアルゴリズムが考えられます。オイラーの計算値から少ない計算量で素数を見つけられれば、テーブルと計算の併用で、高速化の可能性があります。x をどの範囲まで使うのか、38 までとするか、60 とするか、1008 までとするか、その中間のどこかにするか、も実際の計算量とコマンドの処理速度から最適点を検討する必要があります。仮に、x = 1000 まで使うなら、1000の47.5% に相当する 475 個の素数で順次割り算するので、500 / 500,000,000 = 0.001% となり、他の計算量と計算時間を低く抑えられれば、大幅な高速化ができるかも知れません。

プログラムの実装は、そのうちやってみようと思います。もし先にプログラムを作られた方は、是非コメント欄で発表してください。お待ちしております。



ところで、余計な話になりますが、

The Asahi Shinbun Blobe - 数学という力 (残念ながら削除されたようです) というサイトでは、素数と円周率の関係、素数と宇宙の真理の関係について解説されていて、なかなか面白いです。素数は現代数学の花形の1なのですね。

ゼータ関数 
これは、リーマンと言う数学者が名付けたゼータ関数というものです。一番右の項は、オイラー積という総積計算で、素数 p がしっかり出てきます。

この式で、s=2 の時は、
ゼータ関数(s=2) 
となって、素数 p のオイラー積 と円周率 π が結びつくことが発見された歴史的な式をゼータ関数で表したものです。素数と円周率の関係式をより一般化したゼータ関数で表現することで、より深く調べることができるというわけです。上の記事によれば、この式を巡った素数の熱い研究が進められているようですね。簡単に素因数分解できる公式が存在するのかどうか?まだよく分かっていません。そのうち見つかる筈と言う人もいれば、存在しないかも知れないと言う人もいます。あまり簡単に計算できると、インターネットなどで使われている暗号が簡単に破られることに繋がるので、大問題です。

脱線すると、このゼータ関数で s=-1 の時は、
ゼータ関数(s=-1) 
なんて、なってしまいます。自然数を無限に足すと、-1/12 になる、なんとも受け入れられない結果です。実は、ゼータ関数は複素数の世界のものなので、一見あり得ない結果に見えるわけです。

カシオの高精度計算サイト Ke!san のココでも取り上げられています。
ここでは、明確に書かれていませんが、s=-1 で、実数の世界を複素数の世界に拡張(解析接続)しています。ゼータ関数の性質として、これはやっても良いこと(s=1 以外で解析接続できてしまう)なので、間違っちゃいないのですが、紛らわしいですね。

1+2+3+4+・・・  は実数の世界と誰でも思うので、自然数の無限和が負の数である -1/12 に収束するなどと言うのは、実数の世界では間違いです。でも複素数の世界では収束するので、ゼータ関数は物理の計算で重宝されているわけです。

素数は大きくなると、まばらになるのか?その密度はどうなっているのか? これもはっきりと分からない問題でしたが、2014年には素数は極端な偏りがなく万遍なく分布することが発見されました。→ こちら


素数の性質の研究は、非常にホットな分野ですね。まぁそれだけ分からないからこそ、暗号に使われるわけです。
深淵な研究は数学者に任せるとして、取りあえずプログラム電卓で素因数分解の高速化が出来るかも知れないということで、一旦区切ることにします。




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


 



keywords: fx-5800Pプログラミングプログラム関数電卓

リンク集 | ブログ内マップH
関連記事

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

Casio Basic の勧め

.
更新 2020年1月23日

Casio Basic は、最近の カシオ 製プログラム電卓(プログラム関数電卓やグラフ関数電卓)に搭載されているプログラミング言語で、意外に高機能なので実用的なプログラムが作れます。科学技術計算目的以外にも実用的なプログラムを作れます。私自身、技術計算以外のために作った自作プログラムをほぼ毎日使い、技術計算プログラムはたまに使う程度です。

カシオのプログラム電卓で新世代 Casio Basic を勧めたくなるには、幾つかの理由があります。
例えば、コマンド体系がシンプルなためプログラミングは敷居が低く、初心者にも覚えやすいこと、プログラミング経験者はスグに使えること、Casio Basic が意外に構造化プログラミング風のコーディングが可能な高機能言語であることなどが、その理由に挙げられます。


目 次
  1. プログラミングは特殊技能なのか?
  2. 新世代 Casio Basic とは?
  3. Casio Basic 搭載機種の選定
  4. Casio Basic の習得は容易
  5. fx-5800P の勧め
  6. Casio Basic を勧める背景
  7. fx-5800P の利点と弱点
  8. Casio Basic の使いこなし


プログラミングは特殊技能なのか?

プログラミングは、理系や文系、男女差、年齢や経験などとは無関係に習得可能なことはよく知られており、IT企業ではごく普通に文系出身のSEやプログラマが活躍しています。特に Casio Basic は覚えることが少なく、簡単なので、誰でも電卓プログラミングが出来ると思います。
なお、最先端でクリエイティブなプログラミングには数学(論理学含む)が得意であることは必須だと思いますが、それは別の世界の話であって、プログラム電卓でプログラムを書くには殆ど関係ありません。

参考:
<トップへ戻る>

新世代 Casio Basic とは?

実際にCasio Basic を使いながら、取扱説明書には記載のない機能や仕様が分かってくると、以下に挙げる4機種に搭載されている Casio Basic が意外によくできていることが明かになってきました。

1) fx-CG50    (カラーグラフ関数電卓)
2) fx-CG20      (カラーグラフ関数電卓)
3) fx-FD10 pro   (プログラム関数電卓 - 土木測量向け)

4) fx-9860GII   (グラフ関数電卓)
5) fx-9860G   (OS 2.0 以降、グラフ関数電卓) 
6) fx-5800P      (プログラム関数電卓)


これらに搭載されている言語は、私は 新世代 Casio Basic と呼び、それ以前の言語と区別しています。

新世代 Casio Basic は、上から下へ処理が流れるようなブロック構造のコードが書けます。Getkey コマンドと Locate コマンドがあるため、スクロールを抑えて1画面で自由に入出力できるプログラムが作れます。また、条件判定は基本的に 0 で偽、0 以外で真としてコーディングできます。引数と戻り値のある関数/プロシージャをユーザーが作ることが仕様上できないので、厳密な意味での構造化Basicとは言えません。そこで 新世代Casio Basic は、構造化言語と敢えて言います。


  • Getkey[AC] キー以外の全てのキーに異なるキーコードが割り当てられ、押したキーをリアルタイムで判定できるコマンド。
  • Locate: パラメータに、即値以外に変数、式、コマンドを指定して位置を柔軟に指定して出力するコマンド。
  • 条件判定を 0 で偽、0 以外で真とできること
  • ブロック構造のコーディングGoto に頼らずにプログラムの制御を記述し、可読性の高いブロック構造でプログラミングする方法。
実は、仕様上厳密な意味で 構造化Casio Basic は既に fx-CP400 や fx-CG500 に搭載されています。これらを使えばスグに分かるのが、処理速度が極めて遅い上、代表的な問題点として If ブロックから Goto で脱出できない(動作が保証されていない)、3項演算子が無いなどの中途半端な実装により、効率の悪いコーディングを強要されるので冗長なコーディングが必要になり、さらに処理速度がかかる、といった問題があります。これに対して構造化Casio Baisc は、よく作り込まれていることが分かります。

プログラミング経験者(特にPCでのプログラミング経験者)なら、新世代 Casio Basic は違和感なく使えます。

旧来の命令
新世代 Casio Basic には、以前のプログラム電卓に搭載されていた旧来の命令も搭載されています。カシオによれは従来のユーザーの利便性を考慮して旧来の命令を残しているとのことです。最近、この旧来の命令を使いこなして、どの程度のプログラムを作れるのか色々と試して、それを反映させたエントリーを Casio Basic入門38から連載を始めています。使いこなしを検討してみると、確かに一定レベルの実用プログラムを比較的楽に作れることが分かります。

旧来の命令は表記はシンプルでも、多彩な機能を持っています。プログラミング経験の少ない人でも簡単に使えて便利です。しかし、旧来の命令が機能が多彩であることが、逆にプログラミングの自由度を減らしているとも言えます。この旧来の命令では実現できないプログラムを作るには、Basicコマンドを積極的に使えばよいのです。旧来の多彩な命令と Basic コマンドを併せて使いこなすことで、自由度が高く、実用的なプログラミングが可能になります。

<トップへ戻る>

Casio Basic 搭載機種の選定

上記製品の中でも、特に fx-5800P は最も安価であり、さらにハードウェアとソフトウェアのバランスが良いため、実用に最も適していると思うので、私は愛用しています。fx-9860GII も Casio Basic プログラミングを楽しむために使っていますが、日常には実用性の高い fx-5800P を多用しています。fx-CG20 も入手してみると fx-9860GII の Casio Basicの移植性が高いことは確認済みです (グラフィックスの一部コマンドやカラー対応の部分に手を入れる必要があります)。fx-CG50 の Casio Basicプログラミングは fx-CG20 と完全互換です。

fx-CG50、fx-CG20、fx-9860GII、fx-5800P について簡単にまとめています;

- fx-CG50: fx-CG50 の概要

- fx-CG20: fx-CG20 の概要

- fx-9860GII: fx-9860GII USB POWER GRAPHIC 2

- fx-5800P: 本記事は主に fx-5800Pの勧め になっています

- Casio Basic - 機種間の互換性

- Casio プログラム電卓の価格動向


fx-CG50、fx-CG20 と fx-9860GII は、グラフィックス機能があり、高機能、高価格の製品(実売9千円台~2.5万円程度)で、これらの中で比較的安価な fx-9860GII は、処理速度が速い点が魅力です。さらに、fx-9860GII は Casio SDK (Casio 純正の開発環境)を使えば、パソコン上で C言語を使ってプログラムを作り、それを電卓に転送して Add-in プログラムとして利用できます。C言語で作った Add-in プログラムは、Casio Basicに比べてかなり高速動作し、Casio Basic では無理な処理も可能です。

fx-5800P
グラフィックス機能の無い fx-5800Pは、処理速度が相対的に低いものの、価格が圧倒的に安く(実売6~8千円程度)、関数電卓としてもプログラム電卓としてもバランスが取れた使いやすい機種です。

fx-5800P には プログラムリストを 通常の電卓モード (Comp モード) で呼び出して使えますが、fx-9860GII ではプログラムリストを表示するには一旦プログラムモードに入る必要があります。Casio Basicで作ったプログラムを日常的に使う場合は fx-5800P の方が利便性が高いことは、使ってみて分かります。fx-5800P と fx-9860GII を実際に使い比べてみると、日常使いには、バランスの良い fx-5800P が優れていると思います。

fx-9860GII
但し、プログラムの高速性やグラフィックス処理を重要と考えるなら、fx-9860GII も選択肢に入れるべきです。もし使いたい Add-in プログラムがあれば fx-9860GII が正しい選択肢となります。
例えば、当ブログで紹介している C.Basic (Casio Basic の上位互換、開発中) は fx-9860GII のアドインとして提供しているので、これが使いたいなら fx-9860GII がお勧めです。

fx-FD10 Pro
fx-FD10 Pro は、屋外使用を想定した堅牢な作りが特徴です。私自身が実機を持っていないので、取扱説明書から得られる内容から判断すると、上記の fx-5800P の使いやすさを備えていますが、実売1万6千円以上するが、Add-in プログラムが使えず Casio Basic のみが使えるので、fx-5800P と fx-9860GII の間にある機種だと感じます。従って、Casio Basic を使うのであれば、敢えて fx-FD10 Pro を選ぶよりも fx-5800P にするか、Casio Basic の上位互換の C.Basic が使える fx-9860GII を選択すべきだと思います。

fx-CG20 / CG10
fx-CG20 / CG10 は、カラー液晶が特徴で、内蔵の関数計算も高速化されています。但し、主に液晶への表示やメモリアクセス処理速度が fx-9860GII よりも遅く、Casio Basic プログラムの処理速度は fx-9860GII よりも遅くなります。さらに、オーバークロック・ツールを用いると fx-9860GII が fx-CG20 / CG10 の5倍以上高速になります。高精細カラー液晶の表示が必要だと考えるなら fx-CG20 / CG10 が良いのですが、それ以外の私なりの評価は、総合的に fx-9860GII の方が優れていると思います。

fx-CG50
fx-CG50 は、デザインや寸法が異なる以外は fx-CG20 / CG10 とほぼ同じ機能を持っていて、処理速度が向上しています。
 
 
<トップへ戻る>

Casio Basic の習得は容易

過去にPCでプログラミング経験があれば、Casio Basic はスグに使えると思います。私自身も過去にPCでのプログラミング経験があり、fx-5800P を買ってすぐにプログラミングができました。但し細かなところは取扱説明書に書かれていないので、自分で色々と調べました。その結果が当ブログです。

プログラミング経験があれは、当ブログの「Casio Basic コマンドリファレンス」、「Casio Basic入門」、「逆引き Casio Basic」を参考にすれば、すぐに使いこなせると思います。[2017/01/03 追記修正]

これからプログラミングをやってみようと思われる方の場合、新世代 Casio Basic を覚えることはPCで使う Basic 習得に有効だと思います。上で紹介した機種の中で特に fx-5800P は、ハードウェア的には最も非力ですが、最も安価で入手しやすく、さらに使いやすいので、学習用に向いています。僭越ながら、当ブログの Casio Basic 入門をほぼ理解できれば、Visual Basic の習得の敷居はかなり下がると思います。

Casio Basic のコマンドは、殆どが他のBasic と同じなので、覚えたことが将来無駄になりません。さらに必要最小限度の機能まで絞り込まれているので、覚えることが少いことが初心者向きの理由です。この点をもう少し説明してみます。

一般にプログラムを作る際、実現したい機能には無数の方法があります。無数の方法から適切な方法を選び出すことが、プログラミングの主な作業になるのですが、それは初級者には逆に習得の妨げとなります。Casio Basic は機能が少ないので、選択肢が限られます。従って、プログラミングの方法の選択で悩むことなく、必要なことを覚えやすいと言えます。色々なプログラムを作れば、効果的な反復学習になるわけです。

またコマンドが絞り込まれているので、アルゴリズムの工夫や計算式の応用で対応することになり、これも学習に向いていると考える理由の1つです。

機能が限定されていても、実用的なプログラムやゲームが作れることは、当ブログで紹介しています。実際にこれらのプログラムを作りながら、新世代 Casio Basic の良さに気付いたのです。実際に使ってみないと分からないものです。

<トップへ戻る>

fx-5800P の勧め

電卓でプログラミングを始めてみようと思う方には、私は fx-5800P を勧めます。

1.関数電卓としての fx-5800P
fx-5800Pは、関数電卓として見た場合、十分な機能を実現しています。プログラム機能の無い fx-995ES とほぼ同等の機能と操作性が有り、fx-5800P は高機能関数電卓と位置づけられます。カシオの関数電卓は電源を切ると、計算履歴もメモリの内容も全て消去されます。一方 fx-5800P は電源を切っても全てメモリに保存されたままです。これが関数電卓として fx-5800P を推奨する最大の理由です。

2.携帯型コンピュータとしての fx-5800P
携帯型コンピュータとして見た場合、手軽に実用プログラムを作れるので、パソコンでは真似のできない圧倒的な携帯性が最大の利点です。搭載されている Casio Basic は、ちょっとしたアクションゲームも作れます。実際に、fx-5800P のハードウェアの能力と Casio Basic の機能を確かめる目的で、「もぐら叩き」を作ってみました。結構遊べることが分ったので、冒頭で 『意外に良くできている』 と書きました。

3.Casio Basic
fx-5800Pに搭載されているCasio Basicは、グラフ関数電卓 fx-9860GII や fx-CG20 さらに 土木測量向けプログラム電卓 fx-FD10 pro に搭載されている Casio Basic と比べて、グラフィック機能や文字列処理、外部との通信機能を使うコマンドが省略されていますが、それ以外の機能は同じです。そして、fx-5800Pで作った Caso Basic プログラムは、上位機種への移植性が高いことは確認済みです。

<トップへ戻る>

Casio Basic を勧める背景

新世代 Casio Basic 搭載のプログラム電卓を勧めるには、いくつかの背景があります。

1. パソコンと同様な機能を求めない
パソコンでできることはパソコンでやれば良い。それをわざわざ電卓でプログラムを作る必要はありません。


2. サッと取り出し、パッと使える
必要な場所で、必要なタイミングで、上着やかばんのポケットからサッと出して、スグ使うのはパソコンでは絶対に出来ません。プログラムを作るだけで自分専用のオリジナル関数電卓が手に入ります。今や電卓は誰でも1台は持っている文房具です。プログラムを書くことで自分専用の機能にカスタマイズした文房具が手に入ります。


3. プログラムを簡単に作れる
ゲーム繰返し技術計算金融計算その他お金の計算単位や年月の換算時差計算 など作っておくと便利なプログラムが多くあります。自分に必要なプログラムを予め作っておくと、プログラム電卓のメリットは絶大です。

関数電卓の各種関数キーが[SHIFT]キーなどと併用しないと使えない(裏機能などと言われます)のは、2ステップキータッチが必要で効率が悪いとの評価基準があります(関数電卓マニアの部屋)。学生への関数電卓選びのガイダンスとしては、教育的配慮を斟酌すれば、私も100%同意するところです。しかし、この主張を金科玉条の如く受け売りする気になれないのも正直なところです。

実際に何度もキーを叩いて繰り返し計算を行う際には、プログラムを作ったり、数式記憶機能を使えば良いわけです。

道具は相応しい目的で正しく使えば良い。幸なことにfxー5800Pは、今や新品でも6000円程度で買えるので、2000円から3000円で関数電卓を買う変わりに、プログラム関数電卓を買うメリットを十分に感じる人は非常に多く居るはずです。ここでは、簡単なプログラミング・スキルがあれば良く、幸いなことにBasicを搭載しています。


4. 上位機へのプログラム互換性
高価で高機能なグラフ関数電卓や土木測量専業電卓への移植性が高いことは重要です。

fx-5800Pのハードウェア仕様に依存した部分を除けば、互換性、移植性が高いので、1からプログラムを作り直す手間はありません。上位機種を入手して、そこへfx-5800P のプログラムを容易に移植できるのは、Casio Basicの大きな利点です。

なお、カシオのグラフ電卓には、C、Lua、Python といった言語の開発環境(公式や非公式を含む)もあり、Casio Basic のプログラムを移植せずに別の言語でプログラミングする選択肢もあります。

fx-5800P の Casio Basicプログラムの fx-9860GII や fx-CG20 への移植をいくつか行いましたが、機種のハードウェアに依存するコマンド (GetkeyLocate)、旧来の命令 (出力命令 ◢ 、" "、入力命令 ? など) の動作の違いに適切に対処し、配列変数を行列やリストに置き換えれば、他の Basic コマンド類は互換性があります。


5. グラフ機能の優先度は低い
パソコンでできることはパソコンを利用する...と考えれば、プログラム電卓にグラフ機能は必ずしも必要ではないと思います。グラフィックスを利用したプログラムを電卓で使いたい場合は fx-9860GII のようなグラフ関数電卓を利用でき、Windows プログラミングよりは Casio Basic の方がプログラミングは遙かに楽です。

ゲームではなく、実用面からグラフ描画機能が欲しいと言う場合もあるでしょう。例えば、実験をしながらグラフを書くのは大変重要なことです。しかしそのために、プログラム電卓でわざわざプログラムを書く必要はあるでしょうか?
パソコンでエクセルを使えば、簡単にグラフを書けます。報告書、レポート、論文を書くのに最近ではエクセルのグラフが普通に使われているわけで、それなら最初からエクセルを使えば良いと思います。

私は、実用を強く意識して fx-5800P を使っていますが、グラフ機能がことさら必要だと思うことは殆どありません。本当に必要なら fx-9860GII などのグラフ関数電卓で、ブラフ表示をプログラミング可能です。しかし、正直に言えば グラフ機能の無い fx-5800P で十分に実用的なプログラムを作って、利用できます。

敢えて言えば、適材適所でしょう。そして Casio Basic 搭載機のなかでも fx-5800P は、プログラム利用の利便性が高く、小型軽量で、グラフ関数電卓よりもプログラム入力が格段に楽で、電池の持ちも長く、ハードウェアとソフトウェアのバランスが良いことは間違いありません。処理速度の遅い fx-5800P でも工夫次第で実用プログラムを作成できるので、プログラミング自体も楽しくなってきます。当ブログでは、その工夫について多く取り上げています。


6. 最も簡単にプログラミングできる携帯機器
Casio Basicを使うのなら、電卓本体のみでプログラミングできるので、いつでもどこでもプログラムを作れます。そして自分だけの付加機能を、恐らく最も簡単に追加できる携帯機器がプログラム電卓です。オリジナルプログラムを作りそれを使う楽しみと利便性があります。

<トップへ戻る>

fx-5800P の利点と弱点

fx-5800P は、新世代Casio Basic を搭載している点に最大の価値があり、同時に関数電卓としても使いやすい点が評価できます。関数電卓としてみた場合は、グラフ関数電卓 fx-9860GII よりも fx-5800P の方が必要な機能へのアクセスが速いので、使いやすいでしょう。しかもプログラミング時のコマンドや関数をメニューから探しやすいなどの使いやすさの点でも fx-5800P が優れています。

fx-5800P のもう1つの利点は価格で、他の機種に比べて圧倒的に安価です。

fx-5800P は、非常にバランスの良い製品と言えます。

fx-5800P に対する唯一にして最大の弱点は、プログラムコードのバックアップややりとりをパソコンとの間で行えるPCリンク機能が用意されていない点にあります。少なくとも fx-5800P 同志のプログラムデータのやりとりはできるので、外付けの3Pin - USB アダプタと対応ソフトウェアを発売して頂ければ実現するはずです。カシオ製でなく、サードパーティーでも良いのです。

PCとリンクしてプログラムを転送する機能の実現は、是非ともお願いしたい。

私の場合は仕事などで実用プログラムを作って、毎日のように使っていますので、電子データのバックアップ機能がどうしても欲しくなり、2台目の fx-5800p と専用通信ケーブル (SB-62)を購入しバックアップしています。なお、グラフ関数電卓を購入すれは、通信ケーブル(SB-62)は付属しているので、fx-5800P のために新たに購入する必要はありません。

[2017/08/18 追記] 最近はグラフ関数電卓に 3Pin ケーブルが付属していません。別途購入する必要があります。

[2017/09/28 追記] 2017年10月から国内販売される fx-CG50 には 3Pinケーブルが付属します。

[2018/02/26 追記] ついに fx-5800P のPCリンクが可能になりました ⇒ こちらの記事


<トップへ戻る>

Casio Basic の使いこなし

fx-5800P 搭載の Casio Basic は、使いこなしてみて初めてその価値が分かると思います。PCで一定以上のプログラミング経験があれば、この新世代 Casio Basicが 非常に使いやすく、効率的な制御構造を作れる点がすぐに分かると思います。カシオ自身がこの Casio Basic に関する情報発信を殆ど行っていないので、当ブログでは Casio Basic の使いこなしについて、異なる3つの切り口で紹介しています。

CasioBasic入門 / 目次
じっくりと読みながらプログラムを入力して Casio Basicの使いこなしやプログラムの作り方を修得する。題材のプログラムは、ある程度の完成度があり、実用的に使えるレベルになっている(と思う...)。

CasioBasic コマンドリファレンス 目次
Casio Basic のコマンドや命令を、出来るだけ詳しく調べた結果に基づいて解説している(抜けが無いことを祈るばかり...)。

逆引き Casio Basic 目次
Casio Basic で何か実現したいこと、やりたいことに対して、ピンポイントで実現方法、サンプルプログラム、考え方を紹介している(思いついたことから順次拡充中...)。

<トップへ戻る>



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


 


keywords: fx-5800PCasioBasicプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

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

BMPファイルのロード - Casio Basicプログラミング

Casio Basicプログラミング
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2018/01/08
追記修正 2020/01/17


[C.Basic] [FX / CG]

ビットマップファイルをロードして描画したい。



C.Basic では、ビットマップファイルを呼び出し、ロードして表示することができる。これは純正Caso Basicではできない。

C.Basic のグラフィックス画面は、フル画面モードで最大 384 x 216 ピクセル、標準モードでは 最大384 x 192 ピクセルのビットマップファイルを表示できる。

BmpLoad コマンドでロードする最低限のコード
BMPフォルダにある TEST.BMP をロードする例。

(サンプルプログラム) 
BmpLoad("/BMP/TEST")
ビットマップファイルの拡張子 .BMP を省略できる。画像の左上が座標 (0.0) になるように描画される。

純正Casio Basic はテキスト画面とグラフィックス画面の2つを区別して出力する仕様で、テキスト系コマンドを実行するとテキスト画面に出力、グラフィックス系コマンドを実行するとグラフィックス画面に描画する。そしてテキスト系とグラフィックス系のコマンドの出力先を同じ画面にできない仕様になっている。

一方、C.Basic では、出力先を自由に指定でき、グラフィックス画面にテキスト系コマンドを出力したり、テキスト系コマンドをグラフィックス画面出力可能。テキスト系コマンドとグラフィックス系コマンドを同じ画面に出力することも可能。

描画するビットマップ画像の左上の座標を指定することもできる。

(サンプルプログラム) 
BmpLoad("/BMP/TEST.BMP"),0,0
TEST.BMP の画像の左上を 座標(0.0) に指定して描画する。

純正Casio Basicのグラフィックス描画領域は 379 x 187 ピクセルであるが、C.Basic の標準モードでは 384 x 192 ピクセルで、さらにフル画面モードでは 384 x 216 ピクセルになっている。標準モードの画面の左上の座標は (0, 0) で、フル画面モードでの画面の左上の座標は (0, -24) となる。

そこで、最大 384 x 192 ピクセルのビットマップファイルをロードし、画面左上に併せて描画するには、上の2つの書式が使える。

一方、フル画面モードで最大 384 x 216 ピクセルのビットマップファイルをロードして表示するには、フル画面全体をクリアする_ClrVram コマンド実行することでロード先をフル画面に切替えた後、フル画面の左上の座標 (0, -24) を画像の左上に指定することもできる。

(サンプルプログラム)
_ClrVram
BmpLoad("/BMP/TEST.BMP"),0,-24,0
左上の座標の設定に続いて、0 を指定しているが、これはロード先を背景だけに指定するパラメータ。

なお、これまでのサンプルプログタムではロード先にテキスト画面かグラフィックス画面かを明示的に指定していない。
出力先を指定する Screen コマンドを使い、Screen.T とすればテキスト画面、Screen.G とすればグラフィックス画面が指定される。

グラフィックス画面をフル画面にし、その背景のみに 384 x 216 ピクセルのビットマップファイル (TEST.BMP) を描画するコードは以下のようになる。

(サンプルプログラム)
Screen.G:_ClrVram
BmpLoad'/BMP/TEST"),0,-24,0

ビットマップファイルの拡張子を省略している。


 ロードするビットマップファイルのファイル名を入力させる例
フル画面モードで最大 384 x 216 ピクセルのビットマップファイルをロード&描画する。

(サンプルプログラム)
'= Key-in file name
"_ _ _ _.BMP"→Str 1
"Input file name"?Str 1

'= Load BMP file
Screen.G:_ClrVram
BmpLoad(Str 1),0,-24,0


なお、ビットマップファイルは予めストレージメモリに転送しておく。呼び出す際はフォルダに対応していて、例えばBMPフォルダにある TEST.BMP をロードするには、この用例では /BMP/TEST.BMP と入力する。


入力時にエラーがあると、エラーメッセージと共にプログラムが中断する。そこで、エラー処理を追加してプログラムが中断しないようにする。

エラー処理を含んだ BMPファイルのロード&描画する例

(サンプルプログラム) ダウンロード: LOADBMP.g3m
'==BMP file loading routine==
' Ver 1.0  Krtyski//e-Gadget


'= Key-in file name          <ブロック1>
' file name→Str _1
"_ _ _ _.BMP"→Str 1
"Input file name"?Str 1


'= Check file existance        <ブロック2>
' exist:    S=file size
' not exist:  S=0 & Return -1

IsExist(Str 1)→S
If S=0:Then
"Not exist"
Return -1
IfEnd

'= Check BMP file format       <ブロック3>
' not BMP file: Return -1

""→Str 2         
[2020/01/17 追記: C.Basic for CG Ver 1.43での仕様変更のため]
{3,1}→Dim Mat θ.B
Load(Str 1)→Mat θ
For 1→I To 2
Mat θ[I]→Mat r
[2,I]
Next
0→Mat r
[2,3]
ClrMat θ
If StrCmp(Str 2,"BM"):Then
"Not exist"
Return -1
IfEnd

'= Load BMP file in         <ブロック4>
' back ground of text screen

Screen.G:_ClrVram
BmpLoad(Str 1),0,-24,0



<ブロック1>
ビットマップファイルをキー入力させる。
入力したファイル名を Str 1 に格納。

<ブロック2>
入力したファイル名 (Str 1) がフォルダ内に存在するかどうかを IsExist コマンドで調べる。
IsExist はファイルが見つかればそのファイルサイズ、見つからなければ 0 を返す。
そこで、S が 0 ならば Not exist と表示して、Return -1 を実行して、プログラム終了。
このルーチンを GosubProg コマンドで呼び出す場合は、-1 が返るのでエラー判定可能。

<ブロック3>
見つかったファイルがビットマップファイルかどうかを判定する。
ビットマップファイルはファイルの最初の2バイトが BM になっていることを利用。
この部分は、g3mファイルの場合は60バイト目からのファイル名を調べるなどに応用できる。
最初の2バイトが BM かどうかは、StrCmp コマンドで判定。一致すれば 0 を返し、そうでない時は 1 か -1 を返すので、0でない時 Not exist と表示して Return -1 を実行しプログラムを終了する。

<ブロック4>
ビットマップファイルをロードし、テキスト画面の背景に表示する。
ここまで来れば、入力したファイル名がビットマップファイルなので、BmpLoad コマンドでロードする。
BmpLoad(Str 1),0,-24,0 は、Str 1 のビットマップファイルをフル画面モードの左上の座標 (0, -24) から背景として描画する。




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


 



keywords: プログラム関数電卓、Casio Basic、C.Basic、プログラミング

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




関連記事

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

e-Gadget について

2017/07/31
更新 2020/01/15



e-GadgetCasio Basic をメインテーマにしたブログです。 

カシオの関数電卓にはプログラムを作って実行できるものがありますが、特に日本国内で2006年以降のプログラム関数電卓やグラフ関数電卓の多くに搭載されている Casio Basic の使いこなしが当ブログのメインテーマです。具体的には以下の機種に搭載された Casio Basic を対象にしていて、それ以前の機種のBasic風の言語とは一線を画していることから、私は最近の搭載言語を 新世代 Casio Basic と呼んでいます。

fx-5800P
fx-9860G (fx-9860G AU / fx-9860G SD / fx-9860G Slim)
▶ fx-9860GII (fx-9860GII SD / fx-9860G AU PLUS / fx-9750GII / fx-7400GII)
fx-CG20 (fx-CG10)
fx-FD10 Pro
▶ fx-CG50

( ) 内は 国内で販売されていない機種で同等の Casio Basic が搭載されているもの. 或いは後からインストール可能なもの。但しフランス専用機種は含めていません.

新世代Casio Basic は、ユーザー関数が作れない、大域(グローバル)変数しか使えないながらも、構造化プログラミング風のコーディングで見通しの良いプログラミングが可能であることは意外に知られていません。このような良さは、昔のポケコンやパソコンで行番号付きBasicプログラミングの経験しかない人、プログラミング経験の少ない人が、チョット触ってみた程度だと分かりにくいと思います。カシオの取扱説明書の記述が簡潔すぎる、言い換えればお粗末な説明しか書かれていないのも、勘違いの大きな原因でしょう。

そこで e-Gadget では、取扱説明書に書かれていない Casio Basic の使いこなし を複数の角度から徹底的に紹介しています。

管理人のPCや周辺機器に関する備忘録や、Windows プログラミングについても少しですが記事にしています。


[2017/08/05 追記]
特定の事柄について当ブログの記事を探す場合は、以下を参考にしてください。

e-Gadget の記事リスト
 ▶ e-Gadget 全体の目次
テーマ別に記事をリストアップしています。元々管理人自身のために作ったもので順不同です。見つけにくいのでスミマセン。いずれ何とかするかも知れません。

Casio Basic の使いこなし
複数のアングルからシリーズ化しています。
 ▶ Casio Basic 入門:じっくりと読みながら実際にプログラムを作って理解を深める
  ∟ Casio Basic (超)入門:fx-5800P で初めてのプログラミング
 ▶ Casio Basic コマンドリファレンス:特定コマンドについて詳しく解説
 ▶ 逆引き Casio Basic:やりたいことからコードを知る
 ▶ プログラムライブラリ:正しく動くプログラムを改造すれば理解が深まる

Casio Basic 使いこなしに隣接するトピックス
Casio Basic、プログラム電卓、その他の管理人が気になるトピックス
 ▶ 楽屋裏

機種別の話題
特定機種をきっかけにして、管理人の好き勝手な方向に掘り下げたトピックス
 ▶ fx-5800P
 ▶ fx-9860GII
 ▶ fx-CG20
 ▶ fx-CG50

カシオ製プログラム電卓の系譜
カシオのプログラム電卓の往年の名機 FX-502Pから最新機種までの代表的なモデルについて、実際にプログラムを作ったり古いカタログを参照しながら、プログラム電卓の系譜を明らかにする
 ▶ プログラム電卓 温故知新
 ▶ プログラム電卓メモワール

アドイン版Casio Basic - 高速・高機能 Casio Basic [2018/08/22 追記]
 ▶ アドイン版 Casio Basic - トップページ

Casio Basic やプログラム電卓以外
Casio Basic や電卓以外のパソコン、通信端末などの管理人のメモに近い話題
 ▶ 番外編



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


 

関連記事

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

プログラムライブラリ - OS内蔵ファンクションメニュー探索

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

2019/05/28
修正 2020/01/13


OS内蔵ファンクションメニュー探索 - SysFunc Ver 1.3


※ [2020/01/13] C.Basic for CGSysFinc Ver 1.3 を差替え再々アップデート (5桁の F-Key# へ対応できるように修正)


著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

- Casio fx-CGシリーズ - C.Basic for CG で動作
- Casio fx-9860Gシリーズ - C.Basic for FX で動作



プログラムの説明

ファンクションキー探索プログラム - Check System F-Key

fx-CGシリーズ や fx-9860GシリーズのOSには、ファンクションキーの様々なアイコン画像が内蔵されており、それぞれに System Function Key# が割り当てられている。C.Basic の独自コマンド FKeyMenu( は、[F1] から [F6] の位置に ファンクションメニューを表示できる。その際、OS内蔵の System Function Key# を指定すると内蔵されている画像を利用できる。そこで、ファンクションキーのアイコン画像と Key # を調べるために本プログラムを作成した。

その後 C.Basic for CG に独自のファンクションキーのアイコンを装備する計画があり、それに併せてプログラムを更新した。

  C.Basic for CGFKeyMenu( コマンドで呼び出せる Function Key# を調べる
  1. 画面左下に システムファンクションキーを表示する
  2. カーソルキーで システムファンクションキー#をスキャンする
   - カーソルキーの長押しで連続スキャン
   - 左右 / キー (◀▶) で1づつ Step スキャン
   - 上下 / キー (▲▼) で50刻みの Skip スキャン
  3. [F4](INPUT)[EXE] キーで数値の入力
  4. [F5](HELP) で使い方説明
    
   SysFunc3_2_1_f SysFunc3_2_2_f2 SysFunc3_2_3_f 
  ※ [2020/01/13 差替えアップデート]
    C.Basic for CG 独自に実装する(予定)の Function Key アイコンは F-Key# 10001 以降。
    それに対応するため 5桁の F-Key# に対応するよう変更した。
  ※ [2020/01/13 差替え再アップデート]
    システム内蔵Function Keyアイコンの上限番号はOSバージョンに依存するので、
    OSバージョンを自動判定し、仕様機種とOSに応じた上限番号を表示するように変更した。
機種OSバージョン判定に使ったOSバージョンFunction Key上限番号
    fx-CG101.04.32001.041248
fx-CG202.02.02002.021276
fx-CG103.10.32003.101378
fx-CG203.11.02003.111379
fx-CG503.20.02023.201394
fx-CG503.30.02023.301400
  ※ [2020/01/13 差替え再々アップデート]
    カスタムFunction Keyアイコンを Function Key アイコンは F-Key# 10001 以降。
    F-Key# が 10001 以上の時は、画面中央に Custom F-Key# と表示
    それ未満の時は、画面中央に System F-Key# と表示するように変更した。
    
  C.Basic for FXFKeyMenu( コマンドで呼び出せる System Function Key# を調べる
  1. 画面左下にシステムファンクションキーを表示する
  2. カーソルキーで システムファンクションキー# をスキャンする
   - カーソルキーの長押しで連続スキャン
   - 左右 ←/→ キー(◀ ▶) で1づつ Step スキャン
   - 上下 ↑/↓ キー (▲ ▼) で50刻みの Skip スキャン
  3. [F4] (INPUT)[EXE] キーで数値の入力
  4. [F5] (HELP) で使い方説明

   SysFunc3FX_1 SysFunc3FX_3 SysFunc3FX_2 



プログラムファイルのダウンロード

※ fx-CGシリーズ用
   SysFunc3.g3m のダウンロード

※ fx-9860Gシリーズ用
   SysFunc3.g1m のダウンロード




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


 


keywords: fx-5800PCasioBasic、プログラムライブラリプログラム関数電卓

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


関連記事

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

プログラムライブラリ - TimeZone

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

最終更新:
2020/01/08

Time Zone (2020年版)

2020年のヨーロッパ・北米夏時間に対応 [2020/01/08]
※ プログラム改善: >>>> 表示で何も入力せず確定時、値が 0 に変更されていたのを変更しないように改善した [2017/08/14]


著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

Casio fx-9860G, fx-9860GII シリーズで走る純正Casio Basic および C.Basic for FX で動作
Casio fx-CG10, fx-CG20・fx-CG50 で走る純正Casio Basic および C.Basic for CG で動作
(fx-FD10 Pro の純正Casio Basicでも動作すると思われます)

Casio fx-5800P 用は こちら



プログラムの説明

TimeZonefx-5800P用に作成したプログラムを移植したものです。プログラム作成方法については Casio Basic 入門をご覧下さい。

TimeZone は、日本、ヨーロッパ、北米での同じ時間を表示します。その際、タイムゾーンや夏時間を考慮した時間を計算します。

具体的には、3カ所のうち、どこか一カ所の時間を入力すると、時差を計算して他の二カ所の時間を表示するプログラムです。

例えば、日本、ドイツ、モントリオールの3カ所から接続して電話会議を行う時に、それぞれが夜中にならないように時間を決める時などに役立ちます。

2020年の夏時間は、
 ・ヨーロッパは、3月29日午前1時 ~ 10月25日午前1時
 ・北米は、3月8日 午前2時 ~ 11月1日午前2時
となります。
TimeZone では、
 ・ヨーロッパは、3月29日 ~ 10月274
 ・北米は、3月8日 ~ 10月31日
としています。


本プログラムでは、以下のタイムゾーンや夏時間の設定が行えます。

- 日本
 JST: 日本標準時間

- ヨーロッパ
 WET: 西ヨーロッパ標準時間
 CET: 中央ヨーロッパ標準時間
 EET: 東ヨーロッパ標準時間
 FET: 極東ヨーロッパ時間

 WEST: 西ヨーロッパ夏時間
 CEST: 中央ヨーロッパ夏時間
 EEST: 東ヨーロッパ夏時間
 FEST: 極東ヨーロッパ夏時間
EU-TZ 

- 北米(アメリカ、カナダ)
 PST: 太平洋標準時間
 MST: 山岳部標準時間
 CST: 中部標準時間
 EST: 東部標準時間

 PDT: 太平洋夏時間
 MDT: 山岳部夏時間
 CDT: 中部夏時間
 EDT: 東部夏時間

US-TZ 



プログラムの使い方

0:JST - 
日本時間 の入力と表示
       [0] キー: 日本時間入力

1:CET - ヨーロッパ時間の入力と表示
       [1] キー:    ヨーロッパ時間入力
       [1] キー長押し: ヨーロッパ内のタイムゾーン設定
       [3] キー:    ヨーロッパの夏時間ON/OFF
       [3] キー長押し: 夏時間の期間を表示
     
2:EDT
- 北米時間の入力と表示
       [2] キー:    北米時間入力
       [2] キー長押し: 北米内のタイムゾーン設定
       [4] キー:    北米の夏時間ON/OFF 
       [4] キー長押し: 夏時間の時間を表示

[3] キー、[4] キー長押しで表示される夏時間について:
2020年の夏時間の開始と終了は、ヨーロッパでは午前1時、北米では午前2時になっています。本プログラムでは、夏時間終了日を実際の設定日の前日を表示するようにしています。終了設定日の午前0時から午前1時 / 午前2時までの時間帯は、本来まだ夏時間のままですが、寝静まっている時間帯なので無視しています。現実的には問題ないと思いますが、留意してください。



プログラムの構成

メインプログラム: TIMEZONE
サブルーチン: TZCTZDTZMTZS、TZL
入力ボックス: INPI



プログラムファイル - TIMEZONE

※ fx-9860G/GII と fx-CG10/CG20/CG50 の純正Casio Basic ならびに C.Basic で動作します。

プログラムファイル (g1m) のダウンロード
プログラムファイル (g3m) のダウンロード

fx-9860G/GII ならびに fx-CG10/CG20/CG50 専用の入力ボックス INPI がそれぞれ必要です。

  • TIMEZONE には、入力ボックス INPI が必要です(ダウンロードファイルに含まれています)。
  • 同梱されている g1m ファイルは fx-9860GII 向けですが、変更せずそのまま fx-CG20 に転送すると正常動作します。但し fx-CG20 に転送後 fx-CG20用の g3m ファイルに変換されます。
  • ダウンロードファイルに含まれる Text_files フォルダ内に、ソースコード(テキストファイル)があります。これらテキストファイルは C.Basic で g1m ファイルから変換したものです。
  • サブルーチン TZL は、C.Basic で使用するものです。但し純正Casio Basic では実行が無視されるので転送しても問題ありません。
  • メインルーチン TIMEZONE の1行目の 300→L はキー長押し時間を決める。長押しと認識するまでの時間を短くするにはこの数値を小さくする。長くするには数値を大きくする。
  • C.Basic では 現在設定されている実際の実行速度に対応して サブルーチン TZL で長押し時間を自動調整しているので、1行目での長押し時間の設定は動作に影響しない。これは特にオーバクロック時に有効。
  • ヨーロッパと北米の夏時間期間表示は、サブルーチン TZS にある。2017年の夏時間に対応した変更を行っている。 



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


     


    keywords: fx-5800PCasioBasic、プログラムライブラリプログラム関数電卓

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



関連記事

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

fx-5800P プログラムライブラリ - Time Zone

プログラムライブラリ
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

最終更新:
2020/01/08

Time Zone (2020年版)

※ CcLinkerでfx-5800Pに転送できる CCLファイルがダウンロード可能に [2018/10/29]
2020年のヨーロッパ・北米夏時間に対応 [2018/01/20]
※※ プログラム改善: >>>> 表示で何も入力せず確定時、値が 0 に変更されていたのを変更しないように改善した [2017/08/14] 


著作権者

やす (Krtyski)
[当ブログ管理人]



対応機種

Casio fx-5800P 専用
Casio fx-9860G / fx-9860GII シリーズ、fx-CG10、fx-CG20、fx-CG50 用は こちら



プログラムの説明

TimeZone の作成方法は Casio Basic 入門をご覧下さい。

Time Zone は、日本、ヨーロッパ、北米での同じ時間を表示します。その際、タイムゾーンや夏時間を考慮した時間を計算します。

具体的には、3カ所のうち、どこか一カ所の時間を入力すると、時差を計算して他の二カ所の時間を表示するプログラムです。

例えば、日本、ドイツ、モントリオールの3カ所から接続して電話会議を行う時に、それぞれが夜中にならないように時間を決める時などに役立ちます。

2020年の夏時間期間:
 ・ヨーロッパ: 3月29日 午前1時 ~ 10月25日午前1時
 ・北米:3月8日午前2時 ~ 11月1日午前2時
TimeZoneでは、
 ・ヨーロッパ:3月29日 ~ 10月24日
 ・北米:3月8日 ~ 10月31日
としています。

以下のタイムゾーンや夏時間の設定が行えます。

- 日本
 JST: 日本標準時間

- ヨーロッパ
 WET: 西ヨーロッパ標準時間
 CET: 中央ヨーロッパ標準時間
 EET: 東ヨーロッパ標準時間
 FET: 極東ヨーロッパ時間

 WEST: 西ヨーロッパ夏時間
 CEST: 中央ヨーロッパ夏時間
 EEST: 東ヨーロッパ夏時間
 FEST: 極東ヨーロッパ夏時間
EU-TZ 

- 北米(アメリカ、カナダ)
 PST: 太平洋標準時間
 MST: 山岳部標準時間
 CST: 中部標準時間
 EST: 東部標準時間

 PDT: 太平洋夏時間
 MDT: 山岳部夏時間
 CDT: 中部夏時間
 EDT: 東部夏時間

US-TZ 



プログラムの使い方

0:JST - 日本時間 の入力と表示
       [0] キー: 日本時間入力

1:CET - ヨーロッパ時間の入力と表示
       [1] キー:    ヨーロッパ時間入力
       [1] キー長押し: ヨーロッパ内のタイムゾーン設定
       [3] キー:    ヨーロッパの夏時間ON/OFF
       [3] キー長押し: 夏時間の期間を表示
     
2:EDT
- 北米時間の入力と表示
       [2] キー:    北米時間入力
       [2] キー長押し: 北米内のタイムゾーン設定
       [4] キー:    北米の夏時間ON/OFF 
       [4] キー長押し: 夏時間の時間を表示

[3] キー、[4] キー長押しで表示される夏時間について:
(2018年版) 夏時間の開始と終了は、ヨーロッパでは午前1時、北米では午前2時となっています。本プログラムでは、夏時間終了日を実際の設定日の前日を表示するようにしています。終了設定日の午前0時から午前1時 / 午前2時までの時間帯は、本来まだ夏時間のままですが、寝静まっている時間帯なので無視しています。現実的には問題ないと思いますが、留意してください。


プログラムの構成

メインプログラム: TIMEZONE
サブルーチン: TZCTZDTZMTZS
入力ボックス: INPI



プログラムファイルのダウンロード

CcLinker で fx-5800P に転送できるCCLファイルのダウンロー
  ※ 上記6つのプログラムファイルに対応するCCLファイルが含まれます。
  CcLinkerの紹介

※ fx-5800P でのみ動作します。
fx-5800P 用入力ボックス INPI が必要です。
2020年版対応は、TSZ のみの更新です。






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


 


keywords: fx-5800PCasioBasic、プログラムライブラリプログラム関数電卓

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


関連記事

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

温故知新 - fx-9860G

プログラム電卓 温故知新
 - 搭載プログラミング言語に注目して、プログラム電卓の変遷を考える - 
<目次>


 
2020/01/04
追記 2020/01/07

過去から現在に至る性能や仕様の変化を調べ、プログラミング言語を中心にカシオ製プログラム電卓の系譜を明らかにする。

6. 新世代 Casio Basic の登場 - プログラム機能の大幅な向上

今回は、CFX-9850GC PLUS の後継機として海外で2005年発売の fx-9860G を取り上げる。国内では、fx-5800P が先に発売され(2006年9月)、その後に fx-9860G が発売されている (2006年10月以降)。国内と海外で発売時期が異なるのは珍しいことではない。
2006年9月発行のカシオ電卓総合カタログ
2007年12月発行のカシオ電卓総合カタログ

カシオ機に搭載されたプログラム言語に初めて GetkeyLocate が追加され、画面スクロール無しで入出力ができるようになったのが CFX-9850G であった。これに関数やコマンド類が追加され、このシリーズ最終モデルが CFX-9850GC PLUS であったが、プログラミング言語としては色々な癖があり、使い易いとは言えなかった。

CFX-9850GC PLUS の後継機種として、その言語仕様ならびにエディタ画面が大幅に改善された fx-9860G が今回取り上げるモデルで、これには 新世代Casio Basic と言うべき言語が搭載されていた。

[2020/01/07 追記]
2005年に発売されてから、fx-9860G の基本設計はそのまま新機種 (例えば、2020年での fx-CG50) に引き継がれてているのは、このモデルの設計がどれだけ野心的であったか、そしてその完成度の高さを示している。


Casio fx-9860G

fx-9860G_Calc
fx-9860G が、欧米で2005年に発売され、国内では 2006年10月以降(おそらく2007年?)に発売された。

カタログ 取扱説明書 (e-Gadgetサイト) 

CPUは、日立製SH3のカスタムチップ SH7705を使っている。

メインメモリは 63KBで、Casio Basicを含めたOSが格納されている。

fx-9860G
の最大の特徴の1つはアドインプログラムが使えるようになったことで、1.5MBもの(当時としては広大な)ストレージメモリ(保存メモリ)を備えており、アドインプログラムを保存し走らせることが出来る。なお、アドインプログラム作成用のSDKも公開された。SDKの入手

なお、オーストラリア版の fx-9860G AU は、理由が不明だがストレージメモリが 0.8MB と少ない。

液晶周りの光沢コーティングや筐体裏側のつや消し黒塗装は高級感を演出していて、個人的には好きなデザインだ。

OSの変遷
2005年の発売当初のOSバージョンは 1.02、その後 1.03、1.04、1.05 とアップデートファイルが提供された。
2009年に fx-9860GII (SH3, OS2.00) が発売されると、機能を近づけた(実は完全に同じにならなかった) fx-9860G 用の OS2.00 へのアップデートファイルが公開され、その後 OS2.01 へのアップデートファイルが提供された。

OS 1.02 と 1.03 では Casio Basicの処理速度には大きな違いがなく、一連のバージョンの中で最速であった。OSがアップデートするにつれCasio Basicのデバッグと機能追加が進むが、一方で処理速度は遅くなる傾向は確実にある。実際にベンチマークを行った結果は以下に示す。

電源の変更
1つ前の機種 CFX-9850GC PLUS までは、駆動用電池に加えてバップアップ用電池を使っていた。fx-9860G も初期はバックアップ用のコイン型リチウム電池CR2032を用いていたが、そのうちバックアップ電池を使わずに単四電池4本のみでバックアップ機能を実現するようにマイナーアップデートされた。

fx-9860G_Battery_Case2 
左は コイン型リチウム電池 CR2032 を使うモデル、右は 単四4本のみでバックアップ機能のあるもの。バックアップ電池用の樹脂型が修正され、その跡が見てとれるのが興味深い。この電源周りのバージョンアップは特にアナウンスされないままマイナーバージョンアップされたようだ。

関数電卓としての性能

分数表示と演算精度
235÷658 を計算すると 0.3571428571 と表示される。ここで、[F↔D]キーを押すと 5/14  と表示される。計算精度は内部15桁だ。

複素指数関数
eπi を計算してみる。計算できれば答えは -1 になる。
1つ前の機種 fx-9850GC PLUS では複素指数関数の計算ができず、演算エラー(Ma ERROR) になったが、fx-9860G で初めて複素指数関数の計算に対応した。

一方、e(5/3)πi を計算させると、0.5 - 0.8660254038i と表示され、[F↔D]キーを押すと 1/2 - 0.8660254038i  と表示される (OSバージョンによらない)。なお、次の機種 fx-9860GII 以降は自然数式表示機能が徹底され、これを計算すると 1/2 - √3/2i と表示される。
 

搭載言語 (Casio Basic) の概要

fx-9860G OS1.0x では、CFX-9850GC PLUS の搭載コマンドと同一である。その後 OS2.01 では 次機種の fx-9860GII で追加された文字列処理や細かなコマンドと同じものが追加された。

主なコマンド (OS1.0x) [2020/01/07 修正 ※]
 - 入力:?→, Getkey
 - 出力:" ", , Locate
 - テキスト画面消去:ClrText
 - 無条件ジャンプ:Goto / Lbl
 - 条件ジャンプ: (fx-4000P、7000G と同じ仕様)
 - カウントジャンプ:Isz, Dsz
 - 条件分岐:If / Then / Else / IfEnd
 - For ループ:For / To / Step / Next
 - Do ループ:Do / LpWhile
 - While ループ:While / WhileEnd
 - 制御コマンド:Break, Return, Stop
 - 比較演算: =,, >, <,,
 - 論理演算: And, Or, Not
 - 配列:無し
 - リスト:List (配列としても使える)
 - 行列:Mat (配列としても使える)、行列初期化コマンド
Dim
 - 各種関数

1つ前の機種 CFX-9850GC PLUS の以下の問題は解消されている;
 - Then / Else 直後の改行:Syn ERROR になる
 - 行頭での改行 (空白行):Sys ERROR になる

 主なグラフィック コマンド [OS1.0x]
 - グラフ設定:CoordOn/CoordOff, GridOn/GridOff,
        AxesOn/AxesOff, LabelOn/LabelOff
 - 座標系設定:ViewWindow,
        Xmax/Xmin/Xscl/Xfct, XdotYmax/Ymin/Yscl/
Yfct
 - 消去コマンド:ClrGraph, Cls
 - Sketchコマンド:Plot, PlotOn/PlotOff, PlotChg, PxlOn, PxlOff, PxlTest
          Line, F-Line, Vertical, Horizontal, Circle
 - 各種グラフコマンド

但し、Plot, PlotOn, PlotOff, PlotChg, PxlOn, PxlOff, PxlChg, Circle の詳細仕様は、CFX-9850GC PLUS と異なり、これらのコマンドのパラメータに X, Y を使えるが、これらのコマンドを実行すると論理座標系での X と Y の値が 変数 X と Y に自動的に入力される仕様を意識して X と Y を使う必要がある。


プログラムの作成と実行
キーコード取得プログラムを入力した。コマンドを入力するためのキー (キープレス) は、1つ前の CFX-9850GC PLUSfx-9860Gシリーズ、fx-9860GIIシリーズ、最新の fx-CGシリーズと全く同じだ。言語機能の基本仕様は1つ前の機種 (CFX-9850GC PLUS) から固まっていることが分かる

ファイル名:GETKEY
Locate 1,1,"=== Get Keycode ==="
Locate 1,3,"Keycode ="
Locate 10,5,"Hit Any Key"
Locate 13,7,"[AC]:Quit"
While Getkey
WhileEnd
Do
Do:Getkey→K
LpWhile K=0
Locate 9,3,"=   "
(スペース6個)
Locate 11,3,K
LpWhile 1


Keycode 
この画面は、[DEL]キーを押して、キーコード44が表示されているところだ。
なお、fx-9860G では アルファベットの小文字をプログラムで使えるようになった。
fx-9860GIIシリーズや fx-CGシリーズと同様に、テキスト表示の範囲は21桁、7行だ。

プログラムリスト
Program_List 
Program List には、アルファベット順にプログラム名 (ファイル名) が並んでおり、アルファベット順になっていなかった CFX-9850GC PLUS の入力順という仕様よりも大幅に使いやすく改善されている。

プログラムの編集
プログラム編集画面は、挿入モードになっており、使いやすい。

1つ前の CFX-9850GC PLUS まではプログラム編集は上書きモードになっており、極めて使いづらかった。ちなみにスタンダード関数電卓 (fx-991MSなど) も上書きモードになっていた。実は、2005年以降発売のプログラム電卓 (fx-9860G) やスタンダード関数電卓 (fx-991ES) から一斉に上書きモードに変更されている。
 
パソコンで文章を書く時は、通常は挿入モードで利用しているはずで、上書きモードは必要な時のみ切り替えて使うと思う。fx-9860Gシリーズ以降のプログラム電タムでは、プログラム編集画面は常に挿入モードになっていて、必要な時に [SHIFT]-[DELL](INS) と押して上書きモードに切り替えて使う。

以前のプログラム電卓やポケコンでは、区切り文字を使ってプログラムをズラズラと1行に書いていた。fx-9860G において、そのく仕様から完全に決別したと言える。


プログラムの転送
3Pin_USB_Link PCリンク : 3Pin - USB ケーブル利用
3pin-USBケーブル (SB-88) と プログラムリンク ソフトウェア (FA-124) を使えばPCリンクや電卓の画面取得が可能になる。
3pin-USBケーブル (SB-88)
現在は製造中止品だが、takumako様により互換ケーブルが有償頒布されているので私はこれを利用した。
プログラムリンク ソフトウェア (FA-124)
カシオのサイトから無償ダウンロードできる。

 電卓間転送
3pin-3pinケーブル (SB-62) を使えば、3pin端子のあるグラフ関数電卓とプログラムの転送ができる。
3pin-3pinケーブル (SB-62)
まだ販売されているが、takumako様により互換ケーブルが有償頒布されている。SB-62 は fx-9860Gシリーズや fx-CGシリーズの国内正規版には標準添付されている。

USB_USB_Link PCリンク:USB (mini) - USA (A) ケーブル利用 
fx-9860G に同梱される USB(mini)-USB(A)ケーブルを用いると、3Pin-USBケーブル利用よりも高速に転送可能だ。プログラムリンクソフトウェア (FA-124) を使えばPCリンクや電卓の画面取得が可能になる。


ところで、PCへ転送されるファイルは g1m ファイル (拡張子 g1m) だ。










テキストベース・プログラム
モグラ叩きゲーム
以前 fx-9860GII で作ったアクションゲーム - "Whack-a-Mole (もぐら叩き)" を転送した。fx-9860G の OS2.0 以上なら完全互換で動作した。ここで転送したプログラムファイルは、WHACKAMOWAMINPI の3つだ。

WAM_1 WAM_2 

fx-9860G OS1.02OS1.05 では、RanInt#( 関数が備わっていないので、RanInt#( の代わりに Int(Ran#( を使って同等に動作するように変更する必要があった。OS2.0 以上にアップデートすれば、RanInt#( 関数が追加さるので、fx-9860GII と完全互換で動作するようになる。


fx-9860G でのプログラミング

1つ前の CFX-9850GC PLUS からの改善点
CFX-9850GC PLUS のプログラミング言語 Casio Basic は数々の問題が残っていたが、fx-9860G で殆ど改善された。以下に個別の項目を列挙する。

空行 (改行のみの行) はSyn ERROR になる
 この問題は改善された。これは、昔の1行プログラミングの時代の影響が解消された。

Then / Else の直後を改行すると Syn ERROR になる
 この問題は改善された。上の空行禁止の問題の解消と併せて、If ステートメントの可読性が大いに向上した。

ループ (While / Do) の2重構造で、内側のループと If の入れ子構造が共存すると IfEnd のところで Syn ERROR になる
 この問題は改善された。このエラーは、While / DoIf の構造制御のスタック管理に失敗しているバグと考えられ、構造制御ステートメント While / Do を追加した直後に潜り込んだバグだったと思われる。 

出力 "" で内部カーソルが改行されない
 この問題は改善された。

行末に区切り文字 : があると Syn ERROR になる
 この問題は改善された。

出力文字列に : を含む行を ' でコメントアウトすると Syn ERRORになる
 ※対策:機切り文字 : の直後に ' を付加する
この問題は、fx-9860Gだけでなく、fx-9860GII や fx-CGシリーズにも残っており、カシオは操作マニュアルを修正して対応している。詳しくは 楽屋裏 - Casio Basic コメントアウト '  のバグ を参照

出力命令 " " では1文字ごとに出力する
"Strings" を実行するとタイプライターのように1左から1文字づつ出力されることは無くなった

fx-9860G OS1.0x では実装されていない関数やコマンドでの Syn ERROR
例えば、Whack-a-Mole (モグラ叩きゲーム) で使っている、RanInt#( は OS2.00 以降にはあるが、OS1.0x には無い。そこで、以下のようにすれば対抗可能だ。 
- RanInt#(1,9)Int(90Ran#÷10)+1 に変更
- RanInt#(1,3)Int(30Ran#÷10)+1 に変更
- RanInt#(0,9)Int(10Ran#) に変更

Do / While / For ループからの脱出に Dsz / Isz を使うと Syn ERROR になる
 ※対策:ループを Lbl / Goto に置き換えるか、ループ脱出に Break を使う
この現象は、fx-5800Pfx-9860G 以降のグラフ関数電卓でも存在することが確認されている。
⇒ 楽屋裏 - Dsz によるループ脱出 参照
カシオお客様サポートのご担当者とのやりとりの結果、ループの後 (必ずしも直後でなくても良い) に Goto 0:Lbl 0 と記述することでこのエラーを回避できることが分かっている (詳細は上記記事参照)。


処理速度の比較

四則演算および関数計算

加算プログラム
加算 

プログラムを起動し、N に 1000 を入力して実行時間を計る。

fx-9860G のプログラム
fx7000G_source_adding_up_Isz2 AddTest_For 
繰り返しに Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。


数値積分プログラム
関数 

この通史積分は、とね日記 - 席初の手帳型プログラム関数電卓 CASIO FX-502P (1979), FX602P (1981) で取り上げられているものをそのまま使わせていただく。

プログラム起動し、分割数として 1000 を入力して、時効時間を計る。

fx-9860GS のプログラム
FuncTest_Goto_9850 FuncTest_For_985 
クリア絵師に Goto / Lbl を使うケース(左)と For を使うケース(右)の2通りで処理速度を調べる。

以前調べた結果と併せて、上記の計算速度のを比較結果を示す [2019/07/31 修正]
加算プログラム数値積分プログラム
機種実行時間比較実行時間 (秒)比較
FX-502P123.1 秒---1261.8 秒---
FX-602P111.2 秒1.1 倍716.5 秒1.8 倍
FX-603P37.8 秒3.3 倍166.2 秒7.6 倍
fx-4000P61.7 秒2.0 倍349.1秒3.6 倍
fx-4500P195.0 秒0.6 倍798.1 秒1.6 倍

fx-4800P
A=A+126.3 秒4.7 倍114.3 秒11.0 倍
Isz A21.2. 秒5.8 倍109.4 秒 11.5 倍
fx-7000GA=A+120.7 秒5.9 倍146.1 秒8.6 倍
Isz A19.3 秒6.4 倍143.2 秒8.8 倍
CFX-9850GGoto20.9 秒5.9 倍98.3 秒12.8  倍
For9.2 秒13.4 倍84.3 秒15.0 倍
CFX-9850GC PLUSGoto22.0 秒5.6 倍100 秒12.6 倍
For9.2 秒13.4 倍85.4 秒14.8 倍






fx-9860G

OS 1.02
Goto2.1 秒61.6 倍14.6 秒86.4 倍
For1.3 秒94.7倍13.2 秒95.6 倍
OS 1.03Goto2.1 秒61.6 倍14.4 秒87.6 倍
For1.1 秒111.9 倍13.1 秒96.3 倍
OS 1.04Goto2.5 秒61.6 倍14.3 秒88.2 倍
For1.2 秒102.6 倍13.0 秒97.1 倍
OS 1.05Goto2.3 秒61.6 倍14.3 秒88.2 倍
For1.2 秒102.6 倍13.1 秒96.3 倍
OS 2.01Goto3.6 秒34.2 倍17.0 秒74.2 倍
For2.5 秒49.2 倍15.1 秒83.6 倍
記念すべき FX-502P を基準に、速度が何倍になっているかも併せて示している。

加算処理、数値積分(関数処理) は格段に高速化し、FX-502P の 100倍程度だ。Goto / Lbl ループより For の方が倍近く速い。
OSのバージョンにより、処理速度の差が顕著に表れている。OS 1.03 と OS 1.04 が最も高速だ。
次機種 fx-9860GII の登場に併せてがOS 2.01 へのアップデートファイルが提供され、使える関数が増強された。但し処理速度は遅くなった。


グラフィックス描画
▶ ドット描画プログラム

fx-7000G のグラフィック画面が 95 x 63 ドットなので、それに合わせて fx-9860G でも 95 x 63 ドットを塗りつぶして処理速度を比較する。

fx-7000G のプログラム
fx7000G_Dot DOT_fx7000G  

fx-9860G のプログラム
Dot_Plot Dot_Pxl 
Plot を使うケース(左)と PxlOn を使うケースの2通りで処理速度を調べる。

PlotPxlOn
fx-7000G213 秒
CFX-9850G926.5 秒0.23 倍496.0 秒0.43 倍
CFX-9850GC PLUS901.1 秒0.24 倍929.1 秒0.23 倍
fx-9860GOS 1.02251.2 秒0.85 倍255.7 秒0.83 倍
OS 1.03251.7 秒0.84 倍256.6 秒0.83 倍
OS 1.04252.8 秒0.84 倍257.5 秒0.83 倍
OS 1.05251.9 秒0.85 倍256.7 秒0.83 倍
OS 2.01295.8 秒0.72 倍301.7 秒0.71 倍

fx-9860G では、CFX-9850GC PLUS よりも3倍程度高速化している。
また1つ前の CFX-9850GC PLUS では、PxlOn によるドット描画は Plot の2倍程度の処理時間であったが、fx-9860G では PxlOnPlot は同等レベル、PxlOn が僅かに高速であった。

但し、fx-7000G よりは依然遅い。加算処理や関数処理は大幅に高速化しているのに、ドット描画が大変遅い理由として画面更新が大変遅いことが挙げられる。


画面更新プログラム
上で、画面へのデータ転送が処理速度のボトルネックになることが分かったので、頻繁に画面更新するプログラムを実行して、その処理速度を調べて比較することにする。

ところで Getkey コマンドが返すキーコードは、テンキーや[EXE]キーだけでなく、[AC]を除く全てのキーに対応しており、Locate コマンドで任意の位置への出力が可能なので、プログラムの自由度が大きく、画面がスクロールしないプログラムを書ける。そして画面がスクロールしないプログラムでは、画面更新速度は重要な評価ポイントになる。これが適用できるのは、CFX-9850G, CFX-9850GC PLUS そして fx-9860G なので、これらのデータを比較する。

出力画面は、テキスト画面とグラフィックス画面 (グラフ画面) の2つがあり、これらは同時に表示できない。そこでテキスト画面の高速更新プログラムとグラフィックス画面の高速更新プログラムを作成して評価に利用することにする。

グラフィックス画面更新プログラム - モンテカルロ法にょる円周率計算 - MONTECAR
Moneca_fx-9860G 
プログラムのダウンロード - Montecar.g1m を電卓に転送する
プログラムの詳細はこちら
ランダムに500回点を打って出力するまでの時間を調べる。

テキスト画面更新プログラム - ピタゴラス数の計算 - PYTHA
Pytha_fx9860G 
プログラムのダウンロード - PYTHA.g1m を電卓に転送する
プログラムの詳細はこちら
ピタゴラス数500個を計算して結果を出力するまでの時間を調べる。

MONTECARPYTHA
CFX-9850G294.3 秒165.6 秒
CFX-9850GC PLUS295.2 秒0.99 倍267.7 秒0.62 倍
fx-9860GOS 1.0276.0 秒3.87 倍115.4 秒1.44 倍
OS 1.0389.3 秒3.30 倍115.8 秒1.43 倍
OS 1.0489.4 秒3.30 倍115.8 秒1.43 倍
OS 1.0589.2 秒3.30 倍115.9 秒1.43 倍
OS 2.0195.8 秒3.07 倍128.7 秒1.29 倍

GetkeyLocate を最初に搭載した CFX-9860G を基準に、処理速度の比率も合わせて示した。

MONTECAR はグラフィック画面にドットを繰り返し描画する。fx-9860G での処理速度向上は3倍以上になった。PYTHA はテキスト画面に文字を繰り返し出力する。fx-9860G での処理速度は 1.3~1.4倍程度となった。これらの比較から、fx-9860G ではテキスト出力は多少速くなり、グラフィックス出力が大きく向上したと言える。

fx-9860G のOS が 1.0x から 2.01 にアップデートされると、明らかに画面出力が遅くなったことも併せて分かる。


プログラム電卓の系譜 

単なる計算やグラフ表示のマクロ言語から脱却し、アプリケーションとしてのプログラムを書けるように進化した Casio Basic を搭載したのが fx-9860G だ。カシオのプログラム電卓の中で極めて大きな進化を遂げたモデルであり、現行モデルの基本設計がこのモデルで固まった。

fx-9860G は、カシオのプログラム電卓で初めてアドインプログラムを走らせることができ、それを開発するための公式SDKを提供した野心的なモデルでもある。

プログラム編集モードにおいて 挿入モードがデフォルトになった点も高く評価できる。2005年発売の fx-9860G だけでなく、この年以降に発売されるプログラム電卓と関数電卓の全てがデフォルトで挿入モードに変更されているのは、カシオ電卓事業における大きな判断があったと思われる。

2005年発売の fx-9860G のハードウェア仕様、関数やコマンド類全てにおける基本設計は、2020年現在の fx-CG50 にまで引き継がれている。

fx-9860G は、新たにUSBポートを備え、PCとUSBケーブルでリンクできるようになり、従来の 3Pin - USB接続よりも高速なデータ転送が可能になった。SDカードをストレージとして使える fx-9860G SD が同時発売されたことから、データ保存とデータリンクに新たな機能を提供するモデルとなった。

さらに 2007年発売の fx-9860G Slim も重要なモデルで、クラムシェル(2つ折り)タイプで小型化しつつ液晶画面の大型化が実現した。ハンドヘルド電卓として世界初のバックライト機能も追加された。fx-9860G シリーズがカシオ電卓の開発史上重要なマイルストーンに位置づけられるモデルだと言える

fx-9860G シリーズに搭載されている Casio Basic は、fx-4000Pfx-7000G の上位互換の仕様を有しており、Casio basic の系譜は fx-9860G に引き継がれ、大きく改善され、ようやくマクロ処理ではない実用的なアプリ開発が可能な言語に仕上がった集大成が fx-9860G である。

fx-9860G の Casio Basic は、fx-5800P に移植され、さらに改善されることになる。



温故知新 - FX-502P / FX-602P / FX-603P
温故知新 - fx-4000P / fx-4500P / fx-4800P
温故知新 - fx-7000G
温故知新 - CFX-9850G
温故知新 - CFX-9850GC PLUS

温故知新 - fx-9860G
温故知新 - fx-5800P
温故知新 - fx-CP400
温故知新:番外編 - 関数電卓としての使い勝手



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


 


keywords: プログラム関数電卓、プログラミング、Casio Basic、CFX-9850GC PLUS

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













関連記事

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

プログラム電卓 温故知新

プログラム電卓 温故知新
 - 搭載プログラミング言語に注目して、プログラム電卓の変遷を考える -

 
2020/01/04

特定のカシオ製プログラム電卓について、過去から現在に至る性能や仕様の変化を調べ、プログラミング言語を中心にカシオ製プログラム電卓の系譜を明らかにする。


目 次

温故知新 - FX-502P / FX-602P / FX-603P
 1. キーストローク式言語 - 携帯型プログラム電卓の普及

温故知新 - fx-4000P / fx-4500P / fx-4800P
 2. 新しいプログラミング言語の指向 - 可読性の向上

温故知新 - fx-7000G
 3. グラフ機能の追加

温故知新 - CFX-9850G
 4. Casio Basic 登場 - 可読性と機能の向上 (1)

温故知新 - CFX-9850GC PLUS
 5. 新世代 Casio Basic 登場前夜 - 可読性と機能の向上 (2)

温故知新 - fx-9860G
 6. 新世代 Casio Basic の登場 - プログラム機能の大幅な向上

温故知新 - fx-5800P
 

温故知新 - fx-9860GII
 

温故知新 - fx-CG10 / CG20 / CG50
 

温故知新 - fx-CP400
 

温故知新:番外編 - 関数電卓としての使い勝手









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


 


keywords: プログラム関数電卓、プログラミング、Casio Basic、CFX-9850GC PLUS

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













関連記事

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

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

やす (Krtyski)

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


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

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

なお管理人はカシオ計算機の関係者ではなく、Casio Basicが面白いと感じる1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR