e-Gadget - プログラム関数電卓 2015年06月

楽屋裏 - Casio Basic のグラフィックス プログラミング

楽 屋 裏
e-Gadget

修正 2015/06/24

fx-9860GII は、グラフィックス表示が可能で、fx-5800P には無い楽しさや利便性があります。

以前、簡単に触れました;
楽屋裏 - Casio Basic のグラフィックス描画

fx-9860GII は、グラフ関数電卓の名の通り、数学の学習を主な用途として考えられていて、数式やデータからグラフの描画、変換、比較などを行える各種機能があります。つまり、PCなどで使うプログラミング言語のグラフィックス機能とは、少し方向性が違います。それは、Casio Basic 、特にグラフィックスのコマンド仕様に反映されています。



fx-9860GIIグラフィックス コマンド

fx-5800P の取扱説明書は、Casio Basic のコマンドの説明があまり親切ではありませんが、ほぼ全てのコマンドが簡単な説明付で掲載されています(行列だけが例外と言えます)。

ところが、fx-9860GII の取扱説明書には、実際に機能が搭載されているのに取扱説明書に説明のないコマンドがかなり多くあります。グラフィックス関係のコマンドもそうです。

なお、電卓本体には、[SHIFT] [4] (CATALOG) キーがあり、ここでは全コマンド類が全て含まれています。このリストを手がかりに、色々調べてみようと思っています。


さて、よく使いそうなグラフィックス関係のコマンドは、主に以下のメニューにあります。
・設定コマンド: [SHIFT] [MENU] (SET UP) 
・描画コマンド: [SHIFT] [F4] (Sketch) 
・座標設定: [SHIFT] [F3] (V-Window)
・グラフィックス消去: [SHIFT] [VARS] [F6] (▷) [F1] (CLR) [F2] (Grph)

各種設定、座標設定、点、円、線の描画、消去といった基本的なコマンド類は、これらのメニューから呼び出せます。



Casio Basic 入門 - 新連載の予告

これまで、fx-5800P を中心に Casio Basic 入門を連載してきました。各種コマンド類の使い方、アルゴリズムの紹介をして、ある程度実用的なプログラムを完成させる、といったスタイルです。

これに加えて、fx-9860GII でのグラフィックス プログラミングの紹介を追加してゆくことにしました。先ずは、上記の基本的なコマンド類について、取りあえず私が納得する範囲で調べたその結果を Casio Basic 入門 で紹介します。但し、具体的なゲームなどのプログラム作りは行わず、各コマンドの機能、制限、内部動作が分かるようなプログラムを作ってゆくスタイルにします。

コマンドを実際にみてゆくと、古いグラフ関数電卓から搭載されていたものに加えて、後から追加されたものがあります。このような流れを念頭にして、色々と調べてゆくと、内部動作を垣間見ることもでき、面白いものです。詳しくは Casio Basic 入門で紹介します。さらに、コマンドリファレンスにも追加する予定です。

その後は、グラフ機能や統計計算機能に付随する描画機能も調べてみて、グラフィックス描画性能を上げる可能性も探りたいと思っています。



画面を塗りつぶしてみる

カシオのグラフ関数電卓でのグラフィックス描画は、概して遅いと言えます。しかし、グラフィックス機能といえばゲームプログラミングだと思いますが、そもそも fx-9860GII はどのくらい遅いのか、sentaro 様にご協力頂きながら、実際に調べてみました。

単純に、LCD画面の下半分をドットで塗りつぶすプログラムです。下のプログラムを実際に入力するか、Markout.g1m ファイルをダウンロードして転送し、実際に実行してみてください。

Casio Basic 版 塗りつぶしプログラム MarkOut

ClrGraph
AxesOff
CoordOff
GridOff
LabelOff
ViewWindow 0,126,0,0,62,0
For 0→Y To 31
For 0→X To 126
PlotOn X,Y
Next:Next


以下からダウンロード;
MarkOut.g1m

fx-9860GII でのグラフィックス描画は、一旦メモリにグラフィックスデータを送り、それを LCD 画面に転送する手順で実行されます。Casio Basic では、VRAMへの書き込みとLCDへの転送が、コマンドごとに行われます。

一方、SDK で Addd-in を作る場合は、VRAMへの書き込みとLCDへの転送を、個別に指示できるので、VRAMへのデータ書き込みをある程度まとめて行った後、LCDへ一気に転送すれば描画が速くなる筈です。LCDへのデータ転送の間引きを 1/10 にするのか、1/100 にするのか、1/1000 にするのかで、どの程度速度が変わるのか、試せるように Add-in を作りました。Casio Basic のアルゴリズムをそのまま採用しています。

Casio Basic では、プログラム実行の途中でも [AC] キーで強制終了できます。そこで、Add-in でも描画の途中で [AC] キーで強制終了できるようにしています。

Casio Basic に無い要素として、1ms の分解能のタイマーを同時に走らせて、実行時間の測定を行えるようにしています。このルーチンは sentaro 様が公開されているソースから、流用させて頂いています。

さて、プログラムを作って走らせている際、キースキャン ([AC] キーの検出、Casio Basic の Getkey に相当) が意外と時間を喰っていることに気付き、キースキャンも上と同様に間引きして、その影響をチェックできるようにしました。


Add-in 版塗りつぶしプログラム

以下からダウンロード;
MarkOut.zip


[2015/06/24 修正]
sentaro様からコメントを頂きました。

Add-in 版 MarkOut は、[F1] ~ [F4]を押して測定を開始する。Casio Basic 版と同様に、測定中は [AC] キーを押したら強制終了するようにするため、測定中でもプログラム内で [AC] キーをスキャンして、[AC] キー以外を押すとキースキャンがスキップされてプログラム実行速度が速くなる。逆に言えば、測定開始のために [F1] ~ [F4] を押すと、押した時だけプログラムが加速されていまうので、正しい時間測定にならない。
そこで、[F1] ~ [F4] を押して各測定モードに入った後、[EXE] キーが押されてからキーアップしたタイミングで測定開始させれば、上記の問題は解消される。

その通りですね。そして、これを実現した改良版を作って頂きました。上からダウンロードする Add-in は、この sentaro様の改良版に変更しました。sentaro様、ありがとうございます。
=====

先ずは、LCDへの転送を間引くと瞬間に描画が終わります。Casio Basic では、ドットを1つ描画するたびに LCD転送しているわけで、LCD転送が如何に時間のかかる処理か、とてもよくわかります。

グラフィックス プログラミングは、高速化が必要なプログラムには SDK で作る必要がありそうです。

なお、キースキャンも、LCD転送ほどでは無いのですが、結構な時間がかかっていることが分かります。

LCD Trasnfer Check モードで実行中に、[AC] キー以外を長押ししてみると、さらに増速します。キースキャンを減らしていることになるからです。


Casio Basic でのグラフィックス描画は、遅いという弱点がありますが、画面を全て塗りつぶすような重い処理でなければ、利用価値は多くあると思います。先ずは 実装されているコマンドをしっかりと理解して、使いこなそうと思います。



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


 



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

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

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

fx-995ES / fx-993ES / fx-991ES のイースターエッグ

  ▶ CASIO電卓の自己診断機能 - 目次


  2015/06/20

fx-JP900 以外の最近のカシオ製スタンダード関数電卓、特にドットマトリックス液晶を備えた機種のイースターエッグ/自己診断機能を、所有している電卓についてもまとめてみます。

発端は、akatuki様によるブログ:高機能電卓の情報の記事、素晴らしい!「CLASSWIZ」の記事 のコメント欄でのやりとりです。fx-JP900 以外のカシオ関数電卓の自己診断機能についてもまとめてみます。

自己診断機能を開始させるキーの組み合わせは、fx-995ES、fx-993ES、fx-991ES は全く同じです(fx-JP900 とも同じ)。診断モードでは、液晶表示チェックとキー入力チェックを行う。これら3機種は、同じパターンの青液晶のパネルを使っていて、ドットマトリックスと、その上のインジケータでパターンが構成されています。

なお、fx-JP900 の診断モードで行うキーマトリックスのチェックと電源チェックは、これらの機種では行いません。他の診断モードがあるならば、これを起動するキーの組み合わせがまだ不明です。


fx-995ES / fx-993ES / fx-991ES の診断モード
Int_fx-995ES Int_fx-993ES Int_fx-991ES 


診断モードに入るには、[SHIFT]+[7] を同時押ししたまま [ON]を押します。この操作は電源が入っている、入っていないに関わらず有効です。これは、最近のカシオのスタンダード関数電卓でほぼ共通のようです。

診断モードの動作は、fx-995ES と fx-993ES は全く同じです。これらは、診断モードに入ると、

DIAGNOSTIC

Press AC


と表示されます。ここで何もしないと、診断モードを抜けて通常の計算モードに移行します。この表示がされた後、タイムアウトする前に [9] を押すと診断ル-チンが始まります。

fx-991ES は、診断モードに入ると、すぐに液晶チェックが始まります。その後の動作は、fx-995ES / fx-993ES とほぼ同じです。

操作画面出力
[SHIFT]+[7]+[ON]診断モードに入る
1[9]液晶のインジケータと全ドットON
2[SHIFT]液晶のインジケータと全ドットOFF
3[SHIFT]ドット領域外縁の1ドットのみON(枠の表示)、但し中間輝度
4[SHIFT]インジケータ半分、ドットは1つおき(千鳥格子)にON、但し中間輝度
5[SHIFT]残りのインジケータとドットを表示
6[SHIFT]ファームウェアバージョン表示、
CPUとメモリチェック(?)
7[AC]コントラストチェック
8[AC]00 と表示 ([AC] のキーチェック?)
9[SHIFT]01と表示、他のキーは受け付けない
10[ALPHA]02と表示、他のキーは受け付けない
11[上矢印]03と表示、他のキーは受け付けない
12[右矢印]04と表示、他のキーは受け付けない
13[MODE/SETUP]05と表示、他のキーは受け付けない
14[CALC]06と表示、他のキーは受け付けない
15[積分]07と表示、他のキーは受け付けない
16[左矢印]08と表示、他のキーは受け付けない
17[下矢印]09と表示、他のキーは受け付けない
18[x-1]10と表示、他のキーは受け付けない
19[log□]11と表示、他のキーは受け付けない
20[分数] ~ [ln] まで順に押す12, 13, 14, 15, 16, 17 と順に表示、他のキーは受け付けない
21[(-)] ~ [Ans] まで左から右、上から下へ順に押す18 から 48まで順に表示、他のキーは受け付けない
22※)[=]TEST OK

Reset All
Press AC
23[AC]診断モード終了、計算モードへ移行

※) fx-991ES では、出力メッセージの3行目が Press ON となる。
TEST OK

Reset All
Press ON
 








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


 




keywords: fx-995ES、fx-993ESfx-991ES関数電卓、イースタエッグ、診断機能

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

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

fx-JP900 と fx-5800P 後継機への期待

  更新 2015/06/14

fx-JP900_x480 

これまで、独断と偏見で fx-JP900 に関して述べてきましたが、実際に使っているうちに、このデザインが益々好きになってきました...カシオの電卓で初めての気分です。

前の記事で、白の筐体とカバーは長期使用を考えるとよろしくないと書きましたが、エンボス処理した黒と白を基調にシルバーがアクセントを添えるこのデザインには、ケースの白色の必要性がわかります。

素因数分解の計算速度をプログラム電卓と比較することで(sentaro様の分析を参照)、 fx-JP900 の CPU は fx-5800P と同等以上で、なおかつ低消費電力 (1Vでの動作保証?)と、推察されます。メモリは、fx-955ES の倍の容量になっています。

関数電卓のターゲットは教育市場で、学生や先生に学校で使って貰えることを主眼に設計されていて、高精細液晶も教育現場の声が反映されていて、理工系の学生が想定ユーザーなのは既知のことです。ところが、今回は学校を卒業した後の技術者に所有する喜びを持って貰うデザインにしたのだそうです(下記の参考ホームページにある記事の動画で、開発者が語っています)。

ニュースリリースでは、fx-JP900/700/500 まとめて年間20万台生産の計画になっています。海外では それぞれの現地に合わせた異なる型式が国内よりも多いラインアップで投入されています。デザインに拘って、従来の関数電卓ユーザーの買い換え需要を意識しているに違いないのです。



カシオの関数電卓には、スタンダード関数電卓、グラフ関数電卓、そしてプログラム関数電卓の3つのカテゴリがあります。それらが、それぞれ1歩づつ進化し、互いに取り込み、さらにそれぞれが進化する、これまでのやり方です。

最近のスタンダード関数電卓では、主に表示と入力方法が進化しています。グラフ関数電卓では、主に表示のカラー化とCasio Basicの進化が進んでいます。おそらく新しい要素技術の量産化は、スタンダード関数電卓で低コスト化を主に進め、プログラム関数電卓ではマーケティング要素で製品化する過程で、互いに良いところを取り込みながら進化してきています。

進化の一例としては、現在のグラフ関数電卓では、プログラム実行のためには、いちいち Program モードに入る必要があります。日常的にプログラムを使うにはこれが、なかなか不便です。これに対して fx-5800P は、Programモードに入らずに、プログラムリストを表示して実行させるための [FILE] キーが備わっているので、日常的にプログラムを使うには、とても利便性が良くなっています。このように、グラフ関数電卓のプログラム機能を、使いやすくチューニングしているわけです。これが、プログラム関数電卓の位置づけのように思われます。



スタンダード関数電卓 fx-991ES での新機軸、自然数学入力機能をベースに、fx-9860G の Casio Basci を融合させて、fx-4850P のハードウェアデザインとソフトウェアメニューを組み合わせて fx-5800P が作られたと考えられます。

最近の流れはどうか?

土木測量専業電卓 fx-FD10 Pro は、これまでのグラフ関数電卓をベースに、fx-5800P に備わったプログラム実行の利便性、そして旧来の命令である 入力命令にも fx-5800P と同じ利便性が備わっています。私は、fx-FD10 Pro は、fx-5800P の1つの進化形としての実験的なモデルだと見ています。

10年以上(16年間)継続発売されていた FX-603P の後継機としての fx-5800P は、2006年の発売開始から今年で9年目。このタイミングで、最新のハードウェアとデザインで、新機軸を打ち出した関数電卓 fx-JP900 の登場。さらに、プログラム電卓として fx-FD10 Pro で先行実験も済んでいます。fx-5800P 登場前夜とよく似た状況です。

準備完了!いよいよ次の10年を目指したプログラム関数電卓、fx-5800P の後継機が登場するに違いないのです。

是非とも、現行機の欠点を解決し、fx-JP900 の改良点を取り入れ、さらに所有する喜びを満たすデザインを纏い、グラフ関数電卓とはひと味違った実用本位のモデルを開発して頂きたい。

電池駆動で良いので、fx-FD10 Pro の機能を、fx-JP900 のデザインに融合したモデルが理想です。



参考ホームページ: 異様に欲しくなった電卓の話 カシオ CLASSWIZ

関連ページ:
- Casio fx-JP900
- Casio fx-JP900(その2)
- Casio fx-JP900 (その3)
- Casio fx-5800P や他の電卓の数値積分



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


 



keywords: fx-JP900fx-5800Pfx-9860GII関数電卓

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

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

プログラムを速くしたい - Casio Basicプログラミング

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

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

2015/06/13
[純正] [5800P / FX/ CG]
頑張って作ったプログラムが思った以上に遅い。これを速くしたい。



プログラム関数電卓 fx-5800P では、作ったプログラムが思った以上に遅くなることがある。最初に作った時は遅いと感じなくても、機能追加をおこなってプログラム規模が大きくなると、目立ってプログラム実行が遅くなることもよくある。

ここで紹介する対策は、fx-5800P 以外の新世代 Casio Basic 搭載のグラフ関数電卓でも使えるが、グラフ関数電卓はそもそもCPUが速い。主に fx-5800P で役立つと思う。

新世代 Casio Basic については、<目次> を参照。

プログラム高速化には、以下を検討すると良い。

・ コマンドや命令の見直し: 実行速度の速い処理に置き換える

・ Goto 削減:
Goto/Lbl をできるだけ使わないようにする

・ 計算式の活用:
条件分岐やループ処理を計算式に置き換える

・ ロジックの見直し:
プログラム全体の構造やロジックを見直す



コマンドや命令の見直し

fx-5800P の Casio Basic は最低必要限のコマンドしか無いが、それでも1つの処理を実現するためには、複数のやりかたがある。ただ、その選択肢が少ないのが特徴で、選択肢が少ないのでプログラムの改善は楽である。

代表的なコマンドや処理の処理時間の一覧をを示す。これは、特定コマンドの厳密な実行時間ではないので、相対的な比較として見て欲しい。

表 fx-5800P Casio Basic 処理時間の比較
処理内容処理時間 (ミリ秒)
A⇒4.1
通常変数アクセス5.4
If A6.2
If A Else7.2
比較演算(変数)9.7
A≠B⇒10.0
論理演算10.0
比較演算(数値)11.5
If A≠B (変数)12.0
if A≠0 (数値)13.7
テキスト表示 (Locate)20.4
配列変数書き込み22.0
配列変数読み出し22.7
リスト読み出し25.1
リスト書き込み25.3
行列読み出し26.9
行列書き込み28.4

1) 配列変数、リスト、行列の使用は極力減らす
 これらは、際だって実行時間が長い。プログラム上完全に無くすことは不可能だが、同じものを繰り返し使うなら、一旦通常変数に代入しておき、それを使えば効果的だ。ロジックを見直して、これらの使用を減らすことも可能なので、検討の余地はあり、とても効果のある方法と言える。

2) 論理演算、比較演算の使用を減らす
論理演算や比較演算は、条件分岐 (If、⇒) やループ (Do, While) の条件判定で使うことが殆どだろう。論理演算子や比較演算子の使用数を減らすように、プログラムを工夫すると良い。同じ演算を繰り返し使用する場合は、大いに改善の余地がある。

3) Baiscコマンドを Dsz、Isz、⇒ に置き換える
Dsz、Isz、⇒ は、古くからの Casio ユーザーの利便性を考えて、現在の Casio Basic でも使えるように配慮されたものだ。特定の条件を満たす場合は、これらの命令を使う方が顕著な高速化が可能になる。

・ If ... Then ... IfEnd (Else が無い) 構文は、に置き換えると30%速くなる。

・ C+1→C は、C が 0 にならないことが保証されるなら、Isz C に置き換える。

・ C-1→C は、C が 0 にならないことが保証されるなら、Dsz C に置き換える。

4) 条件判定で比較演算を使わない
If A≠0、LpWhile A≠0、While A≠0 は、If A、LpWhile A、While A に置き換えるだけで50%の速度向上が見られる。

条件判定は、内部では 0 か 0 でないか、で処理されている。0 の時は偽、0でない時は真、と判定される。そこで、上のように変数を使い、それが 0 か 0でないかで、条件判定ができる。

これの応用として、
If A≠B、LpWhile A≠B、While A≠B は、それぞれ以下のように判定用変数 C を追加した方が遙かに速くなる。

A-B→C
If C:Then
........
IfEnd


Do
........
A-B→C
........
LpWhile C


A-B→C
While C
........
WhileEnd


5) 数値演算は、できるだけ計算式をシンプルにする。
数値演算や関数の処理時間の一例を表に示す。

処理処理時間 (ミリ秒)
乗算 (AxB)1.6
除算 (A÷B)1.8
累乗 (A)1.9
Int(1.23)1.5

数値演算や関数は、相対的に速いことが分かる。しかし、加算を10回行えば、10ミリ秒以上かかるので、これは明かに無駄である。

例えば、
A + (A+1) + (A+2) + ・・・ + (A+10)
を計算する場合、加算 (+) が20回使われる。

そこで、これをシンプルにして
11A+55
とすれば、乗算1回、加算1回だけになり、10倍の速度向上となる。

なお、上の処理速度比較の測定方法や詳細をまとめた記事を紹介しておく;
 ⇒ fx-5800P: 変数アクセス、比較・論理演算、条件分岐の速度比較


Goto 削減
Casio Basic は、プログラムを上から下へ順に読み込みながら実行する、インタープリタタイプの言語だ。
プログラム中 Goto があると、プログラムの最初から最後まで順にスキャンして、ジャンプ先の Lbl や、ジャンプを伴う Basic コマンドを1つひとつ調べる動作が、内部的に行われている。そのため、ジャンプを伴うコマンドが多くなればなるほど、速度は低下する。

従って、やむを得ない場合を除き、Goto を極力使わないことが、高速化の鍵となり、ジャンプを伴うコマンドが多くなるほど、Goto 削減の効果は大きくなる。


計算式の活用
例えば、
A + (A+1) + (A+2) + ・・・ + (A+10) を、

0→I
Do
A+I→A
I+1→I
LpWhile I≦10

とすることができます。実際は、冒頭の式を ループで処理しようとは思わないだろうが、別の処理なら十分有り得る。
このループの代わりに、
11A+55
とした方が圧倒的に速いことに異論は無いだろう。


ロジックの見直し
まずは、プログラムに無駄がないかどうかを調べる。不要な処理が減ればそれだけ速くなるはずだ。
これ以上は、特に一般論はなく、実際のプログラムに即した検討が必要になる。


プログラム高速化の実例
具体的検討の一例として、下記を挙げておく;
 ⇒ Casio Basic入門32 ~ Casio Basic入門37



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


 



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

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

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

整数の桁数を求めたい - Casio Basicプログラミング

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

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

2015/06/12
[純正] [5800P / [FX / CG]
整数の桁数を求めたい。



整数が代入された変数 A を、画面の右端に表示したい時、A の桁数が分かれば簡単だ。
A の桁数を D とすると、

Locate 17-D,1,A   [fx-5800P の場合]

Locate 22-D,1,A
   [fx-9860GII の場合]


とすれば良い。但し D は 自然数 (1以上の整数)で、16以下(fx-5800P)、21以下(fx-9860GII) が条件になる。



A が自然数 (1以上の整数) の時の桁数

1+Int(log(A))→D   ・・・(1)



A が 0 以上の整数の時の桁数

1→D
A⇒1+Int(log(A))→D


A が 0 の時、log(A) はエラーになるが、この時は桁数 D は 1になる。
そこで、先に D に 1 を代入しておき、A が 0 でない時 (1) の処理を行えば良い。A が 0 で(1)の処理がスキップされる時は、既に D に 1 が代入されているので問題ない。



A が 0 を含めた正・負整数の時の桁数

1→D
A⇒1+Int(log(Abs(A)))→D


ここでは、負号 (-) は桁数に入れていない。

負号 (-) も桁数に入れる場合は、以下のようにすれば良い。

1→D
A>0⇒1+Int(log(Abs(A)))→D
A<0⇒2+Int(log(Abs(A)))→D





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


 


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

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

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

Casio fx-5800P や他の電卓の数値積分

  修正 2015/06/07

fx-JP900 の数値積分計算が非常に速くなり、プログラム関数電卓 fx-5900P よりも速くなったことから、最近の自然表示関数電卓、プログラム電卓で、幾つかの計算の比較をして、数値積分の違いや変遷を調べて見ます。

今回比較の対象にしたのは、以下の機種。

Int_fx-991ES Int_fx-993ES Int_fx-995ES 

順に、fx-991ES、fx-993ES、fx-995ES



Int_fx-JP900 Int_fx-5800P Int_fx-9860GII 

順に、fx-JP900fx-5800Pfx-9860GII

今回のテーマとは関係ありませんが、こうしてみると黒液晶は見やすくて良いですね。


数値積分

fx-995ES、fx-JP900fx-5800Pfx-9860GII の結果は、Casio fx-JP900 (その3) の内容のままで、これに fx-991ES と fx-993ES の結果を追加しました。処理速度の順に機種を並べ直しています。

機 種積分1積分2
fx-991ES28.0秒5.1204秒 4.2
fx-993ES26.4秒4.8246秒5.1
fx-995ES25.6秒4.7
241秒
4.9
fx-5800P10.1秒1.856,7秒1.2
fx-JP9005.5秒48.7秒
fx-9860GII1.5秒0.278.4秒0.17

 で示したように、何故だか一番遅い筈の fx-991ES が積分2については、fx-995ES よりも速い逆転現象が見られます。何度か測定しなおしたのですが、これは間違いありません。

積分1、積分2共に、fx-JP900 の処理時間を1として、その相対比率を赤文字で示しています。機種別の処理速度の相対比率をグラフにしてみました。
積分比較 
全体として、CPU速度の違いがうまく反映したグラフになっていると思います。

細かくみてみると、fx-JP900 に対する fx-993ES、fx-995ES (スタンダード関数電卓)の処理速度の割合は、積分1と積分2が同じ比率になっています。ところが、fx-JP900 に対する fx-5800P と fx-9860GII (プログラム電卓)の処理速度の割合は、積分1と積分2の割合が上記と異なっており、誤差と言えないレベルの差を示しています。これはCPU性能だけが要因ではなくて、プログラム電卓での計算アルゴリズムの違いが反映されている可能性を示しています。

面白いのが、fx-991ES では、積分2が全体の傾向に合わない逆転現象を示している点です。

関数電卓とプログラム電卓のグループで分けて見てみると、fx-JP900を基準にした処理時間比は、関数電卓では積分1の方が小さい傾向(逆に速度比は大きい)があり、fx-5800P や fx-9860GII などのプログラム電卓では積分2が相対的に処理時間比が小さい傾向(速度比が大きい傾向)が見られます。但し fx-9860GII ではその差は非常に小さく、CPUが圧倒的に速いので差が小さくなっていると考えられ、プログラム電卓と関数電卓とで傾向の違いがあると言えるかも知れません。

この速度比の傾向が、fx-991ES と fx-5800P が同じなのは、共に2006年発売であることと関係あるかも知れません。

これら機種の取扱説明書を見ると、fx-9860GII 以外の数値積分計算には、ガウス・クロンロッド法を使うとありますが、fx-9860GII については、数値積分計算の方法についての説明はありません。誤差は fx-995ES だけ指定無き場合はに 1x10-10 で、それ以外は 1x1--5 とありますが、いずれも正しい計算結果を出しており、誤差は数値積分処理時間に影響が無いように思います。

ガウス・クロンロッド法は周期関数が苦手で、却って計算時間がかかる傾向があるようです。積分2に時間がかかる上の結果もそれを反映しているようです。

積分1と積分2の処理時間の比率を各機種別に整理して、グラフを作ってみます。CPU速度の違いを打ち消して、苦手な周期関数をどのように扱うのかのアルゴリズムの違いを反映する例になると思います。

機種処理時間比率 [積分2/積分1]
fx-991ES7.29
fx-993ES9.32
fx-995ES9.41
fx-JP9008.85
fx-5800P5.61
fx-9860GII5.6
積分比較2 
プログラム電卓である fx-5800P と fx-9860GIi は、積分1と積分2の速度比率がほぼ同じなので、似たようなアルゴリズムになっていると思われます。



ガウス・クロンロッド法が苦手とする周期関数の積分の例として、以下のような計算をさせてみます。
積分3 

ここで、n は、自然数(1, 2, 3...)です。n を少し大きな数にすると、いずれの機種でもタイムアウトになって計算を諦めてしまいます。そこで、タイムアウトしない n を比較すれば、積分アルゴリズムの違いが分かるかも知れません。

機種計算できる nタイムアウトする n
fx-991ES89
fx-993ES89
fx-995ES89
fx-JP90089
fx-5800P89
fx-9860GII6061

いずれの機種も計算できた時は、正しい計算値(4n)を示します。上記のいずれの機種も内部精度は15桁です。sin x の入力範囲も同じです(0 ≦|x| < 157079632.7)。

fx-9860GII だけが、より大きな n で計算可能なのは、圧倒的なCPUの速さから、タイムアウト時間を長くとっているのかも知れません。

アルゴリズムもチューニングしている可能性がありそうです。



関数計算に使われるアルゴリズムには、CORDICや多項式近似があり、sentaro様によれば、Intel 486系までではCORDICが使われ、Pentium 以降では多項式近似が使われるようになっているとのことです。CORDIC は、小さなテーブル参照と四則演算で関数計算が可能になる巧妙なアルゴリズムで、遅いCPUと限られたメモリしかない環境では有効です。一方、多項式近似は、速いCPUと十分なメモリを使える場合は、精度と速度が得られるので、Pentium以降で用いられることは納得できます。

以下の資料が非常に参考になります。

関数計算で用いられる、CORDIC と 多項式近似についてまとめられている;
- 関数アルゴリズムの検証

CODRICの具体的な計算方法が、大変分かりやすく書かれている;
- サルでもわかるCORDICアルゴリズム


カシオの電卓は、浮動小数点処理を行うFPUが使われていないようなので、基本的にはCORDICが採用されていると考えられます。

積分1と積分2の計算時間の違いについて、関数計算の違いがどの程度反映しているのかを調べて見ます。

ガウス・クロンロッド法はガウス法の一種で、積分区間内の複数点での f(x) の値の総和を求める計算をしています。そこで、総和計算を、cos x と cos(ln x) で行って、その違いをみてみます。

機 種総和1総和2
fx-991ES23.1秒6.236.4秒5.3
fx-993ES17.7秒4.834.0秒4.9
fx-995ES17.0秒4.6
32.8秒
4.8
fx-5800P8.7秒2.411.7秒1.7
fx-JP9003.7秒6.9秒
fx-9860GII1.9秒0.511.9秒0.28

積分と同様に、fx-JP900 の処理時間を1とした相対比率(赤文字)を使ってグラフを作ってみます。
総和比較 
全体的には、CPU速度の違いをうまく反映した結果になっています。但し、fx-991ES の総和2の計算時間が特異的に速くなっていて、積分計算と同様の結果です。さらに、fx-JP900 に対する処理時間の割合が、関数電卓とプログラム電卓で異なった比率になっていて、これも積分計算の傾向と同じです。積分も内部では総和計算を使っていると考えれば、同じ傾向になるのは納得できます。ちなみに、取扱説明書によれば、cos( )ln( ) の入力範囲と精度は、いずれの機種でも同じです。

総和1と総和2の処理時間比率を機種別に整理してグラフ化してみます。CPU速度の違いを消して、アルゴリズムの違いを見る試みです。

機種処理時間比率 [総和2 / 総和1]
fx-991ES1.58
fx-993ES1.92
fx-995ES1.93
fx-JP9001.86
fx-5800P1.34
fx-9860GII1.00
総和比較2 
総和1に対する総和2の相対速度は、積分計算と異なり、fx-5800P より fx-9860GII がはっきりと速くなっています。タイムアウトする積分3で見たように、fx-9860GII では関数計算がチューニングされているようです。


以上、あまり明確なことは言えませんが、fx-5800P の積分計算の位置づけが少し見えたと思います。




関連ページ:
- Casio fx-JP900(その3)





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


 



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

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

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

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

やす (Krtyski)

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


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

プログラム電卓を実際に使って気づいたこと、自作プログラム、電卓での Casio Basic, C.Basic そして Casio Python プログラミングについて書いています。

なお管理人はカシオ計算機の関係者ではありません。いつでもどこでもプログラミングができるプログラム電卓が好きな1ユーザーです。


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR