e-Gadget - プログラム関数電卓 2023年10月

e-Gadget 開設10周年

 2023年10月29日

e-Gadget 10周年 - 皆様ありがとうございます


2013年10月30日に始めた e-Gaget は、本日で10周年を迎えました。
興味を持って当ブログにお越しになる方々のおかげで、私のモチベーションが10年感維持できた結果です。

心からお礼を申し上げます。


10年前の 2013年はどんな年だった?

国内では、アベノミクスが動き出し1ドル100円台になり、失業率が4%以下に下がり始めました。
現在の日本の安全保障の一連の動きの起点になったと思われる特定秘密保護法が成立し、海外ではスノーデンがウィキリークスでNSAが収集した情報を暴露したのもこの年でした。

個人的な話になると、2013年当時に使っていたパソコンは、Panasonic Let's note R7Windows XP でした。Windows 8 も登場していましたが XP を使っていました。当時投稿した記事には、Let's note R7 が一部映り込んでいるものがあります。

2013年のカシオの電卓製品はどんなだったのか?
2013年8月の CASIO の電卓総合カタログを見てみます。
・スタンダード関数電卓は fx-995ES シリーズ と 廉価版の fx-290 があった。
・プログラム関数電卓は 2006年発売の fx-5800P があり、今も健在です。
・グラフ関数電卓は fx-CG20 と fx-9860GII、カラーとモノクロ液晶の両方が揃っていた。


この10年間の出来事

この10年間の e-Gadget での重要な話題です。


Casio Basic の完成度 - 当ブログ開始の理由

完成度の高い fx-5800P 搭載の Casio Basic がなくては、当ブログは始まりませんでした。この Casio Basic は  fx-5800Pfx-9860G が発売された2006年にほぼ完成の域に達しています。単なる計算の補助機能であれば、SHARP製電卓にもありましたが、Casio Basic は実用プログラムが作れるレベルの完成度でした。しかし取扱説明書には簡潔過ぎる説明しか記載されていないので、詳細を調べて探索しようという気持ちになり、それを記録するために当ブログを始めました。

さらに 2006年以降に国内外で市場投入されたグラフ関数電卓にも、モデルによらずほぼ互換の Casio Basic が搭載されているのも、当ブログが継続できた大きな理由です。


素因数分解プログラム - 個人的プロジェクト
スタンダード関数電卓 に素因数分解機能が fx-995ES に初めて搭載されたことから、素因数分解プログラムを fx-5800P で初めて作ったのも 2013年のことでした。その後、高速化できるアルゴリズムを見つけて採用することで4倍程度の高速化が実現し、さらにアドイン版Casio basic - C.BasicPythonモード (Casio Python) が登場したことで、関数電卓内蔵の素因数分解よりも高速動作するプログラムができたのが 2021年でした。そこそこの熱量を投じた個人的プロジェクトが完成したのでした。とても個人的な話題ですが、以下に挙げる事柄がなかったら、このプロジェクトは完成していません。
Casio 関数電卓の素因数分解


fx-5800P のPCリンクが実現 - CcLinker と CcEditor
fx-5800P は関数電卓の使いやすさと Casio Basic 開発環境としてのバランスが非常に良いモデルです。残念ながら 2026年には補修部品の提供が終了される可能性がありますが、それでも 2006年発売開始から20年のも長きにわたって販売を継続するるのは、このモデルの良さを表していると思います。

しかし、このモデルには大きな欠点がありました。作ったプログラムを PCとリンクする方法がCASIOから提供されていないのです。

2018年に takumako様が fx-5800P と PCでプログラムソースを共有できるPCリンクシステム - CcLinker - を公開され、現在でもドングルの有償提供とソフトウェアの無償提供を続けてくださっています。併せて、PC上で Casio Basic プログラムを編集/作成できる - CcEditor - も無償公開されています。
ついに fx-5800P がPCリンク可能になった
fx-5800P Casio Basic をPCでコーディング - CcEditor

takumako様は、他の電卓モデルとのPCリンク手段を提供なさっています。
Takumakoのページ

素因数分解の高速化検討を進めるとき、数百~数万個のリスト要素を記述する必要がありました。そこで、PC上で C# を使ってリスト要素を自動生成し、それを fx-5800P に転送しなくてはなりません。

今あるプログラムを fx-5800P からPCに転送 ⇒ CcEditor でリスト要素を貼り付ける ⇒ CcLinker で fx-5800P に転送しなおす

この一連の作業を行うには、CcEditorCcLinker なしでは実現しないのです。

当ブログでサンプルプログラムや実用プログラムを数多く作成してきており、fx-5800P のメモリ内に収まり切りません。PCリンク機能なしだと プログラム保存のためだけに fx-5800P を複数台購入する必要があります。実際3台所有していますが、CcLinker に出会ってからは買い増す必要がなくなりました。


アドイン版Casio Basic - C.Basic の誕生と進展
10周年記念として C.Basic 誕生秘話を紹介します。

C.Basic 誕生秘話
最初は グラフ関数電卓 fx-9860GII で走らせる Casio Basic プログラムで、画面の中に障害物を置いて、それに1ドット(虫) がぶつかって反射する軌跡を表示するといったものを記事にしました。そして、画面全体を千鳥格子で埋め尽くすためには、どのように障害物をおけば良いのかということに興味を持ち、「障害物を構成する最小のドット数とその配置位置」を問う問題を発表しました。管理人自身も正解を知らない状況での設問でした。この問題の答えとして、障害物の最小ドット数が1ドット、これを置く場所は無限ではないが非常に多くあることが分かりました。2015年8月のことでした。
楽屋裏 - 虫の軌跡(Bug Trace) 

この問題を解くには、遅すぎる Casio Basic のグラフィックス表示をなんとかしようと、チューンアップツール (Ftune2) を使って高速化しましが、一方で、sentaro様が オリジナルプログラムと同じ動作をする高速なアドインプログラムを作ってくれました。

sentaro様作成のアドインのソースを見ると Casio Basic のコマンドの機能単位で関数を作っていることに気がつき、確認すると「アドインで Casio Basic を作る試み」だと分かり、Casio Basic 互換で高速動作するアドイン版 Casio Baisc への夢が猛烈に膨らみました。管理人は Casio Basic の詳細動作の解析と公表を行っていたので、細かい動作の評価と提案をすると sentaro様は直ちに反映してくれたものです。

2015年10月12日 にアドイン版 Casio Basic Ver 0.10 テスト版が登場!

最初はコンパイラ版を想定していましたが、まずはインターラプタ版でスタート。C.Basic 誕生の詳細は、楽屋裏 - 虫の軌跡(Bug Trace) のコメント欄に生の会話が残っています (超絶長いです)。


C.Basic の進展
その後、アドイン版Casio BasicC.Basic (ドット1つ) と銘々されました。将来できるかもしれないコンパイラ版は C:Basic  (ドット2つ) にしようという話になっています。

C.Basic は モノクロ液晶搭載モデル (FXモデル) fx-9860G / fx-9860GII 専用として開発開始。その後 2017年11月に 高精細カラー液晶モデル (CGモデル) fx-CG10 / fx-CG20 専用 C.Basic の開発が始まりました。今では FXモデル と CGモデル の両方の開発が並行して進み、純正Casio Basic 互換に加えて、コマンドが拡張され、独自コマンドが追加されています。

時間は戻りますが、2015年11月に、C.Basic の計算処理とグラフィックス表示処理の高速性をアピールする目的で、サンプルプログラム - ライフゲーム - を作成。この時は FXモデル専用でした。ライフゲームで次世代状態を計算する部分を 専用コマンド化したところ、約7倍の高速化となりました。これは将来のコンパイラ版の高速性を示唆する結果だと考えています。

2021年6月には、CGモデル用 C.Basic の動作が安定してきたので、当時の C.Basic 最新バージョンで、fx-CG50fx-9750GIII でそれぞれ動作するライフゲームをアップデートしました。
ライフゲーム

現在も C.Basic の開発とサポートは継続中です (少しお休み期間がありました)。
アドイン Casio Basic - トップページ - 

海外の Planet Casio ではプログラミングコンテストの開発環境の1つに C.Basic が選ばれ、すでに国際的に認知されています (CPC #26 - At the limit of pysics! 参照)。

※ 素因数分解の高速化と15桁ま対応 (既にCasio Python で書いたもの) を  C.Basic に移植すると、Casio Python の2倍の速度となり、関数電卓内蔵よりも明確に高速になりました。


Pythonモード (Casio Python) の登場 - 高速処理系
2022年6月に、いくつかのグラフ電卓に Pythonモードが追加され、OSアップデートにより導入できました。その後2022年10月にグラフィックモジュール casioplot が追加され、ようやくそれなりのプログラムを作りやすくなりました。当ブログでは PythonモードCasio Python と呼んでいます。

Casio Basic プログラムを Casio Python に移植してみると Casio Python は純正Casio Basic に比べて圧倒的に処理速度が速いことに気づき、とても興味を持ちました、Python を使ったことが無かったのでですが、同種のオブジェクト指向プログラミング言語である C# に似ているので、割合楽に勉強できました。そこで、プログラミング経験者の Casio Python という位置づけで、勉強したことを紹介しながら作ったプログラムを記事で紹介しています。

リアルタイムの "キー入力検出機能" を提供するモジュールが提供されていない点は、実用プログラムやゲームを作るには致命的です。その後複数のアップデートが行われたものの、2023年10月29日現在では "キー入力検出機能" はまだ提供されていません。

一方、その大きな制限の中でオリジナルのモジュールを作成したり工夫をすることも面白く、いくつかのプログラムを作って公開しています。
Casio Python - 目次

※ 素因数分解をCasio Python で書いたところ、関数電卓の内蔵機能とほぼ同じ処理速度が得られました。



アクセスの推移

Access20231028

2013年10月30日以来10年間で、当ブログに来られる人が延べで 186,000 人を超え、ページビューは 586,000 ページを超えました。毎日のページビューは 100~400の間を行ったり来たりで、平均 250/日 といったところです。

有名ブログに比べると圧倒的に少ないアクセス数です。広告を一切せず、アフィリエイトや案件記事投稿を一切行わず、積極的にアクセスを増やすことを行っていないので、この程度になるのだと思います。当ブログは情報集約タイプなので、古い記事にも一定のアクセスがあるのが特徴だと思います。リピーター率、つまり一旦見つけたら戻ってきてくれるケースが 50~70% 程度あることも特徴かも知れません。

このゆっくりとした伸びは、"e-Gadget の認知度のゆっくりとした上昇" を素直に示しているのではないかと思っています。たまにエゴサーチをすると、当ブログを紹介したり引用してくださっているページを新たに見つけます。感謝しかありません。
Wikipedia - Casio Basic



これからの話題

カシオのスタンダード関数電卓の UI/UX が最近大きく変わりました。これは主に北米やヨーロッパの GAKUHAN (学販) マーケットの影響を反映している可能性があります。ここではその善し悪しについては触れませんが、この変化がグラフ関数電卓の新機種へどのような影響を与えるのか? 今はとても気になっています。

フランスでは24年(スクールイヤー) に併せて、グラフ関数電卓の新機種発売の情報がありますので、来年はプログラム電卓の歴史的に大きな変化に遭遇する可能性があり、目が離せません。

またそれに伴って Casio Basic が残るのか、Casio Python がどのように変化するのかに注目したいと思います。







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




keywords: プログラム電卓, Casio Basic, C.Basic, Casio Python, fx-5800P, fx-CG50, fx-9750GIII, fx-9860Gシリーズ

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

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

楽屋裏 - fx-CG50 のチューンアップ - Ptune3

楽 屋 裏
e-Gadget


2017/07/20
最終更新 2023/10/26

Ptune3 が Ver 0.25 にアップデート [2023/10/26]



fx-CG50 を入手したので、早速チューンアップに挑戦!

これまで、fx-CG20 で愛用してきた Ptune2 (sentaro様の作品) の fx-CG50 対応版 Ptune3 を導入しました。Ptune2 はかなりの安全設計なので、引き続き fx-CG50 専用の Ptune3 を試しています。

fx-CG20 はRAMにSRAMを使っていますが、fx-CG50 は SDRAM に変わっています。従って新たに Ptune3 が登場したわけです。


使用例
  • Ptune3 を起動
  • メモリチェック: [OPTN] - [F5] (RAM) と [OPTN] - [F6] (ROM) 実行
  • SDRAM: と Write: の数値 (SDRAM最大クロック と Write 最大クロック) をメモ
  • 最大値設定画面:[SHIFT] - [MENU] でBus CLK をメモしておいたSDRAM最大 か Write が最大付近に設定
  • 最大値設定画面を抜けて設定を保存:[EXIT] でメイン画面に戻り、[SHIFT] - [F1] (SAVE) で設定を保存
  • 設定をストレージメモリにバックアップ保存:[SHIFT] - [AC] (OFF) で一旦電源オフ
  • 電源オン [AC] して、Ptune3 起動
  • PLL を保護された範囲内で最大値に設定
  • [F5] のプリセットを選び、上で設定した値以下で、BFC と PFC を大きめに設定
  • [SHIFT] - [▲] で FLL を変更すると、各クロックを小刻みに調整できる
  • PLL や CPU クロックだけでなく、BFC (メモリバスクロック) や SFC (I/Oクロック) を安全圏内で最大化した方が、全体の動作が最速化できる。場合によっては、PLL を1段落とし、BFC / SFC を大きめに設定し、さらに FLL を上げて BFC / SFC を安全圏内で小刻みに最大化する方法も有効
※ メモリチェックを行った直後は SDRAMアクセスが不安定になる傾向があるので、一旦リスタート (背面ボタン) すると良い。
  • 最大値設定画面は、できるだけ安全を確保する Ptune3 の最大の特徴。値は安全サイドに慎重に設定する必要がある。
  •  [F4] のプリセットはCPUクロックを優先して大きめに設定する。CPUが早くても必ずしも全体の動作が速くならない。全体の動作の高速化には、メモリバスクロック (BFC) や I/O クロック (PFC) の寄与が極めて大きい。これらを大きめに設定する方が良い反面、メモリアクセスの異常は、特にROMアクセスの異常はファームウェアの修復不能なダメージに繋がるので、"メモリチェック" と "最大値設定" を活用して、慎重に設定するのが良い。


Ver 0.25 ベータ版 [2023/10/26 更新]

CG50にて[F5]設定で動作しない旨の報告があったので修正版公開。
以前のバージョンで問題なければ入れ替える必要は無し。

Ptune3 ver0.25 (F5設定変更版) ダウンロード
 [F5] の設定をPLLx25に変更 (x26 から少し落とした)
マニュアル


Ver 0.24 ベータ版 [2020/02/20 更新]

"X" を乗算記号 "×" に変更。

Ptune3 Ver 0.24 ダウンロード
マニュアル (Ver. 0.25 のマニュアル)


Ver 0.23 ベータ版 [2020/01/04 更新]

ファンクションメニューを見やすく変更。機能に変更はない。

Ptune3 Ver 0.23 ダウンロード
マニュアル


Ver 0.22 ベータ版 [2019/08/31 更新]

同じ電池を使った時に fx-9860G シリーズや fx-CG20 と同じ値を示すように、電圧表示値が実際よりも小さめであったのを修正。sその後 電池電圧表示値について C.Basicでの値との誤差を最小にする修正を行い、差替えアップデート。

Ptune3 Ver 0.22 ダウンロード


Ver 0.21 ベータ版 [2019/02/20 更新]

実際のクロックが表示よりも微妙に遅くなっていたが、スペクトラム拡散に原因があることが判明。デフォルトでスペクトラム拡散がONになっているが、これをOFFに切り替えられるようになった。OFFにすると1.6%程度速くなる。
スペクトラム拡散ONで、FLLを1.6%上げても同じ効果なので、顕著なスピードアップにはならなそう。

Prune3 Ver 0.21 ダウンロード

[X2] または [^] キーでスペクトラム拡散を On/Off できます。


Ver 0.20 ベータ版 [2018/08/19 更新]

実際の周波数とのズレを考慮して表示するように修正(セットアップで設定できる)
(暫定補正値 = PLLより算出される内部周波数 * 900 / 914)
Ptune3  Ver 0.20 ダウンロード

sentaro様によるコメント
CG50だけお持ちの場合はさして問題になることも無いのですが、
SH4AのFX機やCG10/20をお持ちの場合は
Ftune2/Ptune2とPtune3で同じクロックにした場合、
CPUベンチマーク結果が違うことに気が付かれた方もいるかもしれません。
(参考リンク)
http://www.casiopeia.net/forum/viewtopic.php?f=25&t=7327

これはCG50のCPUが何かしらの内部仕様の変更があったか、SDRAMアクセスでの何かで、
実際の動作周波数が計算で求められる周波数よりも低い周波数で動作していると思われます。

CG50デフォルトの計算上の動作周波数は
117.96MHz
ですが、
実際にはC
-1.6%ほど低いところの、
116.15MHz(正確ではありません)
くらいで動作しています。

これはFtune2/Ptune2とPtune3でCPUベンチ値を比較すると
FX機/CG20よりも-1.6%ほど低くなるのが分かるかと思います。

今回のアップデートはその周波数誤差を補正して表示できるようにするものです。





Ver 0.10 ベータ版 [2017/09/30 更新]
sentaro様によるコメント

fx-CG50国内発売前に一応、ってことで、0.10にバージョンアップしました。
アイコンをCG50スタイルに変更したのとSDRAMチェックの仕様を少し変更したのみで機能的には0.05と変わるところはありません。(^^;

ということで、現状Ptune3では2倍以上の大幅なオーバークロックは出来ないですが、CG50は基本ベースで高速化されているのであまりPtune3の必要性はないかもしれませんね。

Ptune3 Ver 0.10 ダウンロード


バグや疑問点、何かお気づきの点がありましたらよろしくお願いします。


=== コメントここまで ===

なお管理人の私が所有している個体で、[F5] で設定される CPU コアクロック 210.11Mhz で 2ヶ月使っている限りでは問題ありません。Ver 0.10 も機能面で変わりないので [F5] で問題ないと思います。



Ver 0.05 アルファ版 [2017/07/20 公開]
sentaro様によるコメント

αテスト版ですが、Ptune3 ver0.05です。(^^;
Ptune3 Ver 0.05 ダウンロード


一番の注意点としては、SDRAMのメモリチェックはチェック後にシステムエラーを起こすことが少々あるので、SDRAMのメモリチェックをした後はリセット推奨です。
それ以外は以前のPtune2と同様にUSB接続で使用しないこと、ぐらいでしょうか。

現状ではCG20のようにメモリクロックがどんどん上げられないので、デフォルトからPLL倍率を上げていくクロックアップが全体の速度向上には効果的です。
この場合はSDRAMのメモリ動作限界で全体の動作限界が決まってしまうのでCG20よりCPUクロックを高くすることが出来ません。
CPUクロックだけを上げるには[F4]を押してPLLをx32にして[SHIFT]+[UP]を押して最上段のFLLで上げていくことになります。(PLLは32倍で制限されているため)
この場合はメモリ限界よりもCPUクロック限界が先にくるので、これでCPUの動作限界が分かります。
私の個体では280MHz前後までいきましたが、速度的にはメモリクロックがあまり上がらないためにPLLを上げていく方が全体パフォーマンス的にはかなり有利になります。
現バージョンの0.05ではデフォルトからPLLを28倍くらいまで上げて1.8倍速ぐらいが安定限界というところです。

fx-CG20はPtune3で約3倍速まで引き上げられますが、fx-CG50はデフォルトで1.5倍~2倍、それがさらに1.8倍まで上がるとすればCG20の最高速度並にはなりそうです。
そしてその状態でも消費電力がCG20比で約半分というところなのでなかなか良いですね。(^^)

=====





αバージョンなので、なんと言っても完全に自分の責任で使うもので、今はこわごわ触っています。Ptune3 に関する話題をこのエントリーにまとめるため、楽屋裏ネタとしてこの記事を投稿しています。

早速、作者のsentaro様への質問をコメント欄にアップしました。

[2019/01/31 追記] 
fx-CG50 を2台持っていますが、いずれも 300MHz までチューンアップできました。単に CPUクロックが 300MHzといっても、他の設定に応じて実際のプログラム処理速度は大きく変わりますので、CPUクロックのみで話をするのはあまり意味はありません。
以下のコメント欄にあるように sentaro様のアドバイスを頂きながら、2018年8月末に 自分なりの安全かつ最速設定を見つけ、その後ほぼ5ヶ月使用使って問題ないので、運が良ければここまでチューンアップできます。ちなみにsentaro様所有のfx-CG50では300MHzには至らないようです。無理はしないでください。






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




keywords: プログラム関数電卓、fx-CG50、クロックアップ、Ptune3

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

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

温故知新 - fx-CP400

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


 
2021/05/16
修正 2021/06/01
追記 2023/10/15



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


10. CAS機能と構造化Basicの搭載 - 新言語の試み

今回は、CASグラフ関数電卓 fx-CP400 (ClassPad II) を取り上げる。fx-CG500 は fx-CP400の機能限定, 北米モデルの位置づけになっている。

これらのモデルに搭載されている言語はカシオ仕様の構造化Basic で、本ブログで多く取り扱っている新世代 Casio Basic とは全く別の言語である。ここで 新世代Casio Basic とは、fx-9750GIII や fx-9860G シリーズのモノクロ液晶搭載グラフ関数電卓、fx-CG10/CG20/CG50シリーズの高精細カラー液晶搭載グラフ関数電卓、そして fx-5800P に搭載されている言語だ。本記事では主に登載されているカシオ仕様の構造化Basicについて調べた内容を紹介するが、最初に fx-CP400 の特徴あるハードウェアと機能について簡単に触れることにする。


ClassPadシリーズは、カシオのグラフ関数電卓の製品群の中で、数式を解析的に計算 (式の変形や微分/積分、展開など) ができる数式処理システム (Computer Algebra System) を備えている点に特徴がある。カシオ電卓で最初に CASが導入されたのは、1996年発売の CFX-9970G で、1999年発売の Algebra fx-2.0 にも搭載された。

その後、強化されたCAS機能を搭載した ClassPadシリーズ fx-CP300 が2003年に発売、fx-CP330 が2007年に発売され、fx-CP330 Plus が2012年ニ発売された。OSのアップデートによりCAS機能や各種プリインストール機能が強化され、ハードウェアも fx-CP330 Pus ではUSBケーブルでのPCリンク機能が搭載された。これらは全てモノクロ液晶であった。

2013年にカラー液晶搭載の CAS グラフ関数電卓 fx-CP400 が発売された。ClassPadシリーズは、残念ながら日本国内では販売されていない。

2017年には、fx-CG500 が北米で発売 (国内未発売)された。fx-CP400 はソフトウェアキーボードの配列を複数のタイプ (QWERTY, AZERTY, QWERTZ, ABC) から選択できるのに対して、fx-CG500 はソフトウェアキーボードがアルファベット順 (ABC) のみで、それ以外は fx-CP400 とほぼ同一のようだ。


Casio fx-CP400 (ClassPad II)

fx-CP400抵抗膜方式のタッチパネルにテンキーも備えた携帯端末であり、電卓と言うよりもタブレットに近い。

主なハードウェア仕様
- CPU:カスタム SH4 - SH7305
- 高精細カラー液晶:4.8インチ、320 x 580 ピクセル
- メインメモリ:2 MB
- e-Activity用メモリ:5.5 MB
- ストレージメモリ:24 MB
- 内部演算精度:15桁
- 保存数値桁数:10進数で661桁

ハードウェアキーは、四則演算に累乗計算が入力できる程度の少ないもので、キー1つの1つの機能のみが割り当てられている。[SHIFT]など他のキーと一緒に押して複数の機能が割り当てられる一般的な電卓とはかなり違っている。 温故知新:番外編 - 関数電卓としてに使い勝手 参照

関数計算や様々な機能を入力するには、[Keyboard]キーで呼び出すソフトウェアキーボードを使う。

付属品
白いプラスチックのスライドカバー、タッチペン、USBケーブル、3Pinケーブル、EU域の保証書、クイックマニュアルなどの紙片が付属している。

デザイン
fx-260 Solar II (第1世代関数電卓), fx-JP900 (第4世代関数電卓), fx-CG50 (カラーグラフ関数電卓) と共通した最近のカシオ電卓のデザインになっている。fx-CG50 との比較画像を見ると全く同じデザインだと分かると思う。
fx260_JP900_CG50_CP400_Top 
左から、fx-260 Solar IIfx-JP900fx-CG50fx-CP400

fx260_JP900_CG50_CP400_Back fx260_JP900_CG50_CP400_Case 
左の画像:筐体裏側、右の画像:ハードケース

Comon_Design 
fx-CP400 (左側)、fx-CG50 (右側) のキーボード周り - ほぼ同じデザインだと分かる

また、ClassPad のロゴがさりげなく入っている。
ClassPad_Logo 

OSアップデート - Ver2.01.7 ⇒ Ver 2.01.7002 [2023/10/15 追記]
2023/04/05 に Ver 2.01.7002 へのアップデートが公開された。
以下からアップデートファイルを入手できる;
CASIO WORLDWIDE EDUCATION WEBSITE - DOWNLOADS

実際にダウンロードできるページに進んでみると、ダウンロードできるOSのバージョンが Ver 2.01.7 と表記されており、一見 2.01.7 からアップデートするとしても同じバージョンに見える。しかし実際には 2.01.7002 と細かくアップデートされている。
同じOSバージョンだとアップデート作業中に "同じバージョンなのでアップデートしない" といったメッセージが表示されてアップデートが中断される。今回はアップデートされたことから、2.01.7 から 2.01.7002 へ無事にアップデートされたことがわかる。
アップデートされた細かい点は、まだ分かっていない。何かわかったら追記する予定だ。

OSアップデート / Screen Reciever
購入時のOSは Ver 2.01.4 であったが、その時点で Ver 2.01.6 にアップデートできた。
その後、2021年1月13日に、Ver 2.01.7 にアップデートした。
アップデータは下記から入手できる。
Casio WORLDWIDE EDUCATION WEBSITE - Download Resources | Support | CAS Graphic Models

このページから 電卓画面をリアルタイムでPCに転送するScreen Receiver Ver 03.02 もダウンロードできる。このソフトウェアは fx-CG20 / CG50 でも使え、既に持っているならそのまま使える。


CAS電卓としての機能

fx-CP400 は、他のグラフ関数電卓にない計算精度と計算能力を持っている。大学の理科系以降で学ぶ数学を活用したり、高精度な計算を行う人向けと言って良いと思う。高い計算精度や計算能力を示す一例を以下で紹介する。

但し、"今さら高精度な計算をわざわざ電卓で行うくらいならパソコンで無償で入手できるCPythonを使った方が良い"、"チョットした計算やプログラムならCPythonで十分"、という風潮も出てきている昨今だ。するとfx-CP400fx-CG500 はCAS機能にその価値を見いだすことになろう。ClassPadは、学校教育向けに開発され最適化されてきた製品なので、一般的な技術者向けに最適化されていないのは、当然と言える。

なお、関数入力をソフトウェアキーボードから行うしかないので、関数電卓としては使い勝手が非常に悪い。
温故知新:番外編 - 関数電卓としての使い勝手


演算精度 (桁落ち)
123456789123456 - 123456789123411 = 45

となる筈だが、fx-5800Pfx-CG50 でこの減算を行うと、答えが 0  になる。 内部演算精度15桁ギリギリのところで最下位2桁の桁落ちが発生している。一方、fx-CP400 でこの計算を実行すると答えが 45 と正しく得られる。


演算桁数(指数部)
449! = 3851930518E+997

fx-CP400 は指数部が3桁、±999 だから、演算桁数が1000桁ある。他のグラフ関数電卓やプログラム関数電卓では、指数部は2桁なので 100桁以内の桁数となる。


複素指数関数
複素数を表示するように設定して、計算させてみると、fx-5800P はエラー、fx-9750GIII、fx-9860Gシリーズ ならびに fx-CGシリーズ は正しく計算結果を表示。fx-CP400 でも同様に複素指数関数を正しく計算する。
ComplexExponential 
 
 
積分の処理速度
 
積分計算速度の比較を試みる (Rad モード)。
機種積分1積分2
fx-JP9005.5秒48.7秒
fx-5800P10.1秒56.7秒
fx-9860GII (SH4A)1.5秒8.4秒
fx-CG201.0秒5.8秒
fx-CG500.7秒3.2秒
fx-CP4000.7秒2.0秒
積分の詳細はこちら

積分1については、最初に式が示される。次に近似値の1が表示される。[2021/07/03 修正]
Integral1_1  Integral1_2 

積分2については、0から1までの積分でもエラーにならず 1/2 が得られる。他の機種では数値積分区間を 0 から 1 にすると、0 において対数関数 In は無限小になり、数値計算では大きな誤差が発生するために結果が 0.4999 となる。そこで 0 の代わりに 1x10-10 を用いている。fx-CP400 では、積分区間 [0, 1] で計算できている。
Integral2 
 
 
周期関数の積分
積分計算にガウス・クロンロッド法が使われている可能性が考えられるので、このアルゴリズムが苦手な多項式で表せない関数の代表選手として周期関数の積分を行う。以下の計算で、n の値を大きくしてゆき、正しく計算できる限界を調べて見る (Rad モード)。

積分3
機種計算できる nタイムアウトエラーになる n
fx-JP900n ≦8n >9
fx-5800Pn ≦8n >9
fx-9860GIIn ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CG20n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CG50n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
fx-CP400n ≦ 60 Or (n = 64, 128, 256, 512)n ≧ 61 Or n = 2m (m≧10)
(エラー表示せずに式を表示)
積分の詳細はこちら

fx-CP400 での結果は、計算可能な最大の n は 60 と、他のグラフ関数電卓と同じ結果になった。60π / -60π の代わりに nπ / -nπ とすると、解析的な解である 4n が得られずに、同じ式を表示することから、この積分では CAS 機能が働いていないと思われる。つまり、他のグラフ関数電卓と同様の数値積分のロジックが適用され、その数値積分の内部ロジック自体は大きく変わっていないようだ。但し、CAS電卓らしく、n が 61以上ではタイムアウトエラーにならずに、そのまま式を表示する。
Integral3_2  Integral3_1  Integral3_3 
 
 
時間のかかる積分

時間のかかる積分計算として、以下の計算を調べる。
Integral_! 
この積分は、radモードでも degモードでも同じ結果になるが、計算は rad モードで行う。
積分の詳細はこちら

モデル結果出力処理時間
 fx-115ES PLUS 2nd editionπ394.1
 fx-991ES Aπ395.1
 fx-991ES PLUS 2nd editionπ400.6
 fx-993ESπ411.8
 fx-995ESπ427.3
 fx-JP900π83.7
 fx-5800Pπ173.3
 fx-9750GIII (OS3.40)π14.5
 fx-CP400 (OS2.01.6)3.141592654733.7
 fx-CG50 (OS3.50)π9.2
※ 参考までに、Natural-VPAM 機能を搭載した fx-993ESfx-995ESfx-JP900、そしてプログラム関数電卓 fx-5800P、グラフ関数電卓 fx-9750GIIIfx-CG50 の結果も併記する。

fx-CP400 では、他の電卓に比べて処理速度が圧倒的に遅い。
[2021/06/01 修正]
さらに π と表示されずに 3.141592654 と表示される。答えとしてπ と表記されないことから、CAS機能による不定積分がうまく得られていない可能性が考えられる。


fx-CP400 搭載言語

新世代Casio Basic との代表的な違いについて調べた結果を以下に紹介する;
- 代入: (→ではない)
- 文字/文字列出力:Print (" "は使えない)
- プログラム最後に書かれた式/変数/文字列 が表示されない (表示には PrintMessage コマンドが必須)
- Locate の座標指定:テキストウィンドウでしか使えないのに、液晶のピクセル座標を使うので不便だ。
 文字表示の桁/行指定ができなくなった。これは明らかに改悪
- Text:グラフウィンドウでしか使えない。同じ位置に表示すると全て重なって表示される。問題なのはエスケープシーケンスが使えず、さらに色指定で白が使えないので、一度Text()で描画した文字列を消せない点にある
- GetkeyGetkey KKにキーコード取得 (戻り値を返さないので While Getkey / WhileEnd と書けない)
- 条件ジャンプ :無くなった。
 If 文を使う必要がある。さらに If / IfEnd 内からGotoで出るコードは禁止、エラーになることがある。
 この機能が使えるCasio Basicの柔軟性が否定された形。この点で Casio Basic との互換性がなくなる
 実態は Goto での if 文からの脱出を複数回使うとSyntaxエラーになるが、エラーが出なければ使えるレベル。
 仕様が中途半端でスタックエラーが発生しているかのように見える。
- Skip コマンド:新たに登場。Do, While, For でループ内冒頭にジャンプできる。これは明らかに改善
- カウントジャンプ Isz / Dsz:無くなった。
- テキストウィンドウとグラフ(グラフィックス)ウィンドウを同時に表示可能 (他の機種は画面切り替えが必要)
- ユーザー関数を自由に作れる
- サブルーチンは、引数を渡せて、戻り値を返せる

入力や出力は、基本的にウィンドウを使う。
全てのコマンド類を確認していないが、代表的(と思う)点について触れた。fx-5800P やグラフ関数電卓搭載のCasio Basicとの互換性は殆ど期待できず、全く別の言語として捉えるべきだ。仕様上はむしろ Casio Python (Pythonモード) に近い。但し、Casio Basic や Casio Pythonと比較すると、本プログラム言語は中途半端と言わざるを得ない。最大の問題は処理速度の遅さにある。本言語は発展途上と言うべきだが、Casio Pythonが登場した現在では、CASモデルのBasicのアップデートにカシオがリソースを割くとも思われず、今後の改善はあまり期待できないと思われる。


プログラム出力画面

テキストウィンドウ
テキストウィンドウにテキストを出力するには、Print コマンドを使う。CAS機能無しの他のグラフ関数電卓や fx-5800P では " " で出力すると内部カーソルが改行される。Print コマンドを使うと同様に内部カーソルが改行され、改行により表示位置が 20ピクセル下に下がる。

テキストウィンドウにテキストを出力するには、Locate コマンドも用意されている。CAS機能無しの他のグラフ関数電卓や fx-5800P では、テキスト文字の表示桁と表示行の位置を指定するが、fx-CP400 での表示位置はフォントの左上の位置をピクセル位置で指定する。Locate はテキストウィンドウへの出力専用で、グラフ(グラフィック)ウィンドウには出力できないのにピクセル座標での位置指定を要求するのは、なんとも理解できない謎仕様だ。

Locate でテキストウィンドウに何桁、何行出力できるのかを、次のコードを書いて調べた。
TextDisp_src1 TextDisp_src2 
Pauseコマンドは1つしか書いていないので、Pause コマンドが左と右の繋ぎ目になっている。

実行すると、テキストウィンドウは28桁(横)、10行で丁度収まる。
TextDisp1 TextDisp1_2 
左の画面で [OK] をタップすると、右の画面になり、右下に [▶] アイコンが現れる。これは Pause コマンドで一時停止している時に表示される。ここで、7つ並んでいるショートカットアイコンの中央にある Resize をタップするとテキストウィンドウが縦長に変化する。
ShortCut 

縦長になってから右下の [▶] をタップすると、引き続きテキストが下に出力される。
TextDisp2
 TextDisp3 
そして最後にコードに書いたメッセージが出力される。
TextDisp4 
リサイズされた縦長のテキストウィンドウは、テキスト21行で丁度収まることが分かる。
テキストウィンドウのサイズ -  桁 x 行
 - テキストウィンドウ28桁 x 10行
 - テキストウィンドウ28行 x 21行

なおウィンドウへの出力なので、上記の桁や行を超えると、スクロールバーが現れる。つまり桁や行の制限は無いわけだ。
TextDisp_scroll1  TextDisp_scroll3TextDisp_scroll2 TextDisp_scroll4 

グラフウィンドウ (グラフィックウィンドウ)
グラフウィンドウに出力できるピクセル範囲を、ピクセルを1ドットづつ塗りつぶすコードを書いて調べた。
GrphDisp_src 
チョット脱線するが、fx-CP400 では作成したコードを実行する際に、パラメータを指定することができる。上のコードでは塗りつぶし開始ピクセルの位置を座標 (a, b) としていて、実行時にパラメータ ab を指定するようにしている。

2つのパラメータともに 1 を指定して、このコードを実行する。
GrphDisp_1 
横 309 ドット、縦 185ドットを塗りつぶすと、グラフウィンドウがちょうど塗りつぶされることが確認できた。塗りつぶした結果をよく見ると、上端と左端がともに1ドット塗りつぶされてない。PxlOn コマンドで指定する座標は、x座標は1以上、y座標も1以上を指定する仕様だ。一方 Plot コマンドで表示されるカーソル表示には、上端と左端のピクセルが使われる。このあたりは他のグラフ関数電卓と同じ仕様になっているのは興味深い。

さて、Pause コマンドを使っているので、右下に [▶] アイコンが表示されプログラムが一時停止されている。
ここで、ショートカットアイコンで Resize をタップすると、グラフウィンドウが縦長に広くなる。
ShortCut 
そして [▶] をタップすると、塗りつぶしが再開され、塗りつぶしが継続する。
GrphDisp_2 
縦 400ドットまで塗りつぶすと、縦長のグラフウィンドウにちょうど収まることが分かった。

グラフウィンドウのピクセル数 - (x, y)
 - グラフウィンドウ:ウィンドウサイズ(310, 186)、出力範囲(309, 185)
 - グラフウィンドウ:ウィンドウサイズ(310, 401)、出力範囲(309, 400)


グラフウィンドウへの出力は、範囲を超えてもスクロールバーが現れない点が、テキストウィンドウと異なる。


fx-CP400 のベンチマーク

以下、実際にプログラムを作成、実行した結果を紹介してゆく。

数値演算

先ずは、四則演算や関数計算を行うプログラムの処理速度を調べる。これまでに記事にした機種で共通して使えるコマンドを出来るだけ用いて、同じアルゴリズムで書いた「加算プログラム」と「数値積分プログラム」の実行速度比較を比較する。

加算プログラム
加算 

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

fx-CP400 のプログラム
AddTest_Goto_src AddTest_For_src 
GotoIf を使う例と For を使う例の2通りで処理速度を調べることにする。


数値積分プログラム
関数 

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

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

fx-CP400 のプログラム
FuncTest_Goto_src FuncTest_For_src 
GotoIf を使う例と For を使う例の2通りで処理速度を調べることにする。

以前調べた結果と併せて、上記の計算速度のを比較結果を示す;
加算プログラム数値積分プログラム
機種実行時間比較実行時間 (秒)比較
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 倍
fx-CP400Goto & If18.2 秒6.8 倍39.2 秒32.2 倍
For12.6 秒9.8 倍33.0 秒38.2 倍
fx-CG50
Goto3.9 秒31.6 倍8.2 秒153.9 倍
For2.3 秒53.5 倍6.3 秒200.3 倍

記念すべき FX-502P を基準に、処理速度が何倍になっているのかも示している。
fx-7000G から上の機種 (いずれも1980年台の製品) と比べると、四則演算は速く、関数処理はさらに速い結果になった。
但し、高精細カラー液晶を搭載した fx-CG50 に比べると、圧倒的に処理が遅い


グラフィック描画

グラフィックプログラム例

fx-7000G で実施したドット塗り潰しのコードは下記になる。
fx7000G_Dot  

同じ動作を fx-CP400 で書くと下記になる。fx-7000G には For 文が無いが、fx-CP400 では For 文を使うことにする。
DotTest_src_CP40

これを実行すると以下のようになる。
DotTest_result_CP400

描画には 327.5秒 (5分27.5秒) 要した。

fx-7000G 以降のグラフ関数電卓でも上記のアルゴリズムがそのまま走る。ところで2001年以降に発売されたグラフ関数電卓に搭載されている言語の中では fx-9860G が最もグラフィックス描画が速いのだが、それでも同じアルゴリズムの実行に 260秒程度かかる。ところが、1985年発売の世界初グラフ関数電卓 fx-7000G よりも遅い。fx-CP400 のグラフィック描画は、非常に遅いと言える。


テキスト描画

ピタゴラス数の計算プログラム。
プログラムの詳細はこちら
ピタゴラス数500個を計算して結果を出力するまでの時間を調べる。

Pytha_cp400_src1 Pytha_cp400_src2

これを実行すると、以下のような画面が得られる。
Pyha_cp400_1 Pytha_cp400_2


PYTHA
CFX-9850G165.6 秒---
CFX-9850GC PLUS267.7 秒0.62 倍
fx-9860G3.87 倍115.4 秒1.44 倍
OS 1.03115.8 秒1.43 倍
OS 1.04115.8 秒1.43 倍
OS 1.05115.9 秒1.43 倍
OS 2.01128.7 秒1.29 倍
fx-5800P---206.6 秒0.56 倍
fx-9750GIIIOS 3.4054.4 秒2.12 倍
fx-CG400OS 2.01.6512.0 秒0.23 倍
fx-CG50OS 3.5082.4 秒1.40 倍

いつくかのグラフ関数電卓での速度も合わせて示し、GetkeyLocate を最初に搭載した CFX-9860G を基準にして処理速度の比率も合わせて示した。fx-CP400 は恐ろしく遅いことが判る。


プログラム電卓の系譜

カシオグラフ関数電卓では、初めて高精細カラー液晶を搭載したカラーグラフ関数電卓 fx-CG10 Prizm が 北米で発売されたのが 2011年、同じものが北米以外で fx-CG20 と名前を変えて発売されたのが 2012年であった。これらのモデルには、新世代Casio Basicが搭載されていた。同時に発売されていたモノクロ液晶モデル fx-9860GII にも、ほぼ同じ仕様の 新世代Casio Basic が搭載されていた。そして、カラー液晶モデルは画面出力が極めて遅いという難点があった。 

翌年の 2013年に、カラーCASグラフ関数電卓 fx-CP400 が発売され、これには 新世代Casio Basic とは全く異なる Casio 仕様の構造化Basic が搭載された。このモデルに搭載されている構造化Basicは、構造制御のスタックが少なく使いづい上に、動作が異常に遅いといった、実用性に欠けるものだと言わざるを得ない

5年後の 2018年には、カラーグラフ関数電卓の新しいモデル fx-CG50 が発売され、新世代Casio Basicの動作速度、特に画面出力速度が大きく向上した。さらに、2020年には OSアップデートにより fx-CG50Pythonモードが追加された。

この Casio Python は画面出力を含めて、動作が劇的に速くなった (グラフィック出力は100倍以上向上)。Casio Python の仕様は、電卓への組込 microPythonに近いもので、PC向けの一般的な Python (CPython) の大幅なサブセット版になっており、実用プログラムを作るだけの機能はまだ搭載されておらず、まだ発展途上だと言える。

但し、プログラム電卓の搭載言語に Casio Python が加わったことは、大きな変化点と言える。一方で、fx-CP400fx-CG500 搭載の "発展途上" と言える構造化Basic は、主にその処理速度の遅さから、実用プログラムを作るには全く向いていない。そして Casio 仕様の構造化Basic のアップデートに今後カシオがリソースをつぎ込むとは考えにくい。これらのモデルはプログラミングを楽しむには全く向いていない。現在のところで言えば、構造化Basic を搭載することで搭載言語の進化を試みたが、その深化を試みる機会を失ったのが fx-CP400 (fx-CG500) の位置だと考えられる。




温故知新 - FX-502P / FX-602P / FX-603P
温故知新 - fx-4000P / fx-4500P / fx-4800P
温故知新 - fx-7000G 
温故知新 - CFX-9860G
温故知新 - CFX-9850GC PLUS
温故知新 - fx-9860G
温故知新 - fx-5800P
温故知新 - fx-9860GII
温故知新 - fx-CG10/ fx-CG20
温故知新 - fx-CP400
温故知新 - fx-CG50
温故知新 - fx-9750GIII
温故知新:番外編 - 関数電卓としての使い勝手
温故知新:番外編 - 電卓評価用の積分を解いてみる
温故知新:番外編 - 電卓評価用の複素数を解いてみた





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




keywords: プログラム関数電卓、プログラミング、Casio Basic、fx-CP400

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

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

fx-991CW の概要

 
2023/10/09

Casio fx-991CW 

fx-991CW は、その日本語モデル fx-JP900CW (2023年9月発売) よりも早く 2022年10月に欧米で市場投入されている。その外観は当然ながら fx-JP900CW とぼ同じだ。そこで fx-991CW の機能が どの程度 fx-JP900CW と異なっているのかを調べるために、実機を入手して比較してみた。

Amazon USA で購入
9/24 にAmazon USA で注文したときは $19.99 で、日本への送料が $10.16、合計 $30.15 であった (この記事を作成しているときは、$22.81 + $11.08 = $33.89 と値上がりしていた)。注文時の為替レートは 1 ドルが 148円程度だったので 4,463円 程度であった。


 fx-991CW fx-JP900CW 
    fx-991CW       fx-JP900CW
 2022年10月発売(欧米)  2023年9月発売(日本)

左側の fx-991CW は、 デザインや操作性、そして計算能力 について fx-JP900CW と基本的に同じで、搭載機能のみが異なる。デザインや操作性、そして基本機能については、fx-JP900CW と同じであり、管理人独自の見解は既に紹介していてる。
fx-JP900CW の概要



梱包と取扱説明書

991CWBox1_a 991CWPackage_a 991CWBox2_a 
シンプルな紙の箱に、電卓本体と折りたたんだ紙と保証書 (日本では無効) の2枚の紙だけが入っている。

冊子の状態での紙の取扱説明書は提供されていない。ネット上の取扱説明書 のURLを示すQRコードが電卓で表示できるので、それを利用してWeb上の取扱説明書を使う。


機能の差異 (fx-JP900CWとの比較)
一言で言えば、fx-991CW は 日本語モデル fx-JP900CW に比べて機能は少ない。日本語モデルのように多くの機能を詰め込んで良いというものでもないが...

キー
Deferenced_in_Keys
      fx-991CW のキー配置           fx-JP900CW のキー配置

1) 赤枠の2つのキーが [SHIFT] + [key] の裏機能を含めて、fx-991CWfx-JP900CW で異なっている。
2) 右下のキーが、fx-991CW では [EXE] キー、fx-JP900CW では [=] キーと、異なっている。

fx-991CW から派生した日本語モデルの fx-JP900CW とのキーの違いを設定した理由がよく分からない。


[HOME] - [Ratio] - fx-JP900CW には無い
fx-991CW にあり fx-JP900CW にない機能だ。
A:B = x:C とか A:B = D:x として、A, B, C, D が与えられたときの x を求める比例計算を行うものだ。日本では小中学校で習うものだが、わざわざ電卓の機能に入れている理由がよく分からない。


[SETTINGS] - System Settings - Digit Separator / 3桁区切り
Digit_Separator_small
      fx-991CW の3桁区切り            fx-JP900CW の3桁区切り

[SETTINGS] キーを押して現れるメニューで System Settings - Digit SeparatorON にしたときの出力。コンマではなく空白で3桁区切りとしている。欧米では地域によって、小数点にコンマかピリオドのどちらかを使うことから、間違いにないようにスペースを桁区切りにしているのだろう。


[SETTINGS] - System Settings / システム設定 - Multiline Font
fx-991CW では、画面に4行で出力するときのフォントと6行で出力する時のフォントを切り替える機能。
fx-JP900CW では、メニューの同じところに "言語" 選択となっており日本語と英語を切り替える。


[CATALOG] - Func Analysis / 解析関数 の項目
日本語モデル fx-JP900CW では "解析関数" に "総積" と "余り計算" が含まれているが、fx-911CW にはこれらの機能が無い。日本語モデルの方が高機能になっている。 


[CATALOG] - Numeric Calc / 数値計算 の項目
日本語モデル fx-JP900CW では、"最大公約数"、"最小公倍数"、"循環小数"、"整数部分の抽出" が含まれているが、fx-991CW にはこれらの機能が無い。日本語モデルの方が高機能になっている。


[TOOLS] 
fx-991CW では、HOME の Calculate 機能で {TOOLS] キーをおして現れるメニューは "Undo" のみ、1つしかない。
対して、日本語モデル fx-JP900CW では、“CALC”、"元に戻す"、"真偽判別を有効化" の3項目が現れる。
fx-991CW には真偽判別機能がない (これの必要性は別として...)。



計算性能

確認のため fx-JP900CW で行ったのと同じテストを行い、同じ結果となった。

分数表示と演算精度
235÷658 を計算すると 5/14 と表示される。fx-JP900 は ESシリーズの関数電卓のように [S↔D] キーが無い。代わりに [FORMAT] - "小数表示" - [=] の3アクションで 0.3571428571 と小数表示される。計算精度 10 桁となり、fx-JP900 や ESシリーズ関数電卓と同じ結果になった。


桁落ち - fx-JP900CW と同様に改善
123456789123456 - 123456789123411 を計算して桁落ち処理を調べる。fx-JP900 や ESシリーズ関数電卓、グラフ関数電卓では、本来 45 となるべきところ 0 となり、残り2桁で桁落ちが発生する。これはカシオ特有の問題である。
ところが、fx-JP900CW と同様に fx-991CW では15桁の同じ計算では、桁落ちが発生しない
取扱説明書によれば、fx-JP900 の内部計算桁数は15桁であるが、fx-991CWfx-JP900CW 同様に 23桁に改善されており、これの効果が出ていると考えられる。

試しに、20桁で以下の差を計算させると、
12345678901234567890 - 12345678901234567880 = 10 と正解が得られ、桁落ちは回避。
次に、同じ20桁で以下の差をみると、
12345678901234567890 - 12345678901234567881 = 9 となるべきところ、桁落ちが発生して 0 と出力された。
最後の2桁で桁落ちが発生するのは変わらないが、内部計算桁数が増えたことで20桁までは桁落ちが発生しにくくなった。
地味で細かいところで着実に改善されている!


内部演算精度 - fx-JP900CW と同様に改善
radモードで tan(π/2) = -∞ となるところ、近似的に tan(355/226) として、tan( の内部実装精度、および内部演算精度を調べる。
※ tan(355/226) = -7,497,258.18532558711290507183
 モデル 出力備考
fx-991CW: -7497258.18510桁全て正しい値
fx-JP900CW: -7497258.18510桁全て正しい値
fx-JP900: -7497258.447桁正しく最後の2桁は誤り
fx-991CW は fx-JP900CW と同様に fx-JP900 よりも計算精度が向上している。それが内部計算桁数の増加かアルゴリズムの改善によるものかは未確認だ。


sin の定義域付近での計算精度 - fx-JP900CW と同様に改善
※ sin(1x108) = 0.9316390271097260
 モデル 出力備考
fx-991CW:0.9316390271小数以下10桁まで全桁が正しい
fx-JP900CW:0.9316390271小数以下10桁まで全桁が正しい
fx-JP900:0.9316391026小数以下6桁まで正しい
fx-991CW fx-JP900CW と同様に計算精度が向上している。主に内部計算桁数の増加が寄与していると考えられる。


べき乗とルート計算 
(-32)^(3/5) を計算してみる。
fx-991CW-8
fx-JP900CW-8
・fx-375ES A-8
・fx-991ES PLUS 2nd edition: -8
・fx-115ES PLUS 2nd edition: -8
fx-JP900-8
・fx-5800P: -8
・fx-9750GIII: -8
・fx-CG50: -8

fx-991CWfx-JP900CWfx-JP900 や ESシリーズなどと同様に、いずれも実数値 -8 を表示した。カシオの関数電卓では、ESシリーズで初めてこの計算の実数値を計算できるようになっている (1つ前のMSシリーズではエラーになる)。
参考までに、プログラム関数電卓 fx-5800P、グラフ関数電卓 fx-9750GIIIfx-CG50 の結果も併記した。いずれも同じ結果になる。

但し、(-32)^(3/5) は、実数値 -8 以外に4つの複素数値を持つが、それらは全く出力されない。
CASIOのモデルだけでなく、世界の主要電卓でも正しく5つの値を計算して出力するものが見つかっていない。
温故知新:番外編 - 電卓評価用の複素数を解いてみた


積分計算 - fx-JP900CW と同様に高速化
時間のかかる積分計算として、以下を調べる。
Integral_! 
積分の詳細はこちら

この積分は、radモードでも degモードでも同じ結果になるが、ここでは計算を rad モードで行う。

モデル結果出力処理時間
 fx-991CW3.14159265463.8 秒
 fx-JP900CW3.14159265463.8 秒
 fx-JP900π83.7 秒
 fx-115ES PLUS 2nd editionπ394.1 秒
 fx-991ES Aπ395.1 秒
 fx-991ES PLUS 2nd editionπ400.6 秒
 fx-993ESπ411.8 秒
 fx-995ESπ427.3 秒
 fx-5800Pπ173.3 秒
 fx-9750GIII (OS3.40)π14.5 秒
 fx-CG50 (OS3.50)π9.2 秒
※ 参考までに、fx-JP900 と ESシリーズ関数電卓、そしてプログラム関数電卓 fx-5800P、グラフ関数電卓 fx-9750GIIIfx-CG50 の結果も併記する。

fx-991CW は fx-JP900CW と同じ速度で、fx-JP900 よりも大幅に高速化されていて、スタンダード関数電卓の中では最速である。ESシリーズよりも大幅な高速化が図られている。但し、数学自然表示で入出力するように設定しているにもかかわらず、結果出力はπとならず小数表示になる。


周期関数の積分 
積分計算にガウス・クロンロッド法が使われていることから、このアルゴリズムが苦手な多項式で表せない関数の代表選手として周期関数の積分を行って、タイムアウトする限界を比較してみます (Rad モード)。

Integral_Of_PeriodicFunc

機種計算できる nタイムアウトする n
fx-991CWn ≦ 12, n = 16, 32, 64, 128, 265n ≧ 17 (n ≠ 2m, 4≦m≦8)
fx-JP900CWn ≦ 12, n = 16, 32, 64, 128, 256n ≧ 17 (n ≠ 2m, 4≦m≦8)
fx-JP900n ≦ 8n ≧ 9
fx-5800Pn ≦ 8n ≧ 9
fx-9860GIIn ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6 ≦m≦9)
fx-CG20n ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6≦m≦9)
fx-CG50n ≦ 60, n = 64, 128, 256, 512n ≧ 61 (n ≠ 2m, 6≦m≦9)
 積分の詳細はこちら

fx-991CWfx-JP900CW と同様に、fx-JP900 に比べて周期関数の積分でタイムアウトしないで積分できる区間が大幅に広いことがわかった。内部計算桁数の増加が寄与していると思われる。グラフ関数電卓での結果のパターンとの類似性から、アルゴリズムの改善・変更があるかも知れない。


素因数分解 - fx-JP900CW と同様に高速化 
fx-991CW の内蔵機能の素因数分解を試す。その仕様は fx-JP900 から変わっていない。
fx-991CW の演算速度は fx-JP900CW と同様で、fx-JP900 よりも早くなっていることが確認できた。
これら新旧の2つの電卓を並べて置き、3,620,951,847 (= 32 × 19 × 23 × 409 × 2251) の素因数分解を同時に開始させると、何度やっても確実に fx-JP9000CW が僅かに早く計算が終了する (再現性100%)。


ClassPad.net 
ClassPad.net に CASIO ID アカウントでログインして、数学 - ClassPad Math にアクセスする。

日本では販売されていないが、fx-991CW を選べるのはお得感がある。上記の各種計算テストを実施すると、同じ出力結果になり、時間のかかる計算も同じような時間で結果を出力するのが面白い。


表計算だけがメモリ保存される 
プログラム関数電卓やグラフ関数電卓は、一旦電源を切ったり他のモードを使っても、計算履歴や結果がメモリ保存される。一方これまでのスタンダード関数電卓はこれらの計算履歴がクリアされた。
fx-991CWfx-JP900CW と同様に、表計算だけがメモリ保存されることを確認した。他はクリアされる。


まとめ

fx-991CWfx-JP900CW と同じデザイン、ほぼ同じUIを有し、計算能力も同じだが、機能数は fx-JP900CW よりも少ない。

言い換えれば、fx-JP900CW の設計仕様上の欠点(関数電卓としての計算仕様や操作性の問題) をそのまま持っている。管理人にとって fx-991CWfx-JP900CW と共に日常的に使うには問題が多すぎる。

fx-JP900CW の概要

理工系の計算を高頻度で行う学生や技術者の利便性を犠牲にして初心者に分かりやすくし、さらに中高年にとっての視認性向上を果たした設計は、これまでの関数電卓ヘビーユーザーには支持されないだろう。どの程度販売が継続するのか、注視したいと思う。

fx-JP900CW / fx-911CW  のイースタエッグ - 診断機能








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





keywords: CasioBasicプログラム電卓、fx-CG50

関連記事

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

fx-JP900CW / fx-991CW のイースタエッグ - 診断機能

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


  2023/09/23
fx-991CWを追記 2023/10/09

fx-JP900CW / fx-991CW の診断モード


fx-JP900CWfx-991CW 
   fx-JP900CW        fx-991CW


今回は、fx-JP900CW と fx-991CW のイースターエッグです。fx-991CW は 2022年10月に欧米で発売され、その日本語モデルである fx-JP900CW が 2023年9月に発売されました。 


診断モードへの入り方
[SHIFT]+[7]+[CATALOG] を同時押ししたまま [ON] を押します。この操作は電源が入っている、入っていないに関わらず有効です。

診断モードに入って何もしないと、診断モードを抜けて通常の計算モードに移行します。診断モードに入った後、タイムアウトする前に

[8] を押すか、
・[9] を押すか、
・[6] を押すか

で、走るルーチンが異なります。


[8] を押した時の処理
操作画面出力
[SHIFT]+[7]+[CATALOG]+[ON]診断モードに入る
1[8]キーマトリックス試験の表示※3)
2太陽電池を完全に覆う※2)変化なし
38つ全てのキーを順不同で押す押したキー表示が反転する
Battery MODEL OK! と表示
4太陽電池の覆いを外すSolar MODEL OK! と表示
5[AC]診断モードから計算モードへ移行
※1)  [ON]を押せば、いつでも診断モードから抜けられます。
※2) 太陽電池を覆うのは、8つのキーを押す前のどのタイミングでも良い。
   最後の8つめのキーを押す(順不同) 直前に太陽電池を覆っても良い。
※3) キーマトリックス試験の表示;
[1]KI1K01[HOME]KI8K02
[5]KI2K02[9]KI3K03
[tan]KI4K04[cat]KI6K05
[pdown]KI7K06[0]KI5K07


[9] を押した時の処理
操作画面出力
0[SHIFT]+[7]+[CATALOG]+[OK]診断モードに入る
1[9]8888888888888888

   8.888888889x
1015
2[SHIFT]インジケータと全ドット点灯
3[SHIFT]インジケータと全ドット消灯
4[SHIFT]インジケータとドットが交互(千鳥格子状)に薄く点灯
5[SHIFT]インジケータ消灯、ドットは反転
6[SHIFT]ファームウェハのバージョンとチェック結果の表示
EY-031
V.A Bt        OK
SUM4A91 OK
Press AC

右にQRコード表示(上記3行とシリアル番号のコード)
7[AC]シリアル番号を表示 
8[AC]00と表示 
9[HOME]01と表示、他のキーは受け付けない
10十字キーの[上矢印]02と表示、他のキーは受け付けない
11ページUp/Downの[上矢印]03と表示、他のキーは受け付けない
12[SETTING]04と表示、他のキーは受け付けない
13戻るボタン05と表示、他のキーは受け付けない
14十字キーの[左矢印]06と表示、他のキーは受け付けない
15十字キーの[OK]07と表示、他のキーは受け付けない
16十字キーの[右矢印]08と表示、他のキーは受け付けない
17ページUp/Downの[下矢印]09と表示、他のキーは受け付けない
18[SHIFT]10と表示、他のキーは受け付けない
19[VARIABLE]11と表示、他のキーは受け付けない
20[FUNCTION]12と表示、他のキーは受け付けない
21十字キーの[下矢印]13と表示、他のキーは受け付けない
22[CATALOG]14と表示、他のキーは受け付けない
23[TOOLS]15と表示、他のキーは受け付けない
24[x] ~ [log] まで順に押す16 ~ 21 まで順に表示、他のキーは受け付けない
25[Ans] ~ [)] まで順に押す22 ~ 27 まで順に表示、他のキーは受け付けない
26[7][FORMAT] まで順に押す28~ 46 まで順に表示、他のキーは受け付けない
27[=]コントラスト調整画面
28[AC]TEST OK

Reset All
Press AC
29[AC]診断モードから計算モードへ移行
※ [ON] を押せばいつでも診断モードが中断


[6] を押した時の処理
これは [9] を押した時の処理を複数のメニューに分けて実行するモードです。
操作画面出力
0[SHIFT]+[7]+[CATALOG]+[OK]診断モードに入る
1[6]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
メニュー番号 [1][5] のいずれかを押す
2.1※ [1]を押したときインジケータと全ドット点灯
2.2[SHIFT]インジケータと全ドット消灯
2.3[SHIFT]インジケータとドットが交互(千鳥格子状)に薄く点灯
2.4[SHIFT]インジケータ消灯、ドットは反転
2.5[SHIFT]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
3.1※ [2]を押したときファームウェハのバージョンとチェック結果の表示
EY-031
V.A Bt        OK
SUM4A91 OK
Press AC

右にQRコード表示(上記3行とシリアル番号のコード)
3.2[AC]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
4.1※ [3]を押した時00と表示 
4.2[HOME]01と表示、他のキーは受け付けない
4.3十字キーの[上矢印]02と表示、他のキーは受け付けない
4.4ページUp/Downの[上矢印]03と表示、他のキーは受け付けない
4.5[SETTING]04と表示、他のキーは受け付けない
4.6戻るボタン05と表示、他のキーは受け付けない
4.7十字キーの[左矢印]06と表示、他のキーは受け付けない
4.8十字キーの[OK]07と表示、他のキーは受け付けない
4.9十字キーの[右矢印]08と表示、他のキーは受け付けない
4.10ページUp/Downの[下矢印]09と表示、他のキーは受け付けない
4.11[SHIFT]10と表示、他のキーは受け付けない
4.12[VARIABLE]11と表示、他のキーは受け付けない
4.13[FUNCTION]12と表示、他のキーは受け付けない
4.14十字キーの[下矢印]13と表示、他のキーは受け付けない
4.15[CATALOG]14と表示、他のキーは受け付けない
4.16[TOOLS]15と表示、他のキーは受け付けない
4.17[x] ~ [log] まで順に押す16 ~ 21 まで順に表示、他のキーは受け付けない
4.18[Ans] ~ [(] まで順に押す22 ~ 26 まで順に表示、他のキーは受け付けない
4.19[)]TEST OK

Press AC
4.20[AC]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
5.1[4]を押した時27と表示
5.2[7][FORMAT] まで順に押す28~ 46 まで順に表示、他のキーは受け付けない
5.3[=]TEST OK

Press AC
5.4[AC]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
6.1[5]を押した時コントラスト調整画面
7[AC]1. Display
2. Version&SUM
3. Key1 test
4. Key2 test
5. Contrast
AC:EXIT
8[AC]診断モードから計算モードへ移行
※ [ON] を押せばいつでも診断モードが中断





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




keywords: fx-JP900CWfx-991CW関数電卓、イースタエッグ、診断機能

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

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

Casio Python - 10進数除算の出力と精度:高速素因数分解(7)

Python Casio Python
 Casioグラフ関数電卓の Python を使ってみる
     - 10進数除算の出力と精度:高速素因数分解(7) 
目次


初版:2020/08/24
追記:2020/10/22
修正:2023/10/09

前の記事 - 12. 要素数の大きいリスト |  次の記事 - 14. CGモデルとFXモデルのPythonモードの違い


13. 10進数除算の出力と精度:高速素因数分解(7) <fx-CG50 OS3.40以降>

前回は、高速素因数分解スクリプト FactorG5.py (ver 5.0) と FactorG6.py (Ver 6.0) を作りました。
FactorG6.py (Ver 6.0) はスタック不足のために実行てきないことが分かったので、FactorG5.py (Ver 5.0) が前回の成果です。

高速素因数分解 Ver 5.0 - FactorG5.py のダウンロード [2023/10/09 リンク先が違っていたのを修正]

Ver 5.0 で色々な入力を試していると、仕様通りに動作しないケースが見つかりました。ここで仕様とは、Casio Baisc のプログラムとできるだけ同じ動作にすることです。

例えば、Casio Basic では、計算式を入力するとその計算結果が入力される仕様になっていますが、このようにならないケースが見つかりました。これは、Casio Pythonでの10進数計算の仕様が Casio Basic と異なっているのが原因だと分かりました。

Casio Python (Python) の仕様だから、このまま受け入れることは全く問題ないと思います。但し管理人自身の興味と趣味から、できるだけ Casio Basic でのプログラムと動作が互換になるように工夫して、FactorG7.py (Ver 7.0) を作ってゆきます。


13.1 Casio Python での除算結果のデータ型
    <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

FactorG5.py (Ver 5.0) を起動して入力する時、以下のようなことがあります。

1500_10_factor 

入力時に 120/2 とすれば 整数 60 が入力されるべきところ *must be integer とエラー表示されます。同様に 15000/10 とすると 整数 1500 が入力されるはずなのに 整数でないというエラーが表示されます。つまり現在のロジックでは、小数として認識されているということです。

そこで、シェル画面で 120/215000/10 を計算させてみると、以下のような浮動小数点表示になっています。

1500_10_calc 

数値演算は内部的には2進数で実行されているので、2の乗数を2で除算する例として 256/2 を計算すると 128.0 となります。

従って、Casio Python では、除算の結果は内部2進数演算とは無関係に、必ず浮動小数点型 (float型) で出力されることが分かります。そこで、入力ルーチンを変更して、小数点以下が 0 の浮動小数点を整数に変換して、整数入力と認識できるようにしようと思います。


13.2 Casio Python での関数計算結果のデータ型 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

Ver 5.0 の入力で、関数を使った計算結果も浮動小数点になるので、それにも対応してみます。

200_log_factor 200_cos_factor 

200*log10(10) の計算結果は整数 200 になって欲しいのですが、Ver 5.0 の入力ルーチンでは小数と判定されています。

そこで、シェル画面でこの計算を実行してみます。

200_func_calc 

すると、両方とも 200.0 と小数になっています。
Casio Python では、関数計算の結果は浮動小数点型 (float型) になっていることが分かります。

従って、Ver 5.0 の入力ルーチンを 計算結果の小数点以下が 0 の時は整数に変換し、整数入力と判定するように変更します。


13.3 Casio Python での除算計算の精度 <fx-CG50 OS3.40以降専用>

Ver 5.0 で素数 821 を入力すると、素因数として 821 1つが得られます。 

821_factor 

では、821 が計算結果になる 1642/2 を式として入力すると、以下のように小数として認識されてしまいます。

1642_div_factor 

そこで、シェル画面で 1642/2 を入力してみると、以下の計算結果となります。

1642_div_calc 

Casio Python は、小数点以下13桁目が 1 になっており、誤差が抑制されていません。内部では2進数計算を行っているので、10進数計算には必ず誤差が伴います。多くの場合では誤差がうまく抑制されますが、誤差が現れたのが今回の事例です。

CPython ではこの誤差をうまく抑制しています。Windows 10 にインストールした Python 3.6.8 での計算結果は、下記のように誤差を抑制したうえで、浮動小数点型 (float型) で出力されていることが分かります。
CPython_1642_2

NoteWindows 版 Python のインストール
Windows版 Python をインストールすると、スタートメニューには PythonIDLE の2通りの 環境があります。上で示したのは IDLE 画面です。IDEL ではスクリプトをファイルに保存したり、保存したスクリプトを読み出して実行する機能があるので、管理人は CPython の学習には IDLE をよく使います。

さて、CPython では、PCの演算仕様によりますが、多くの場合は 53桁までの精度が確保されています。一方 Casio Python は15桁の精度しかありません。

Note浮動小数点演算 - その問題と制限 (Python 公式サイト) 参照

1642/2 の計算で誤差が表面化するのは、Casio Python の限界として、受け入れるしかなさそうです。


13.4 0 および負の整数入力時の処理 <fx-9750GIII, fx-9860GIII, fx-CG50 OS3.40以降>

オリジナルの Casio Basic プログラムでは 0 以下の整数入力をチェックしてエラーメッセージを出力し、そこでプログラムを終了しています。一方、Casio Python に移植したスクリプトでは、0以下の整数入力のチェックを行っていませんでした。うっかりしていました(^_^;

そこで、今回は 0 と負の整数入力をチェックして、エラーメッセージを出力したうえで、入力ルーチンを繰り返すように修正しようと思います。


13.5 入力ルーチンの修正

以下の Ver 5.0 の入力ルーチンを修正してゆきます。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.1 入力値が小数点以下 0 の小数の場合に処理を追加

if 文で最初に行っているのが、文字列中にコンマ . が含まれているかの判定で、ここで入力値が小数かどうかを調べています。そこで、この判定の前に、入力値の小数点以下が0の時は、入力値を整数に変換し、それを文字列変数 inp に格納する処理、具体的には以下の2行を追加します。

if frac(eval(inp))==0:
 inp = str(int(eval(inp)))


この2行の説明
変数 inp は、Input() 関数が返す値で、Input() 関数は文字列を返します。
eval()関数に 文字列変数 inp を渡すと、inp が計算式ならば、eval() 暗数はその計算結果を文字列で返します。
入力値が小数点以下 0 の浮動小数点型(float型) の数値とすると、数値から小数部を取り出す frac() に渡すと 0 を返します。 
frac() 関数はユーザーモジュール u.py で以下のように定義したものでした。
def frac(x):
 return x - int(x)

入力値が、小数点以下 0 の小数の場合は、
frac(eval(inp))==0 
True (真) となります。

これが成立するときに、小数表現の文字列 inp を整数表現に変換するため、以下のように記述します。
inp=str(int(eval(inp)))

結果出力の disp() 関数において inp 文字列変数の文字数から桁数を算出して表示しているので、ここで inp変数を更新しておく必要があります。

これまでに修正したスクリプトは以下になります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:   ◀ 追加
  inp str(int(eval(inp)))  ◀ 追加
 if '.' in inp:
  print('*must be integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.2 入力値が負の数値の場合の処理

inp は入力を文字列にしたものです。

inp にコンマ . が含まれるかどうかで、inp が小数かどうかを判定しています。そこで、小数かどうかの判定の if 文に続き elif 文で inp にマイナス記号 - を含むかどうかで、入力が負の数値かどうかを判定します。

 elif '-' in inp:
  print('*must be positive\n integer')
  continue


これを追加して、入力ルーチンは以下のようになります。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:                ◀ 追加
  print('*must be positive\n integer')  ◀ 追加
  continue                  ◀ 追加
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   break
 else:
  continue


13.5.3 入力が 0 の時の処理

Ver 5 の入力ルーチンを修正してこれまでに得られたスクリプトでは、入力が 0 以上の整数の場合の処理は、上で追加した elif 文の次に続く以下の部分です。入力の文字列 inp に小数点のコンマ . を含まず、負の記号 - を含まないとき、以下のように .isdigit() 関数を用いて数値であるかどうかを判定しています。

 elif inp.isdigit():
  if len(inp)>digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f=int(inp)
   break

inp.isdigit()True (真) の時、さらに文字列の長さが digit (15桁) を超える時は、15桁以内で入力するようエラーメッセージを表示したのち、入力ルーチンを繰り返します。15桁以内の場合は、else 節において文字列 inp を 整数 f に変換してから break により入力ルーチンのループから脱出し、素因数分解ルーチンへ移ります。入力ルーチンの中の if 文による条件分岐で、この時のみ break でループから脱出し、それ以外は continue でループを継続するようにしています。

さて、この else 節で行う文字列 inp を整数 f に変換するところで、入力が 0 の時の処理を行います。
f は整数変数なので、f が 0 でない時 (f != 0) は 適切な整数入力値だと判定し break でループを脱出、そうでない時は continue でループを継続するようにします。

具体的には、else 節に追記 (赤文字) して以下のようにします。

 else:
  f=int(inp)
  if f != 0:
   break
  else:
   print('*must be positive\n integer')
   continue


以上を反映した入力ルーチンを示します。

while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:                  ◀ 追加
    break
   else:                    ◀ 追加
    print('*must be positive\n integer')  ◀ 追加
    continue                  ◀ 追加
 else:
  continue


以上で、Casio Basic 版とほぼ同じ入力仕様に修正できたと思います。


※ 高速素因数分解:15桁入力対応、Casio Baisc 版とほぼ同じ入力仕様版
  - FactorG7.py のダウンロード


fx-CG50 Pythonモード:高速素因数分解 - FactorG7.py
"""Sample script

 Exercise;
 ported from Casio Basic
 "Prime Factor 15 digits"
  factorG.py
   ver 7.0

 by Krtyski/e-Gadget
"""

from u import *
digit 
15
search 0

def disp():
 global aefz
 clear_screen()
 locate(00f3'm'0)
 locate(160': ' str(len(inp)) + ' digits'3'm'0)
 locate(16, 11, 'search:'+str(search), 2, 'm', 0)
 line(0,15,383,15,1,0)
 for i in range(115):
  if<= e:
   dx int(i/12)*16
   dy int(i/12)*11
   locate(0+dxi-dyz[i], 1'm'0)
   locate(10+dxi-dy'^('2'm'0)
   locate(12+dxi-dyz[i+21], 1'm'0)
   locate(15+dxi-dy')'2'm'0)
   if i==12:
    line(190,15,190,191,1,0)
 locate
(00''0'm'1)


while 1:
 try:
  inp str(eval(input('Number:')))
 except (SyntaxErrorTypeErrorNameError) as e:
  print(e)
  print('*must be number or\n expression')
  continue
 if frac(eval(inp))==0:
  inp str(int(eval(inp)))
 if '.' in inp:
  print('*must be integer')
  continue
 elif '-' in inp:
  print('*must be positive\n integer')
  continue
 elif inp.isdigit():
  if len(inp) > digit:
   print('*must be '+str(digit)+' digit\n or less')
   continue
  else:
   f int(inp)
   if f != 0:
    break
   else:
    print('*must be positive\n integer')
    continue
 else:
  continue

list(range(23))
for e in range(1,23):
 z[e0
0
f
int(sqrt(a))

prime_list [2,3,5,7,11]
for b in prime_list:
 search+=1
 d a/b
 if frac(d)==0:
  e+=1
  z[e] = b
  while 1:
   a int(d)
   z[e+21]+=1
   d a/b
   if frac(d):
    break
  c int(sqrt(a))
 ifcbreak


increment = \
[4,2,4,6,2,6,4,2,
 4,6,6,2,6,4,2,6,
 4,6,8,4,2,4,2,4,
 14,4,6,2,10,2,6,6,
 4,2,4,6,2,10,2,4,
 2,12,10,2,4,2,4,6,
 2,6,4,6,6,6,2,6,
 4,2,6,4,6,8,4,2,
 4,6,8,6,10,2,4,6,
 2,6,6,4,2,4,6,2,
 6,4,2,6,10,2,10,2,
 4,2,4,6,8,4,2,4,
 12,2,6,4,2,6,4,6,
 12,2,4,2,4,8,6,4,
 6,2,4,6,2,6,10,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,4,6,6,2,
 6,6,4,6,6,2,6,4,
 2,6,4,6,8,4,2,6,
 4,8,6,4,6,2,4,6,
 8,6,4,2,10,2,6,4,
 2,4,2,10,2,10,2,4,
 2,4,8,6,4,2,4,6,
 6,2,6,4,8,4,6,8,
 4,2,4,2,4,8,6,4,
 6,6,6,2,6,6,4,2,
 4,6,2,6,4,2,4,2,
 10,2,10,2,6,4,6,2,
 6,4,2,4,6,6,8,4,
 2,6,10,8,4,2,4,2,
 4,8,10,6,2,4,8,6,
 6,4,2,4,6,2,6,4,
 6,2,10,2,10,2,4,2,
 4,6,2,6,4,2,4,6,
 6,2,6,6,6,4,6,8,
 4,2,4,2,4,8,6,4,
 8,4,6,2,6,6,4,2,
 4,6,8,4,2,4,2,10,
 2,10,2,4,2,4,6,2,
 10,2,4,6,8,6,4,2,
 6,4,6,8,4,6,2,4,
 8,6,4,6,2,4,6,2,
 6,6,4,6,6,2,6,6,
 4,2,10,2,10,2,4,2,
 4,6,2,6,4,2,10,6,
 2,6,4,2,6,4,6,8,
 4,2,4,2,12,6,4,6,
 2,4,6,2,12,4,2,4,
 8,6,4,2,4,2,10,2,
 10,6,2,4,6,2,6,4,
 2,4,6,6,2,6,4,2,
 10,6,8,6,4,2,4,8,
 6,4,6,2,4,6,2,6,
 6,6,4,6,2,6,4,2,
 4,2,10,12,2,4,2,10,
 2,6,4,2,4,6,6,2,
 10,2,6,4,14,4,2,4,
 2,4,8,6,4,6,2,4,
 6,2,6,6,4,2,4,6,
 2,6,4,2,4,12,2,12
]

while 1:
 for i in increment:
  search+=1
  b+=ia/b
  if frac(d)==0:
   e+=1
   z[e] = b
   while 1:
    a int(d)
    z[e+21]+=1
    d a/b
    if frac(d):
     break
   c int(sqrt(a))
  ifcbreak
 ifc
break

if a 1:
 e+=1
 z[e] = a
 1
 z[e+11] = 
1

disp
()


13.6 完成した FactorG7.py の動作確認

120/2 と入力すると、計算値 60 が入力され、正常に素因数分解されます。
60_factor 

15000/10 と入力すると、計算値 1500 が入力され、正常に素因数分解されます。
1500_factor 

200*log10(10)200*cos(0) と入力すると、計算値 200 が入力され、正常に素因数分解されます。
200_factor 

1642/2 と入力すると、Casio Python の計算精度の制限により、計算結果が 821.0000000000001 となり、整数でないのでエラー表示の上入力ルーチンが継続されます。
1642_div_factor 1642_div_calc 

この問題は Casio Basic では発生しません。Casio Python の内部2進数演算が15桁の精度では、誤差が抑制しきれていないという仕様が明らかになりました。

[2020/10/11 追記]
但し、1642/2 と入力する代わりに Python の演算子を使って 1642//2 と入力すれば、その計算結果は 821 となるので、問題は解消されます。

なお、1642/2 と入力する必然性はなく、821 と入力すれば問題無く素因数分解できるので、大きな問題ではないと考えます。今後は、スクリプトの目的に応じて10進数の除算の誤差について留意する必要があります。




目 次

前の記事 - 12. 要素数の多いリスト

次の記事 - 14. CGモデルとFXモデルのPythonモードの違い





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




keywords: fx-CG50Pythonfx-9750GIIIfx-9860GIIIプログラム関数電卓

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

関連記事

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

管理人からのメッセージ

更新 2023/09/08


はじめに

当ブログでは、プログラム関数電卓 (fx-5800P のみ) と グラフ関数電卓 をまとめて プログラム電卓 と呼んでおり、これらのモデルで動作する Casio BasicCasio Python (Pythonモード) によるプログラミング、加えてアドインCasio Basic - C.Basic のプログラミングをメインテーマとしています。

それに伴い、以下のプログラム電卓についても取り上げています。

プログラム関数電卓
モデル名使用できる言語
fx-5800P唯一のプログラム関数電卓 (fx-72Fは敢えて除外)Casio Basic


グラフ関数電卓
モデル名使用できる言語
fx-CG50高精細カラー液晶Casio Basic, C.Basic, Casio Python
fx-CG20高精細カラー液晶 - 生産中止Casio Basic, C.Basic
fx-9750GIIIモノクロ液晶 - 北米モデルCasio Basic, C.Basic, Casio Python
fx-9860GIIIモノクロ液晶 - 欧州モデルCasio Basic, C.Basic, Casio Python
fx-7400GIIIモノクロ液晶 - 欧州・アドイン不可モデルCasio Basic (機能限定版)
fx-9860GII / SDバックライトモノクロ液晶 - 生産中止Casio Basic, C.Basic
fx-9860G / SD / Slimバックライトモノクロ液晶 - 生産中止Casio Basic, C.Basic
CFX-9850G - 9850GC3色カラー液晶 - 生産中止Casio Basic


その他のカシオ電卓
プログラミング機能のないカシオ電卓についても、そのデザインや機能、コンセプトに関連して、適宜取り上げています。


カシオのプログラム電卓では、新世代Casio Basic、アドインCasio Basic - C.Basic そして一部のモデルで Pythonモード - Casio Python が使えます。当ブログでは、電卓でプログラミングする楽しさの発信がメインテーマです。

新世代Casio Basic
2005年に登場した (日本では 2006年に登場した) fx-9860G 以降のグラフ関数電卓や 2006年に登場した fx-5800P に搭載されているプログラミング言語を "新世代 Casio Basic" と私は呼んでいます(海外専用モデル ClassPadシリーズには異なる Basic が搭載されており、新世代Casio Basic には含まない)。そもそも Casio Basic という言い方は私が勝手に言っているとばかり思っていたのですが、海外のカシオプログラム電卓のファンが既にCasio Basic と呼んでいました。WiKi Pedia には、Casio Basic のエントリーがあります。日本でググると Casio Basic はカシオの時計の名前だと分かります。

アドインCasio Basic - C.Basic
2015年末に sentaro様により初期の C.Basic のコンセプトと初期バージョンが公開され、当ブログでバージョンアップとサポートを行う機会を頂きました。fx-9860G 以降のアドイン機能付きの全てのグラフ関数電卓に対応するに至り、純正 Casio Basic の上位互換であるたけでなく、その高速性、高機能ゆえに、国内以上に欧米で多くのファンを獲得しています。

Casio Python
2019年に fx-CG50 に Pythonモードが追加され、2020年には fx-CG50 がOS3.50 へアップデートし、さらに fx-9860GIII と fx-9750GIII ではOS3.40 へアップデートすることで、Pythonモードでグラフィックモジュールが追加されます。これにより そこそこ使えるスクリプトが書けるようになったので、Casio Python や PCでの Python (CPython3) を勉強しながら Casio Python の連載記事を始めました。Python はプロならそれ相当に、プロでない人でもそれなりに使いやすい言語だと実感しており、それゆえに世界中で Python人口が増えているのだと思います。

その他のプログラミングの話題
プログラミングは管理人の趣味の1つなので、プログラム電卓以外でのPCでのプログラミングの記事も掲載しています。人生初のプログラミングは FX-502P で作ったゲーム。PCでの初めてのプログラミングは N88-BASIC、その後 MS-DOS や Windows で、Basic、C、C++ などでのプログラミングを楽しんできました。数年前は C# の味見をしながら 簡単な Windows アプリを作ってみました。プログラム電卓でのプログラミングの支援ツールとして、コードを自動作成するツール (Windowsデスクトップアプリ) を C# で作って活用することもあります (下記記事で紹介)。
グラフ関数電卓 - 高速素因数分解、15桁対応
Casio Python - 要素数の多いリスト:高速素因数分解(5)

Python でも遊んでいます。勉強しながらカメラを繋いだRaspberry Pi  と Windows 10 PCを WiFi 接続し、カメラの静止画を表示する簡単なアプリを Python で書いてみました。Raspberry Pi の Pi は Python を指していて、Python 使用を推奨しています。



Casio Basic との出会い - e-Gadget 開設のきっかけ

2007年のある日、fx-5800P を高性能な関数電卓として購入し、せっかくプログラミング機能が付いているのでチョット使ってみようと思ったのが Casio Basic との出会いでした。当時は電卓でプログラムを作ろうとは思っていませんでした。

管理人は、PCでのプログラミング経験があるので、最初は Casio Basic の貧弱さに驚き、まあ電卓の言語なんてこんなものか、と思いました。キーボードを叩けば入力できるPCと違って、最初はコマンドの入力にも不自由しました。取扱説明書にはコマンドについて殆ど最低限のことしか書かれていないので、あまりあてになりません。そこで、PCでのプログラミングの感覚で Casio Basic のコードを試しに書くと結構使えることが分かり、Casio Basic に興味を持ちました。自分なりに言語仕様を調べてみようと思った時、主に調査結果を残すために 当ブログ e-Gadget を作りました。2013年10月30日のことでした。



当ブログの推移

Casio Basic はよくできた言語だと思います。これは構造化プログラミング言語ではなく局所変数がなく自作関数が使えないのですが、行番号が不要でブロック構造でコーディング可能で、さらにリアルタイムのキー入力を検知でき、自由な位置に出力できることから、その能力は侮れません。最も非力な fx-5800P で実用プログラムやアクションゲームを簡単に作れる程度の能力を持っていることは、意外に知られていません。当ブログでは実際に作った実用プログラムやゲームを紹介しています。
プログラムライブラリ - 目次 -

新世代 Casio Basic の搭載機種の間でプログラムの互換性が高いのも極めて大きな利点です。電卓さえあれば、通勤電車の中でさえプログラミングできます。いつでもどこでもプログラミングできるのは電卓ならではです。なので当ブログの英語版コンセプトは "Anywhere Anytime Programming" としています。

新世代Casio Basic や、それを搭載した機種でのプログラム実行の利便性は、実際に使い込んで初めて分かると思います。換算プログラムや実用プログラムが作れるので、趣味だけでなく日々の仕事や生活に役立ちます。

この良さは、実際に使い込んで感じるもので、カタログや取扱説明書を読むだけでは分かりにくいと思います。1990年台のプログラム電卓からは大きく進化しています。古い情報による先入観で誤解したまま発信しているのをたまに見かけます。今やプログラム電卓は海外市場が主戦場なので、カシオ自身が日本語で情報発信していません。使い込んで初めてその良さに気付く現状は、ちょっと残念に思います。高級言語でのプログラミング経験者なら、高品質なプログラムが楽にスグ作れます。プログラミング初心者には、新世代Casio Basic を味見したり、プログラム入門に良いと思います。
Casio Basic入門 - 目次 -

ブログ開設当初は fx-5800P 搭載 Casio Basic のみを取り扱っていましたが、その後 グラフ関数電卓に搭載されている Casio Basic の使いこなしも視野に入れ、グラフィックスも扱うようになりました。
Casio Basic - 機種間の移植性

当ブログ e-Gadget では、取扱説明書では絶対に分からない新世代 Casio Basic の使いこなしを中心にして、プログラム電卓に関する情報を発信しています。 

=====

fx-5800P 欠点の解消:
fx-5800P の欠点はいくつかありますが、PCとリンクしてプログラムコードを保存したり電卓に転送できないので、プログラムを皆さんと楽に共有できないのが最大の問題でした。ところが、現在ではそれが 可能になっています。ご興味があれば  "CcLinker" で検索してください。当ブログの紹介ページや CcLinker の作者によるオリジナルページがヒットします。
ついにfx-5800PがPCリンク可能になった

また、fx-5800P はカバーヒンジの作りが貧弱で簡単に壊れるという弱点もありますが、完璧確実で安く修理する方法があるので紹介しています。"fx-5800Pリニューアル" で検索すると記事がヒットします。
⇒ fx-5800Pの破損ヒンジの交換、ついでにリニューアル


 カシオプログラム電卓の系譜
1978年発売の FX-502P は手帳サイズの電卓にプログラミング言語を搭載したプログラム電卓です。FX-502Pから現在のモデルに至るまでのプログラミング言語仕様の変化を調べ、カシオ製プログラム電卓の系譜を明らかにするため、進化上のターニングポイントになるモデルを入手し、実際に動作させて調査しています。それにより、現在の Casio Basic に至る変遷の過程を描く試みです。今のところ fx-9860GII までを調査しています。
プログラム電卓温故知新 - 目次 - 

FX-502P が掲載されている 1981年2月版のカタログから fx-9860GII 新発売の 2009年10月まで、上記の節目に当たるプログラム電卓が掲載されているカタログを眺めて、当時の時代背景や電卓製品の進化を感じて楽しむ企画も並行して進めています。
楽屋裏 - プログラム電卓メモワール1981-2


 アドイン版 Casio Basic - C.Basic の話題:
fx-5800P よりも高価だけど能力の高いグラフ関数電卓も Casio Basic が使えて、fx-5800P との互換性が比較的高いことも確認済みです。fx-5800P よりもプログラムが高速動作しますが、グラフィックス描画は残念なくらい遅く、Casio Basic のグラフィックスコマンドはグラフ描画機能を活かすマクロコマンドの位置づけでしかありません。より高速で高機能なコマンドを使ってプログラミングしたいという目的で、アドイン版 Casio Basic の開発が継続しており当ブログでサポートしています。それは、C.Baisc というインタープリタですが、将来はコンパイラ版の C:Basic も登場する予定です。純正 Casio Basic の互換性をできるだけ保っているので、純正 Casio Basic プログラムが殆ど修正なしでかつ高速に走ります。また C.Basic 用新コマンドも多数追加され、かなり自由自在にプログラミングが可能になっています。fx-9860G 以降 fx-CG50 までのグラフ関数電卓に対応しています。
C:Basic - アドインCasio Basic


fx-CG50 OS3.40 以降の Python モードの話題:
fx-CG50 OS3.20 で Pythonモードが追加され、OS3.40 の Python モードからグラフィックス画面出力機能が追加されました。この Python モードは、処理速度が非常に速いのが特徴で、計算とグラフィックス出力は Casio Basic の100倍以上高速に動作するのに驚きました。そこで、fx-CG50 OS3.40 以降の Python モード (ここでは Casio Python と呼んでいます) のプログラミングに興味を持ち、Casio Basic プログラムから移植しながら、管理人自身が学習を進めた結果を記事にしています。


fx-9750GIII のコスパが最強:
fx-5800P の補修部品入手が 2025年で終了する予定になっているので、後継機が気になります。2020年に北米市場でグラフ関数電卓 fx-9750GIII が発売され、ここしばらくの価格動向をみると Amazon USA で日本までの送料込みで fx-5800P よりも安価で、カシオのプログラム電卓製品群のなかで最安値、しかし処理速度は最高レベルです。fx-9750GIII は fx-9860Gシリーズの Casio Basic プログラムが完全互換で動作します。fx-9750GIII はコスパ最強です。Amazon USA かセカイモンで入手可能。

=====

当ブログを始めた時、Casio Basic やプログラム電卓の話題だけでここまで続くとは思っていませんでした。そこで、プログテーマとして電子小物を想定して、当ブログを e-Gadget と銘々しました。従って、PCや周辺機器、電子辞書やPDAなどの話題も備忘録も兼ねて記事にしています。

Casio Basic 入門
アドイン版Casio Basic - C.Basic
Casio Python
Casio Python - 目次



keywords: fx-5800P、fx-9750GIII, fx-9860Gシリーズ、fx-CGシリーズ、Casio Basic、Casio Python

関連記事

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

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

やす (Krtyski)

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


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

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

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


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

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

ブロとも申請フォーム

この人とブロともになる

QRコード
QR