Many Digits of Pi by Katie Wasserman - MoHPC
www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899
のプログラムをHP Prime向けに焼き直してみました。このプログラムでは小数点以下1000桁程度までの円周率を計算します。
------
EXPORT ARRYS := 126; EXPORT DIGIT := 100000000; // C5(B) -> C4(A) mv_A_B() BEGIN LOCAL i; FOR i FROM 1 TO ARRYS DO C4(i) := C5(i); END; END; // div C4(A)/f -> C5(B) div_A_f(f) BEGIN LOCAL i; LOCAL cy := 0; FOR i FROM 1 TO ARRYS DO C5(i) := floor((cy*DIGIT+C4(i)) / f); cy := (cy*DIGIT+C4(i)) - C5(i)*f; END; END; // mul C4(A)/f -> C5(B) mul_A_f(f) BEGIN LOCAL i, w; LOCAL cy := 0; FOR i FROM ARRYS DOWNTO 1 DO w := C4(i)*f+cy; C5(i) := w-floor(w/DIGIT)*DIGIT; cy := floor(w/DIGIT); END; END; EXPORT PI_CALC() BEGIN LOCAL n, f, w; // array initialize C4:=MAKELIST(0.0,X,1,ARRYS,1); C5:=MAKELIST(0.0,X,1,ARRYS,1); // loop countre n := log(10)/log(2)*1000; FOR f FROM floor(n) DOWNTO 1 DO // A * f -> B mul_A_f(f); // B -> A mv_A_B(); // A / f -> B div_A_f(f*2+1); // B -> A mv_A_B(); // A + 2 -> A C4(1) := C4(1)+2; END; END;--------
実行前に、CAS setting の「Exact」フラグを外しておくのが吉です (Exactフラグが付いていると、時間が掛かってしまいます)。
変更 on 2015/03/18
最新のエミュレータで実行した所、何と6分半も掛かってしまいました。また、実行後、画面表示が「凍てつく」状態になり、一旦エミュレータを終了してからでないと、2変数統計表示が出て来ません。
計算結果は2変数統計機能のC4配列変数に収蔵されます。C4(1)には3, 以下、小数点以下を8桁ごとに分割して配列変数に収容しています。
変数DIGIT は、配列要素1つに割り当てる桁数を規定するもので、この数値の場合、配列要素1つにつき、8桁の計算を行います。残念ながら、これ以上にすると計算精度が損なわれる様です。
仕方がないので、1000桁の計算のため、125個 (=1000桁/8桁) の配列要素を用意しています。
AmazonのJulyさん、「日本語クィックガイドなし(正規輸入)」というカテゴリになりました。未だ、「日本語クィックガイドあり」にはモノがありませんが、準備中との事なので、首を長くして待っております。
追記 on 2014/05/27
よくコードを検討したら、若干の変更で、配列変数のコピー部分は不要でしたネ。後で修正版をupしようかしらん ?
245 件のコメント:
1 – 200 / 245 前› 最新»akatuki様
お久しぶりです。
せっかくのソースを、fx-5800P用に移植してみようと思いつつ、なかなか時間が取れません。
e-Gadgetの更新も息切れぎみです。
はやり仕事優先になってしまいます。
やす 様。来訪多謝、お久しぶりです。
> せっかくのソースを、fx-5800P用に移植してみようと思いつつ、なかなか時間が取れません。
HP PrimeのPPL (Prime Programming Language)コードはC言語やPascalっぽいので読みやすいと思います。
実際、これを書く前にCでプログラムを書いて、PPLに書き換えたくらいです。
ただ、Cなのに、アルゴリズムはアセンブリっぽい感じでやっていたので、PPLに移植しても余計な部分まで付けてしまった、というオチなのですが。
> e-Gadgetの更新も息切れぎみです。
> はやり仕事優先になってしまいます。
お仕事が忙しいのは良い事であります。
当方は忙しいわけでもないのに、ネタがないので、ホトホト困り果てている次第。
お仕事が忙しいとなると、そういう時に限って(?)ネタも沸いてくるものです。
ただ「心をなくす、と書いて」という森繁翁の言葉もありますから、心に余裕を持つためにも、お仕事の合間合間で少しずつblogの方も進めて戴きたく、という事ですネ、ハイ。
そういや、最近は当方のblogのアクセスが減っておりまして。新しい記事がないからです。ハンセイ。
そんな中、やす様のblogからのアクセスが割合あり、感謝しております。
そろそろ、短い雑想でも書こうかな。
akatuki様
>そんな中、やす様のblogからのアクセスが割合あり、感謝しております。
少しはお役にたっているのですね。うれしいです。
今日、久しぶりにe-Gadgetのアクセス状況を見てみると、更新が無い期間もアクセスが大きく落ち込んではいないようです。
傾向としては、連載ものを順に読んで頂いている方が増えておりました。
少しづつでも、更新しようと思いました。
やす 様、遅うなりました。
> 今日、久しぶりにe-Gadgetのアクセス状況を見てみると、更新が無い期間もアクセスが大きく落ち込んではいないようです。
それは、やす様のBLOGが「定番」になった、という事だと思います。
> 傾向としては、連載ものを順に読んで頂いている方が増えておりました。
ウーン、羨ましい。当方なんぞは、連載みたいなのをやらないから、検索で来るからなのか、バラバラですヨ。
何か、連載ものをやるというのは、面白いかなァ。でも、ネタがないのヨ。
やす様
こんにちは。最近HP Primeを購入し、HP PPLについて調べていたところ、こちらの記事を見つけたので試させていただきました。
PC上のエミュレータでは動作したのですが、実機に転送して実行したところ、ハングアップしてしまいます。
ファームウェアのバージョンは本体、エミュレータともに最新にしてあります。
過去の記事の件で申し訳ないのですが、やす様のPrimeでの現在の動作状況について教えていただくことは可能でしょうか。
恐れ入りますが、よろしくご検討ください。
abedaster 様、はじめまして。
当方、HP Primeの実機を持っていないので、何とも試しようがないのです。申し訳ない。
実機を持ってらっしゃるsentaro 様、もしくは やす 様 (Prime, 持ってます ?)、宜しくお願い申し上げます。
abedaster様
ご質問頂き恐縮ですが、HP Prime を持っておりませんので、テストができません。
当方のブログでは今のところ Casio Basic を主に取り扱っております。
ここは、sentaro様のヘルプがあると良いですね...help!
akatuki様、やす様、どもです(^^ゞ
abedaster様、こんにちは!
>PC上のエミュレータでは動作したのですが、実機に転送して実行したところ、ハングアップしてしまいます。
うちのHP Primeに転送してみたところ動作Okでした。
ただ、計算時間が4分ほどかかるので…
最初は一瞬ハングアップしたかも?状態に見えるかもしれません。
砂時計アニメーションも動かないので計算中はほとんどハングアップ状態ですね(^^;
本当にハングアップしていたらONキーで中断できないのでハングアップかどうか判別できると思います。
もしabedaster様のHP Primeで本当にハングアップしているとしたらちょっと謎になってしまうのですが…。
やす (Krtyski) 様、どうもお呼びだてして申し訳ない。
> ここは、sentaro様のヘルプがあると良いですね...help!
やす 様からもsentaro様へお声を掛けて下さり、かたじけない。
本来ならば、当方でやらないとアカン案件ではあるのですが。
sentaro 様、コメント多謝 ! 有難う御座います !!
> うちのHP Primeに転送してみたところ動作Okでした。
> ただ、計算時間が4分ほどかかるので…
> 最初は一瞬ハングアップしたかも?状態に見えるかもしれません。
> 砂時計アニメーションも動かないので計算中はほとんどハングアップ状態ですね(^^;
> 本当にハングアップしていたらONキーで中断できないのでハングアップかどうか判別できると思います。
> もしabedaster様のHP Primeで本当にハングアップしているとしたらちょっと謎になってしまうのですが…。
当方、実機で試して居なかったのですが、4分掛かっておりましたか ... 。
コードをお試し戴き、更に、実行時間までお知らせ戴きまして、有難う御座居ます。
akatuki様、こんばんは!
円周率の計算は面白いです。
昔にポケコンで100桁くらい計算していたのを思い出します。
ただ、従来のプロ電やポケコンだと100桁計算するだけで結構時間かかるのでかなり辛抱が要ります(^^;
桁数が10倍になると計算時間は100倍という感じだったのが難点でした。
1000桁ともなると現行電卓最強の400MHzのHP Primeでもそれなりに時間かかりますね(^^;
PC上のエミュレータはCPU性能が違うのでクロック比以上に速度差が出るみたいで、
Core系だとクロック比*3倍くらいは速くなりますね。
やす様、akatsuki様、sentaro様
ぶしつけな質問にもかかわらず、ご確認やご報告いただきまして大変ありがとうございます。
お伺いするお相手を誤ってしまって・・やす様、申し訳ありません。
Onキーにてプログラムの実行を中断出来ることを初めて知りました・・・
周りにPrimeを所有している友人などが居なく難儀していたところいろいろとお伺い出来て感謝しております。
改めて手持ちのPrimeでプログラムを実行いたしましたが、30分ほど放置しても反応がなく、Onキーも効かなくなる状態となっており、sentaro様曰くのところの「謎」の状況となっております。
幸い購入して間もないため、輸入元様へ相談したいと思います。
ありがとうございました。
sentaro 様、こんばんは!
> 円周率の計算は面白いです。
> 昔にポケコンで100桁くらい計算していたのを思い出します。
> ただ、従来のプロ電やポケコンだと100桁計算するだけで結構時間かかるのでかなり辛抱が要ります(^^;
> 桁数が10倍になると計算時間は100倍という感じだったのが難点でした。
いや、これは。
ポケコンでは円周率の計算って、やった事が無かったのですが、やはり掛かってしまうのですね。
当方、MoHPCに42Sとかでのやり方が出ていたので、最初に35Sに移植して、今般、Primeにて動く様にしてみたのです。
流石に、35Sではもっと掛かっておりました。
> 1000桁ともなると現行電卓最強の400MHzのHP Primeでもそれなりに時間かかりますね(^^;
そうですネ。
そこで、ネイティヴ・バイナリの仕掛けが待たれる所なのですが ... 。
> PC上のエミュレータはCPU性能が違うのでクロック比以上に速度差が出るみたいで、
> Core系だとクロック比*3倍くらいは速くなりますね。
当方もPCのエミュレータでやって、そこそこ速かったものですから、こんな形で公開したのでした。
やはりPCの方が速いのですね、ウーン。
ただ、およその計算速度が判っただけでも、大変有り難い情報です。多謝 !
abedaster 様。
> 改めて手持ちのPrimeでプログラムを実行いたしましたが、30分ほど放置しても反応がなく、Onキーも効かなくなる状態となっており、sentaro様曰くのところの「謎」の状況となっております。
> 幸い購入して間もないため、輸入元様へ相談したいと思います。
ウーン。参ったなァ。
計算量こそ多いものの、大した事をしているわけではないので、暴走してしまうというのは何とも解せません。
これは購入先に問い合わせるのが確実であろうと思います。
お力になれず、申し訳ない。
abedaster様、こんにちは!
>改めて手持ちのPrimeでプログラムを実行いたしましたが、30分ほど放置しても反応がなく、Onキーも効かなくなる状態となっており、
これはなかなかに謎な状況が起きていたのですね。
他のプログラムや電卓の動作に異常が無く、このプログラムだけハングアップするとなるとまた謎が深まるところですけど、メモリチップの異常とかハード的な原因も考えられますし初期不良の可能性大なので交換対応してもらうのがよさそうです。
akatuki様、こんにちは!
>ポケコンでは円周率の計算って、やった事が無かったのですが、やはり掛かってしまうのですね。
100桁だと数分のオーダーで計算できるんですけど、1000桁となると一晩かけてという感じになるので大変でした(^^;
>そこで、ネイティヴ・バイナリの仕掛けが待たれる所なのですが ... 。
ネイティブだとかなり速度アップできそうですね。
いまだにネイティブ開発ができないのは残念ですけど、他のネイティブ可能な電卓でちょこっと試してみようと思います。
とりあえず、fx-9860GIIと、ARMネイティブで動かせるっていうポイントでTI-Npsire CX CASも入手してるのでこれもテストしてみます(^^ゞ
sentaro 様、こちらにもコメント戴き、多謝 !
> 100桁だと数分のオーダーで計算できるんですけど、1000桁となると一晩かけてという感じになるので大変でした(^^;
ウーン。
でも、ポケコンとかプロ電では、そういう計算処理が許された、そんな、のんびりした時代でした。
そういや、上記のコード、sentaro様に戴いた最新版エミュレータで実行した所、6分半も掛かっちゃいました。これで当方のマシンパワーが知れてしまいますが。また、実行後、2変数統計処理画面が表示されないという不具合がありました。この辺り、どうなんじゃろか ?
コードの不具合を見るには、最初は少ない計算量で試すと良かろうと思います。このコードの場合、冒頭の「EXPORT ARRYS := 126;」を「EXPORT ARRYS := 16;」とかに替えて実行するとか。もし余裕がありましたら、お試し戴き度。 > abedaster 様。
> いまだにネイティブ開発ができないのは残念ですけど、他のネイティブ可能な電卓でちょこっと試してみようと思います。
> とりあえず、fx-9860GIIと、ARMネイティブで動かせるっていうポイントでTI-Npsire CX CASも入手してるのでこれもテストしてみます(^^ゞ
ヲイヲイ、 TI-Nspire CXもですか ! ウーン、マイッタ。
ならば、こちらはHP50gでやってみようかしらん ? (期待しないでネ)
akatuki様、こんばんは!
>でも、ポケコンとかプロ電では、そういう計算処理が許された、そんな、のんびりした時代でした。
はい。
ポケコンしか持ってない時代はポケコンが最速マシンだったので、必死でメモリステップ削ったり速度上げたりとかいろんな技がありましたね。
>そういや、上記のコード、sentaro様に戴いた最新版エミュレータで実行した所、6分半も掛かっちゃいました。
akatuki様が最初に書かれていた20秒くらいというのが通常の結果ではないかと思われるので、6分半となるとこれはエミュ上でエミュの何かしらオーバーヘッドが入ってる感じの遅さではないかと…(^^;
>また、実行後、2変数統計処理画面が表示されないという不具合がありました。この辺り、どうなんじゃろか ?
んと、うちのエミュだとその不具合は出てない模様なのですが、同じバージョンで挙動が違うのはなにやら怪しいですね。
>ヲイヲイ、 TI-Nspire CXもですか ! ウーン、マイッタ。
ならば、こちらはHP50gでやってみようかしらん ? (期待しないでネ)
最初はfx-FD10Proが値下がってきたのでそろそろと思っていたら急な値上げでどうしたものかと思っていたところに、Nspire CXがハードのリビジョンアップでネイティブ動作がブロックされたらしいという情報を見たので、慌ててそっちに走ってしまいました(^^;
ってことで、まずNspire上のLuaに移植してみたところ、実行時間44秒くらいでした。
Nspireのクロックは133MHzなのでLuaはかなり速いです。
ちなみにネイティブだと整数処理で1秒、実数処理で8秒くらいでした。
sentaro 様、ほぼ12時間ぶりとなりました。遅くなって申し訳ない。
> 必死でメモリステップ削ったり速度上げたりとかいろんな技がありましたね。
いや、これは懐かしい !
当方の場合、速度向上はなかなか果たせませんでしたが、チマチマと押し込める工夫をしておりました。
> 6分半となるとこれはエミュ上でエミュの何かしらオーバーヘッドが入ってる感じの遅さではないかと…(^^;
> んと、うちのエミュだとその不具合は出てない模様なのですが、同じバージョンで挙動が違うのはなにやら怪しいですね。
ウーン。当方の場合、純正Windowsで試していないので、オーバーヘッドはありそうですネ。
結構、wineもアップデートがあるので、その内には改善されるのかも知れず、のんびり待とうと思う所です、ハイ !
> 最初はfx-FD10Proが値下がってきたのでそろそろと思っていたら急な値上げでどうしたものかと思っていたところに、
エッ、FD10proも !?
> Nspire CXがハードのリビジョンアップでネイティブ動作がブロックされたらしいという情報を見たので、慌ててそっちに走ってしまいました(^^;
アッー、そんな事になっていたのですか !
TIにしては、妙な動きですね。しかし、ユーザーの不評を買う事になりましょうから、その内にはブロック解除、となってくれれば、と期待したい。
でも、今の所はロックの掛かっていないデバイスを入手するのが吉、ですね !
> ってことで、まずNspire上のLuaに移植してみたところ、実行時間44秒くらいでした。
> Nspireのクロックは133MHzなのでLuaはかなり速いです。
> ちなみにネイティブだと整数処理で1秒、実数処理で8秒くらいでした。
おっ、これは ! NSpire,速いですね !
当方も氣になってしまう所ですが、色々と些事やっていて、何につけ、なかなか果たせません。
情報、有難う御座居ます !
akatuki様、こんにちは!
>ウーン。当方の場合、純正Windowsで試していないので、オーバーヘッドはありそうですネ。
コネクトキットを立ち上げていると何か通信しているのかかなり遅くなる現象が確認できました。その影響もありそうです。
>エッ、FD10proも !?
あ、いや、一応なんとなく…(^^;
>その内にはブロック解除、となってくれれば、と期待したい。
早速にハッカーチームが対応されたみたいです。
ですが、新しいハードはなにやら面倒なこともあるみたいで。
>おっ、これは ! NSpire,速いですね !
はい。内蔵Basicはたいしたことはないんですけど、Luaはかなり高速です。ただ本体でのプログラミングはちょっと面倒ですね。
で、
前回のTI Nspire CX CASネイティブは整数版も8桁で計算してしまってたので桁あふれでNGでした(^^;
ってことで桁数を5桁に再設定して再測定と内蔵BASIC版の結果です。
TI Nspire CX CASでの結果ですが、
内蔵BASICはちょっと時間かかりそうなので10桁*10=100桁で24秒。
luaは10桁*10=100桁だと0.23秒、10桁*100=1000桁で20秒でした。
Cネイティブ整数版 5桁*200=1000桁で2.2秒、実数版10桁*100=1000桁で5.6秒でした。
これは、akatuki様の元ソースから配列コピーを無くしたバージョンですが、このプログラムが各機種への移植のベースになっています。
さらにターミナル画面への最終出力と途中経過時間表示を追加してます。
HP Prime本体での実行時間は100桁で2.3秒、1000桁で180秒くらいです。
ちなみにHP Primeでは何度も計算させているとだんだん遅くなってくるというのがあって、この結果はソフトリセット直後の計算時間です。
電源オフの状態から[F]+[C]+[O]+ON同時押しでソフトリセットできます。(http://www.hpmuseum.org/から仕入れてきました)
------------------------------------------------------------
EXPORT Keta := 1000;
EXPORT ARRYS := floor((Keta+7)/8)+1;
EXPORT DIGIT := 100000000;
// div L4(A)/f -> L4(B)
div_A_f(f)
BEGIN
LOCAL i, w, t;
LOCAL cy := 0;
FOR i FROM 1 TO ARRYS DO
t := cy*DIGIT+L4(i);
w := floor(t / f);
cy := t - w*f;
L4(i) := w;
END;
END;
// mul L4(A)*f -> L4(B)
mul_A_f(f)
BEGIN
LOCAL i, w;
LOCAL cy := 0;
FOR i FROM ARRYS DOWNTO 1 DO
w := L4(i)*f+cy;
cy := floor(w/DIGIT);
L4(i) := w-cy*DIGIT;
END;
END;
EXPORT PI_CALC2()
BEGIN
LOCAL i, n, f, s, t;
LOCAL str0,str1;
// array initialize
L4:=MAKELIST(0.0,X,1,ARRYS,1);
// loop countre
n := log(10)/log(2)*Keta;
print();
print("PI "+Keta+" DIGIT calculating!!");
s:=TICKS;
FOR f FROM floor(n) DOWNTO 1 DO
// A * f -> A
mul_A_f(f);
// A / f -> A
div_A_f(f*2+1);
// A + 2 -> A
L4(1) := L4(1)+2;
TEXTOUT_P("COUNT="+f+" ", 0, 50,0,#0,100,#FFFFFF);
t:=TICKS-s;
TEXTOUT_P("time: "+t/1000+"s",0,80,0,#0,100,#FFFFFF);
END;
t:=TICKS;
print();
print("Calculation time: "+(t-s)/1000+"s");
print("PI=3.");
str1 := "";
FOR i FROM 2 TO ARRYS DO
str0 := string(L4(i));
while dim(str0)1 DO
str0 := str0+left(str1,10)+" ";
str1 := mid(str1,11);
END;
print(str0);
END;
------------------------------------------------------------
先ほどのHP Primeのソースが書き込み時に少し変わってしまったみたいなのでこちらにアップしました(^^;
http://pm.matrix.jp/PI_CALC2.txt
fx-5800P版はやす様が移植されると思うのでお任せして…(^^;
fx-9860GIIでの結果です。
fx-9860GII(SH3)では内蔵BASICは10桁*10=100桁で1分40秒。
Cネイティブだと、5桁*200=1000桁で17.6秒、10桁*100=1000桁で61.6秒でした。
118MHzまでオーバークロックするとそれぞれ、44秒、8.0秒、25.2秒です。
fx-9860GII(SH4A)では内蔵BASICは10桁*10=100桁で2分38秒。
Cネイティブだと、5桁*200=1000桁で17.6秒、10桁*100=1000桁で61.6秒でした。
265MHzまでオーバークロックするとそれぞれ、26秒、2.4秒、8.6秒とNspire CXに近づきます。
http://pm.matrix.jp/picalcFX.zip
fx-9860GII CasioBasic版
------------------------------------------------------------
Filename:PICALC
11->A:10^10->D
ClrMat Z
{A,1}->Dim Mat Z
log 10/log 2*100->N
For Int N->F To 1 Step (-)1
Locate 2,1," "
Locate 1,1,F
0->C
For A->I To 1 Step (-)1
Mat Z[I,1]F+C->W
Int (W/D)->C
W-CD->Mat Z[I,1]
Next
2F+1->G
0->C
For 1->I To A
CD+Mat Z[I,1]->T
Int (T/G)->W
T-WG->C
W->Mat Z[I,1]
Next
Mat Z[1,1]+2->Mat Z[1,1]
Next
For 1->I To A
Mat Z[I,1]Disps
Next
------------------------------------------------------------
修正です。
そそっかしくてすみません(^^;
fx-9860GII(SH3)のCネイティブは、
5桁*200=1000桁で23.2秒、10桁*100=1000桁で69.7秒でした。
fx-9860GII(SH4A)では、
5桁*200=1000桁で17.6秒、10桁*100=1000桁で61.6秒なのでSH4の方が速いです。
sentaro 様、こんばんは!
> コネクトキットを立ち上げていると何か通信しているのかかなり遅くなる現象が確認できました。その影響もありそうです。
そうだったのですか。
言われてみれば、ConnKitがPrimeエミュと通信していましたが ... 。
> あ、いや、一応なんとなく…(^^;
ニヤニヤ ... 。
> 早速にハッカーチームが対応されたみたいです。
> ですが、新しいハードはなにやら面倒なこともあるみたいで。
いや、流石はTIハッカー ! 凄い展開であります !
「ハードをいじる」(基板のランドを半田でどうとか ...)とかになると、当方の様な素人にはお手上げになってしまいますが、
TI電卓はFlashでアップデートが出来るのが売りですからネ。ハッカー集団に期待します !
> はい。内蔵Basicはたいしたことはないんですけど、Luaはかなり高速です。ただ本体でのプログラミングはちょっと面倒ですね。
NSpireのLua言うのは、HP50gのSysRPLに相当する位置付けなのかしらん ?
> ちなみにHP Primeでは何度も計算させているとだんだん遅くなってくるというのがあって、この結果はソフトリセット直後の計算時間です。
> 電源オフの状態から[F]+[C]+[O]+ON同時押しでソフトリセットできます。(http://www.hpmuseum.org/から仕入れてきました)
最近はエミュもロクに使っておりませんで、こんな事になっているとは気付きませんでした。
興味深い情報であります。多謝。
使っている内に遅くなる、いうのは、ガベージコレクション由来なのかなぁ ?
> fx-5800P版はやす様が移植されると思うのでお任せして…(^^;
やす様、どうでしょうか ?
当方、ヒーヒー言いながら書き出したくらいで、移植も結構大変だと思います。気が向きましたら。
「本編」のPI CALCですが、とても詳細な移植と実行結果、有難う御座居ます。
CASIO fxのアドイン形式のソースというのを初めて見ましたが ... ウーン、マイッタなぁ。
> 私的に例の円周率エントリにちょっとはまってしまったところなのですが、割と身近なところでネタってあるものですよね(^^)
って、コレの事だったのですね ! 恐れ入ります !
akatuki様、こんにちは!
>NSpireのLua言うのは、HP50gのSysRPLに相当する位置付けなのかしらん ?
デフォルトの言語より電卓リソースに深くアクセスできて速いとなると、おそらくそういう感じなのではないかなと思います。
http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=700
ここのベンチマークサイトは前からよく見るのですけど、マシン語だとfx-9860GとHP-50Gの一騎打ち状態なのが面白いです(^^)
HP-50GのuserRPLからsysRPLにすることで10倍速くなってますね。
さらにHPLua0.4の結果が速いですが、その下にnewRPLというのがあってNspireのLua並に速いです。
newRPLってなんぞや?って思ったら、
http://hpgcc3.org/projects/newrpl
TIハッカーに負けず劣らず50Gユーザーパワーも半端ではないですね。
>使っている内に遅くなる、いうのは、ガベージコレクション由来なのかなぁ ?
CPUのキャッシュの絡みとかもありそうなんですけど、本体はせいぜい1割2割の低下なのに対して、エミュレータの方は倍以上遅くなるのがちょっと不思議です。
>「本編」のPI CALCですが、とても詳細な移植と実行結果、有難う御座居ます。
>CASIO fxのアドイン形式のソースというのを初めて見ましたが ... ウーン、マイッタなぁ。
あ、どもです(^^;
いまどきの高機能電卓はエミュがしっかりしてるので実機が無くてもプログラムを作って動かせるというのがほとんどですね。
CASIOのfxシリーズもSDKのエミュで動作確認が出来ますがHP Primのエミュと違って実機に似せた実行速度なので速くはないです。
TIのは付属のソフトがエミュみたいなものですけど、あれって一度インストールしたら他PCに再インストールできないと知ってちょっと焦ってます(^^;
TIハッカーチームのCのSDKだとそんな縛りもなくエミュも普通に動くのでこういうのが公式ソフトであって欲しいです。
>って、コレの事だったのですね ! 恐れ入ります !
ハイ!
計算機は計算させてなんぼなので…やはりちょっとハマってしまいます(^^ゞ
fx-5800Pはfx-9860GIIからの移植だとほとんどそのままいけるので…、
結果は10桁*10=100桁で10分11秒でした。
sentaro 様、こんばんは!
> デフォルトの言語より電卓リソースに深くアクセスできて速いとなると、おそらくそういう感じなのではないかなと思います。
SysRPLってソース書きにくいし(笑)、その辺りも似ている様な ?
> http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=700
> ここのベンチマークサイトは前からよく見るのですけど、マシン語だとfx-9860GとHP-50Gの一騎打ち状態なのが面白いです(^^)
> HP-50GのuserRPLからsysRPLにすることで10倍速くなってますね。
> さらにHPLua0.4の結果が速いですが、その下にnewRPLというのがあってNspireのLua並に速いです。
HP50GのLuaってあったのですね、これは不勉強でした。
Stepney様の云うていたのは、NspireではなくHP50GのLuaだったのかな ... ?
> newRPLってなんぞや?って思ったら、
> http://hpgcc3.org/projects/newrpl
> TIハッカーに負けず劣らず50Gユーザーパワーも半端ではないですね。
今、このサイトがつながらないんで、何とも言いようが無いのです。申し訳ない。
確か、HP-GCCの新しいプロジェクトサイトでしたね。導入が難しそうで、余り関心は無かったんですが、今はnewRPLというのまでやっている、と。
時間を置いて、後で見てみようと思います。
> CPUのキャッシュの絡みとかもありそうなんですけど、本体はせいぜい1割2割の低下なのに対して、エミュレータの方は倍以上遅くなるのがちょっと不思議です。
ウーン、そうなんですか ... 。ちょっと不可解な動作であります。
> いまどきの高機能電卓はエミュがしっかりしてるので実機が無くてもプログラムを作って動かせるというのがほとんどですね。
> CASIOのfxシリーズもSDKのエミュで動作確認が出来ますがHP Primのエミュと違って実機に似せた実行速度なので速くはないです。
エミュで遊ぶのも面白いのですが、遊んでいると、やはり実機が欲しくなってしまう ... 。
> TIのは付属のソフトがエミュみたいなものですけど、あれって一度インストールしたら他PCに再インストールできないと知ってちょっと焦ってます(^^;
> TIハッカーチームのCのSDKだとそんな縛りもなくエミュも普通に動くのでこういうのが公式ソフトであって欲しいです。
ありゃ、それは参ってしまいます。
製品ライセンスとかを記録しているとか ? TIも、もう少しユルくして呉れないと。と思ったら、TIは、PC向けエミュレータも「製品」として売っているのだったかな ? (先生が使う、という事で) コレはヤラレタ ! HP Primeも先生向けにエミュレータを販売している所があった様に記憶しております。
そこで、ハッカーチームが独自にSDKなどを作った、という所なのでしょうか ?
> fx-5800Pはfx-9860GIIからの移植だとほとんどそのままいけるので…、
> 結果は10桁*10=100桁で10分11秒でした。
あーっ、やっちゃったの !?
今、当方はSysRPL版とかを構想しているのですが、最近、勉強して居らんので、何時になるやら。
HP Primeの日本語ガイド付きが未だ発売されていないので、それまではHP50Gをしゃぶり尽くそうと思っている所ですが、LuaやnewRPLなんてぇのがあるとなると、まだまだ面白そうです。
これは興味深い情報を有難う御座居ます !
やっとできた(^^;)
以下で、動きました(^_^)/
fx-5800P CasioBasic版
------------------------------------------------------------
Filename:PICALC
11->A:10^(10)→D
101→DimZ
log(10)÷log(2)×100→N
For Int(N)→F To 1 Step -1
Locate 2,1," " //スペース2つ
Locate 1,1,F
0->C
For A→I To 1 Step -1
Z[I]F+C→W
Int(W÷D)→C
W-CD→Z[I]
Next
2F+1→G
0→C
For 1→I To A
CD+Z[I]→T
Int(T÷G)→W
T-WG→C
W→Z[I]
Next
Z[1]+2→Z[1]
Next
For 1→I To A
Z[I]◢
Next
0→DimZ
------------------------------------------------------------
fx-9860GII CasioBasic版
------------------------------------------------------------
Filename:PICALC
11→A:10^10→D
ClrMat Z
{101,1}->Dim Mat Z
log 10÷log 2×100→N
For Int N→F To 1 Step -1
Locate 2,1," " // スペース2つ
Locate 1,1,F
0→C
For A→I To 1 Step -1
Mat Z[I,1]F+C→W
Int (W/D)→C
W-CD→Mat Z[I,1]
Next
2F+1→G
0→C
For 1→I To A
CD+Mat Z[I,1]→T
Int (T÷G)→W
T-WG→C
W→Mat Z[I,1]
Next
Mat Z[1,1]+2→Mat Z[1,1]
Next
For 1→I To A
Mat Z[I,1]◢
Next
ClrMat
------------------------------------------------------------
-> を → に置き換えようとしたのに、まだ残っていました(^^;)
失礼
akatuki様、こんにちは!
>エミュで遊ぶのも面白いのですが、遊んでいると、やはり実機が欲しくなってしまう ... 。
そうなんですよね…、だから次々と買ってしまう羽目に(^^;
電卓メーカーのエミュで鯛を釣る作戦はかなり成功してますね(笑)
そういえば、NspireのiPad版に対抗?してPrimeのAndroid版出したみたいですね。
>製品ライセンスとかを記録しているとか ? TIも、もう少しユルくして呉れないと。と思ったら、TIは、PC向けエミュレータも「製品」として売っているのだったかな ? (先生が使う、という事で) コレはヤラレタ ! HP Primeも先生向けにエミュレータを販売している所があった様に記憶しております。
Nspireは生徒用と先生用ソフトがあって電卓には生徒用が付属してくるのですけど、不思議なことにその生徒用付属ソフトと同じものが単体ソフトでも出ていてその価格が電卓とほとんど同じ価格ですね。
つまり電卓を買うとソフトがおまけで付いてくる、のではなくて、ソフトを買うと電卓がおまけで付いてくるみたいな感じです(^^;
>そこで、ハッカーチームが独自にSDKなどを作った、という所なのでしょうか ?
SDKはネイティブ開発環境なのでメーカーのブロックを回避しながらのいたちごっこになってますね。
>HP Primeの日本語ガイド付きが未だ発売されていないので、それまではHP50Gをしゃぶり尽くそうと思っている所ですが、LuaやnewRPLなんてぇのがあるとなると、まだまだ面白そうです。
HP-50Gは前からずっと興味のあった機種ですけど、RPL系言語がちょっと難解そうでCASIO系の楽な方に転んでしまいました(汗)
HP-15CLEはほとんど買う寸前までいってたんですけど、思い切って買っておけばよかったかなとちょっと後悔しています。
もしかしたらHP-50Gもこれだけ面白そうな言語系が揃ってるとなると、これは買っておけばということになる機種なのかも?しれないですか?(^^;
HP Primeは日本メーカーの高機能電卓よりも真っ先に日本語対応を果たした電卓なのに日本であまり売ってないという状況が本当に惜しいですね。
プログラム内でも普通に日本語使えるので日本で流行ってもいいと思うんですけど高機能電卓市場がないに等しいのがなんとももったいないです。
やす様、こんにちは!
fx-5800P版、おつかれさまでした。
fx-9860GII版とリストを比べるとやはり配列の記述がかなりすっきりしますね(^^)
fx-5800P と fx-9860GII の Casio Basicのソースですが、問題発見。
計算結果表示の最後の2行が全く同じになります。
計算が間違っているのではなくて、最後の計算結果が、プログラム終了時に再度表示されるというCasio Basicの仕様によるもの。
そこで、プログラムの一番最後に
"End"
と1行追加すればOK。
そこで、
小数点以下10x 10桁の処理時間を、私も調べて見ました。
Casio Basicは、
fx-5800P: 10分56秒
fx-9860GII(29MHz): 2分37秒
fx-9860GII (280MHz): 24秒
となりました。
やす (Krtyski) 様、お疲れ様です !
fx-5800P 版の早々の投稿、大変有難く !
しかし、こうして早々と成果を上げて戴けると、こちらの作業しようとしているSysRPL版の「催促」になってしまいそうで ... 。すぐにはアップ出来そうもなく、申し訳ない。
そういや、折角の成果なので、やす様のサイトにも掲載されてはいかがでしょうか ? (先程覗きましたら、未だみたいだったので。勿体無いですヨ)
sentaro 様、お疲れ様です !
> そういえば、NspireのiPad版に対抗?してPrimeのAndroid版出したみたいですね。
未だ、詳細を見ていませんが、どうもそんな話がある様子ですね。
ウーン、やはり実機が欲しいなァ。
> HP-50Gは前からずっと興味のあった機種ですけど、RPL系言語がちょっと難解そうでCASIO系の楽な方に転んでしまいました(汗)
買えーっ ! (笑) いや、RPLは面白いのですが、今日、HP50Gは「古い製品」になりつつありますから、ネ。
> HP-15CLEはほとんど買う寸前までいってたんですけど、思い切って買っておけばよかったかなとちょっと後悔しています。
当方も15C LEは気になってしまったのですが、どうもファームに「?」な所があったらしく。
ARMプロセッサ採用で、ファームがアップデート出来るのではないか、という議論もあった様ですが。
> もしかしたらHP-50Gもこれだけ面白そうな言語系が揃ってるとなると、これは買っておけばということになる機種なのかも?しれないですか?(^^;
HP Primeは、In-fix notation のPrime Programming Language を主軸にした電卓で、「RPL系最後の電卓」という興味でHP50Gを入手するというのであればオススメですが ... 。
> HP Primeは日本メーカーの高機能電卓よりも真っ先に日本語対応を果たした電卓なのに日本であまり売ってないという状況が本当に惜しいですね。
> プログラム内でも普通に日本語使えるので日本で流行ってもいいと思うんですけど高機能電卓市場がないに等しいのがなんとももったいないです。
そうなんですよネ。
東映無線さんでも「入荷未定」になっていて、日本語ガイド付きがホントに出るのか心配になって来ました。
そういや、HP Primeのftpサイトですが、ファイルは相変わらずとは言え、ファイルのタイムスタンプが03/26になっております。
近々、アップデートの動きがありや ?
fx-5800Pでいれました。カウントダウンが粋ですね。
akatuki様
fx-5800Pだと嫌になるくらい遅いですよね。
akatuki様本来のご投稿の趣旨からズレるのですが、Casio Basicでもうチョット高速化できないものだろうか?などと言うことを考えておりまして、うまくできたら eGadgetの方にアップしようかと思っています。
上で投稿したプログラムは、akatuki様オリジナル、senntaro様編修なので、オリジナリティーが全く無いので、e-Gadgetでそのまま公開するのは、チョット気が引けてしまいます。
ま、偉そうなことをいって、そのまま掲載ってことも十分あるので、そのときはゴメンナサイ。
今日の昼休みに、ちょっとロジックを見直していました。
オイラーの arctan(x) の式で、X=1 の時がakatuki様が採用した連分数なので、出発点は同じにしておき、Casio Basicで速く動くロジックが、ひょっとして無いものだろうか?
なんて、夢みています。そうそう簡単ではないことは分かっていますが...
久しぶりに数学と葛藤しております。
やす様、こんにちは!
>そこで、プログラムの一番最後に
>"End"
>と1行追加すればOK。
ちゃんと”End"で終わらないとダメだったんですね(^^;
>Casio Basicは、
>fx-5800P: 10分56秒
>fx-9860GII(29MHz): 2分37秒
>fx-9860GII (280MHz): 24秒
もう一台のfx-5800Pでの結果は10分58秒でした。
やす様の結果と近いです。
>オイラーの arctan(x) の式で、X=1 の時がakatuki様が採用した連分数なので、出発点は同じにしておき、Casio Basicで速く動くロジックが、ひょっとして無いものだろうか?
ちょっとワクワクしますね(^^)
昔、ポケコンやZ80のマシン語でタイムを少しでも速くできないかとロジックをあれこれ考えていた頃を思い出します。
藤堂様、こんにちは!
>fx-5800Pでいれました。カウントダウンが粋ですね。
計算時間が10分以上かかるので何も表示がないと動いてるのかどうか不安になりますよね(^^;
リアルタイム表示が可能なのがCasioBasicのいいところですね。
そういえば、藤堂様、fx-CG20お持ちなんですよね(^^)
fx-CG20はfx-9860GIIのソースそのままで動きます。
うちのfx-CG10での結果ですが、
fx-CG10(ノーマル59MHz)は2分10秒、
fx-CG10(オーバークロック236MHz)で44秒でした。
akatuki様、こんにちは!
>買えーっ ! (笑) いや、RPLは面白いのですが、今日、HP50Gは「古い製品」になりつつありますから、ネ。
>HP Primeは、In-fix notation のPrime Programming Language を主軸にした電卓で、「RPL系最後の電卓」という興味でHP50Gを入手するというのであればオススメですが ... 。
ハイ!それではサクッと…
と思って、価格調査してみたところ、在庫を持っているお店は1.8万越えしか見当たらないような…。
昨年には1万円前後で見かけたこともあったような気がするのですけど、ちょっとタイミング逃したのでしょうか(^^;
とりあえず、Amazonでほしいものリストに入れて様子を見てみます(^^ゞ
海外の電卓事情を見ているとなにやら試験モードが厳しくなるみたいで古い電卓は2017年で使えなくなるそうで…。
フランスではfx-CG20が半値以下で投売りされているとか…、
ってことで、「古い製品」がお値打ち品になる可能性がありますね(^^)
>そういや、HP Primeのftpサイトですが、ファイルは相変わらずとは言え、ファイルのタイムスタンプが03/26になっております。
>近々、アップデートの動きがありや ?
最近チェックしてなかったのですけど、タイムスタンプのみ更新されてる感じなのがちょっと不思議ですね。
SysRPL版はakatuki様のペースでごゆるりと進めてくださいませ(^^)
私もまだNspire版を試行錯誤中です(^^;
皆様、
今日はチョイと飲み会だたのですが、多桁円周率計算が頭から離れず、早めにお暇して、各駅停車で座って、ゆっくりと作戦を練ってます。
fx-5800P でスピードアップするには、これまでの経験では
・計算量を減らす
・時間のかかるコマンドを減らす
- 配列変数の実行回数を減らす
- 論理演算を減らす
ex) If A≠0 よりはIf A を使う, etc
あたりが、ポイントです。
まず劇的な効果を狙って、計算量をどこまで減らせるか?
まずはここから挑戦中です。
神の啓示が降りることを祈りつつ、色々なロジックを思う付く限り、紙と鉛筆でリストアップしているところです。
書き忘れましたが、ロジックをあれこれ考えているのは、結構楽しいですね。
藤堂 様、お越しやす。
> fx-5800Pでいれました。カウントダウンが粋ですね。
あっ、そうですね ! カウントダウンを入れる、というのは氣が付きませんでした。
結構長い時間動かす事が当たり前になっていたので、こういうユーザーI/F的な改善を全く考えていなかったのでした。
藤堂様、お知らせ多謝 !
やす様、改良多謝であります !
やす (Krtyski) 様、お越しやす。
> fx-5800Pだと嫌になるくらい遅いですよね。
HP Primeではそこそこ速かったのですが、当方、元々はHP35Sで試して、物凄い遅い実行時間に唖然としたものでした。それに較べれば、fx-5800Pは断然速い、のですよ !
> akatuki様本来のご投稿の趣旨からズレるのですが、Casio Basicでもうチョット高速化できないものだろうか?などと言うことを考えておりまして、うまくできたら eGadgetの方にアップしようかと思っています。
> 上で投稿したプログラムは、akatuki様オリジナル、senntaro様編修なので、オリジナリティーが全く無いので、e-Gadgetでそのまま公開するのは、チョット気が引けてしまいます。
これは当方のオリジナルではなくて、元々、HP電卓で作られたコードを書き換えたものをHP Primeに移植したものでして。
移植行為そのものが「オリジナル」であります。ですから、心置きなく公開戴けたら、と。
元々のプログラムが収束式を配列変数で多桁計算している「だけ」のものですし、公開されているものを移植して公開するのに、不都合はあまり無いのではないかと思います。
> 今日の昼休みに、ちょっとロジックを見直していました。
> オイラーの arctan(x) の式で、X=1 の時がakatuki様が採用した連分数なので、出発点は同じにしておき、Casio Basicで速く動くロジックが、ひょっとして無いものだろうか?
> なんて、夢みています。そうそう簡単ではないことは分かっていますが...
> 久しぶりに数学と葛藤しております。
そこで、やす様のオリジナリティが発揮される、という具合ですか ! ウーム ... 。
やす様のコードを藤堂様もお試しになられた様で、計算回数のカウントが表示される辺りは「小気味よい」改良であります。
sentaro 様、お越しやす。
> ハイ!それではサクッと…
> と思って、価格調査してみたところ、在庫を持っているお店は1.8万越えしか見当たらないような…。
> 昨年には1万円前後で見かけたこともあったような気がするのですけど、ちょっとタイミング逃したのでしょうか(^^;
> とりあえず、Amazonでほしいものリストに入れて様子を見てみます(^^ゞ
いや、「買えーっ」は冗談の積りだったのですが ... 。
現在、様子見は賢明な判断だと思います。
> 海外の電卓事情を見ているとなにやら試験モードが厳しくなるみたいで古い電卓は2017年で使えなくなるそうで…。
> フランスではfx-CG20が半値以下で投売りされているとか…、
あれーっ、そうなのですか。
海外でも試験モードがあるというのは聞いていましたが、「ガキ共には、もう少し勉強サセレ」という事なのか ? ウーン。
あるいは、ガキ共に使わせる学習用高機能電卓の「標準的」な機能を模索しているのか ?
> ってことで、「古い製品」がお値打ち品になる可能性がありますね(^^)
ウーム。逆説的な状況ですネ。
> 最近チェックしてなかったのですけど、タイムスタンプのみ更新されてる感じなのがちょっと不思議ですね。
そうなんですよ !
でも、もう少し先になるのかも知れず、です。それを待つ楽しみもある、という事で !
> SysRPL版はakatuki様のペースでごゆるりと進めてくださいませ(^^)
> 私もまだNspire版を試行錯誤中です(^^;
そう言ってもらうと助かります。色々と細かい事をやっているので ... 。
50Gを入手したら、やってしまうのかな ? これはうかうかして居られません ! でも、その前にNspire版ですね !
akatuki様
カウントダウンは、sentaro様のオリジナルなんですよ。
そこで、そこをチョイと改良したものを、公開しておきます。
fx-5800P CasioBasic版
------------------------------------------------------------
Filename:PICALC
11→A:10^(10)→D
101→DimZ
100÷log(2)→N
Locate 1+Int(log(N)),1,"d/dx"
Locate 3+Int(log(N)),1,Int(N)
For Int(N)→F To 1 Step -1
Locate 2,1," " //スペース2つ
Locate 1,1,F
0→C
For A→I To 1 Step -1
Z[I]F+C→W
Int(W÷D)→C
W-CD→Z[I]
Next
2F+1→G
0→C
For 1→I To A
CD+Z[I]→T
Int(T÷G)→W
T-WG→C
W→Z[I]
Next
Z[1]+2→Z[1]
Next
For 1→I To A
Z[I]◢
Next
0→DimZ
"END"
------------------------------------------------------------
カウントダウンの表示が、
200/322
のように、322回中の現在のカウントを表示するようにしました。fx-5800P は遅いので、この表示のメリットは少ないのですが、fx-9860GII や fx-20CG では速いのでメリットが出てきます。
fx-9860GII CasioBasic版
------------------------------------------------------------
Filename:PICALC
11→A:10^10→D
ClrMat Z
{101,1}->Dim Mat Z
100÷log 2→N
Locate 2+Int log N,1,"/"
Locate 3+Int log N,1,1,Int N
For Int N→F To 1 Step -1
Locate 2,1," " // スペース2つ
Locate 1,1,F
0→C
For A→I To 1 Step -1
Mat Z[I,1]F+C→W
Int (W/D)→C
W-CD→Mat Z[I,1]
Next
2F+1→G
0→C
For 1→I To A
CD+Mat Z[I,1]→T
Int (T÷G)→W
T-WG→C
W→Mat Z[I,1]
Next
Mat Z[1,1]+2→Mat Z[1,1]
Next
For 1→I To A
Mat Z[I,1]◢
Next
ClrMat
------------------------------------------------------------
fx-CG20 でもこのプログラムで動くはずです。
やす (Krtyski) 様、お世話になっております。
> カウントダウンは、sentaro様のオリジナルなんですよ。
えっ、そうだったの !?
いや、藤堂様がやす様のコードをfx-5800Pで試し「カウントダウンがよい」と書かれていたもので、
これはやす様の改良点だとばかり ... 。
sentaro 様のfx-9860GII CasioBasic版、以下の部分ですね。
For Int N->F To 1 Step (-)1
Locate 2,1," "
Locate 1,1,F
Forループ、一見、少々取っつきにくい構文ですが、「変数にストアする構文」を活かしている所が興味深いですネ。CASIO BASICの魅力です。
また、更に改良されまして、痛み入ります。
sentaro 様、やす様、申し訳ない !
ありがとうございます。試しにfx-CG20でこの通りに入れるとSYNTAX ERRORがでます。もう一度確認して実行させたいです。
akatuki様、こんにちは!
>いや、「買えーっ」は冗談の積りだったのですが ... 。
あ、いや、なんかちょっと背中を押してもらいたかったというかなんというか(笑)
Prime買ったのは昨夏でしたけど、それまでにAmazonのコメント見てちょっと待ったがかかってた状況でakatuki様の「それでも当方はHP Primeを支持する」が目に留まってかなり背中押しになりました(^^)
>現在、様子見は賢明な判断だと思います。
HP製品でもTI製品でも輸入品は在庫のある時は結構あるものですけど、円安のせいか今はなんか新しく入ってきてない感じありますよね。
なんか白のバージョンがあるみたいなんでちょっと気になってますが…
価格的にタイミングがあったらサクッとポチりたいと思います(^^)
>あるいは、ガキ共に使わせる学習用高機能電卓の「標準的」な機能を模索しているのか ?
電卓内にいっぱいプログラムとか文書とか保存できる状況になってますし、試験では公平にというのを徹底させようということなのでしょうかね。
>50Gを入手したら、やってしまうのかな ?
akatuki様のSysRPLの文書をちょこっと拝見させていただきましたけど、この暗号のようなSysRPLをどう組み上げていくか、ちょっとワクワクしますね。
でも、Cの方がとっつきやすそうなのでそっちから入るかも、です(^^;
>Forループ、一見、少々取っつきにくい構文ですが、「変数にストアする構文」を活かしている所が興味深いですネ。CASIO BASICの魅力です。
CasioBasicは”0→A”構文だけなんですけど、NspireやPrimeは”0→A”とPascal系の”A:=0”がどっちでも使えるのがまた面白いです。
>sentaro 様、やす様、申し訳ない !
やす様が最初に移植されても確実に実装されてたはずですから、Please don't mind No probremです(^^)
やす様、こんにちは!
>のように、322回中の現在のカウントを表示するようにしました。fx-5800P は遅いので、この表示のメリットは少ないのですが、fx-9860GII や fx-20CG では速いのでメリットが出てきます。
アドインでは実装してたのですけどCasioBasic版は最小限の表示でした。
同時に表示されるのがやっぱりよいですね(^^)
ってことで、最初の部分をちょい付け足し改良というか、
Kで小数点以下の計算桁数指定、Dで変数ひとつあたりの桁数指定をするようにしてみました。
一行目を書き換えるだけで後は自動設定できます。
fx-9860GII CasioBasic版
------------------------------------------------------------
Filename:PICALC
100→K:10→D
Int((K+D-1)÷D)+1→A
10^D→D
ClrMat Z
{A,1}->Dim Mat Z
K÷log 2→N
Locate 2+Int log N,1,"/"
Locate 3+Int log N,1,Int N
For Int N→F To 1 Step -1
Locate 2,1," " // スペース2つ
Locate 1,1,F
0→C
For A→I To 1 Step -1
Mat Z[I,1]F+C→W
Int (W÷D)→C
W-CD→Mat Z[I,1]
Next
2F+1→G
0→C
For 1→I To A
CD+Mat Z[I,1]→T
Int (T÷G)→W
T-WG→C
W→Mat Z[I,1]
Next
Mat Z[1,1]+2→Mat Z[1,1]
Next
For 1→I To A
Mat Z[I,1]◢
Next
ClrMat
------------------------------------------------------------
で、もうひとつ、やす様の”計算量をどこまで減らせるか?”っていうのでふと思いついたのですけど、
割り算と掛け算を同時にしてみれば…ってことでしたけど、なんか上手くいっているような、いってないような感じです(^^;
変数あたり10桁だと91桁から正確ではなくなります。
9桁にすると上手くいくようです。
fx-9860GII CasioBasic版 計算量削減版
------------------------------------------------------------
Filename:PICALC
100→K:10→D
Int((K+D-1)÷D)+1→A
10^D→D
ClrMat Z
{A,1}->Dim Mat Z
K÷log 2→N
Locate 2+Int log N,1,"/"
Locate 3+Int log N,1,Int N
For Int N→F To 1 Step -1
Locate 2,1," " // スペース2つ
Locate 1,1,F
2F+1→G
0→C
For 1→I To A
Mat Z[I,1]F+CD→T
Int (T÷G)→W
T-WG→C
W→Mat Z[I,1]
Next
Mat Z[1,1]+2→Mat Z[1,1]
Next
0→C
For A→I To 1 Step -1
Mat Z[I,1]+C→W
Int (W÷D)→C
W-CD→Mat Z[I,1]
Next
For 1→I To A
Mat Z[I,1]◢
Next
ClrMat
------------------------------------------------------------
http://pm.matrix.jp/picalcFX.zip
アドイン版でもこの計算量削減版を追加してみました。
アドインでは上手くいっているような気がしますが、変数の数値精度が関係している感じですね。
CasioBasic 内部精度15桁
ADDIN版 内部精度16桁
藤堂様、こんにちは!
エラーの部分は、
>Locate 3+Int log N,1,1,Int N
ここではないでしょうか?
",1"が余分ですね(^^;
HP Prime版の計算量削減版です。
ノーマル版 8桁*125
http://pm.matrix.jp/PI_CALC2.txt
180秒
計算量削減版 7桁*144
http://pm.matrix.jp/PI_CALC3.txt
118秒
8桁で計算すると760桁目から間違えているようなので変数あたり7桁にするとOkになりました。
皆様
ロジック見直しでやってみたところ、前のロジックでは10分50秒くらいかかっていたのが、7分30秒まで短縮できました。
これは、計算ロジックの変更なので、チョットずるいのですが...
---------------------------------
fx-5800P用プログラム名:PICALC2
---------------------------------
0→DimZ
"DIGITS"?→A // 求めたい桁数
"BASE"?→K // Baseの桁数
10^(K)→B
Int(K÷log(2))→E◢ // 計算を飛ばす回数
EInt((A÷K)+1)→F◢ // 計算項数
Int(NInt(N÷E)(2F-1))◢ // 配列変数アクセス数
Int(A÷K)→H
F→N
F+H+1→DimZ
"EXE TO GO"◢
Cls
For 1→I To N
Locate 2,1," " // スペース2個
Locate 1,1,I
Int(B÷5)→Z[I]
Next
0→C:1→I
Do
Locate 2,1," " // スペース2個
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," " // スペース2個
Locate 1,2,J
2J-1→D
Int(TJ+BZ[J])→T
Int(T-DInt(T÷D))→Z[J]
Int(T÷D)→T
Next
Int(C+T÷B)→[F+I]
Int(T-BInt(T÷B))→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H
Z[F+I]◢
Next
0→DimZ
"END"
---------------------------------
元にになる計算式は、akatuki様採用のものと同じです。
Base の数だけ掛け算してから整数部を出力する... これを繰り返すロジックで、考え方も同じですが、メモリを沢山使って、効率を上げる方法といって良いと思います。
円周率計算で使う配列は、
Z[1] ~ Z[F] までで、計算結果は Z[F+1] ~ Z[F+H] までに格納するようにしています。fx-5800P は配列を1つしか使えないので、苦肉の策です。行列を使っても良かったのですが、配列偏すよりもさらにアクセスが遅いので使いませんでした。
起動したら、
・求めたい円周率の桁数入力
・Base の桁数入力
が求められ、
計算を省略できる桁数と計算項数、配列変数アクセスの総数が表示され、それぞれ EXE キーで進んでゆき、
EXE TO GO
が表示されたら、EXE キーで計算開始、同時にタイマーをスタートさせて、時間測定を開始します。
最初のロジックのように、10桁をBaseとすると、計算途中の割り算で小数点以下10桁を超える結果が出るようで、円周率の計算結果がある桁以下が、000000... となってしまうことが分かりました。
このロジックの問題点です。
そこで、Base の桁数を入力できるよにして、 Base を10から順に減らしてゆくと、7桁の時、計算がうまくゆきました。
で正味の計算時間は、7分30秒となり30%程度の時間短縮になりました。
あと、fx-5800P のCasio Basicでは即値がはいると演算が遅くなるので、一旦変数に入れてから計算するようにしています。
なお、私の fx-5800P ではメモリ残量が 6786 Bytes しかないので、上の新ロジックでは160桁の円周率計算が限度です。
改めて atatuki様が採用されたロジックを見てみますと、省メモリという点ではピカイチだと感じました。
取りあえず、ここまでですが、遊んでみてください。
先ずは、ネタ元のここで公開させてもらいました。
もう少し整理して、さらに皆様からのアドバイスが頂けるようなら、それも取り込んでから、e-Gadgetで公開しようと思います。
藤堂様、お世話になっております。
sentaro様がエラータを示して呉れましたので、御参照戴き度。
sentaro 様、お世話になっております。
> あ、いや、なんかちょっと背中を押してもらいたかったというかなんというか(笑)
> Prime買ったのは昨夏でしたけど、それまでにAmazonのコメント見てちょっと待ったがかかってた状況でakatuki様の「それでも当方はHP Primeを支持する」が目に留まってかなり背中押しになりました(^^)
あちゃーっ。いや、これは申し訳ない事をしてしまった ... 。
でも、sentaro 様の様なハッカーにしばき倒されるなら、HP Primeも本望なのか、と。
> なんか白のバージョンがあるみたいなんでちょっと気になってますが…
> 価格的にタイミングがあったらサクッとポチりたいと思います(^^)
白って、HP50gの方でしょうか ?
検索したら、こんなのがあると知って、驚いちゃった。
「HP50g Blue ed. NW240AA」
ヨーロッパ方面で展開している様子ですね。という事は、当面入手可能なのかなぁ ? いや、無くなるよりは断然ウレシイのですが、中身がどう変わっているのか、そこも気になります。
> 電卓内にいっぱいプログラムとか文書とか保存できる状況になってますし、試験では公平にというのを徹底させようということなのでしょうかね。
言われてみれば、Alpha-numericなら十分な文書も保持出来るようになりました。欧米では「由々しき事態」であると。
> akatuki様のSysRPLの文書をちょこっと拝見させていただきましたけど、この暗号のようなSysRPLをどう組み上げていくか、ちょっとワクワクしますね。
ホント、暗号みたいで。
今、配列をどう扱うのか、そこを調べているのですが、最近は研究もお留守になっていて、なかなか復調しないのです。泣き言。
> でも、Cの方がとっつきやすそうなのでそっちから入るかも、です(^^;
Egan Ford氏のHP GCC を使った事があるのですが、最近のLinuxでは素直に使えない状況になっているらしく、どうしたらいいのか、調べております。最近はHP GCC 3とかがあるので、そっちを見た方が早いかも知れませんネ。
> やす様が最初に移植されても確実に実装されてたはずですから、Please don't mind No probremです(^^)
かたじけない。
> HP Prime版の計算量削減版です。
これもまた、有難う御座居ます。
今、時間が足りないので、後で試してみたく思います。
同様のコメントの1つが、理由が不明ながらもスパム扱いになっておりましたので、一旦解除しました。
恐らくBloggerの不具合だと思いますが、必要が無ければ削除されたく、よろしくお願いします。
藤堂様
すみません、私の転記ミスのために、ご不便をおかけしました、
akatuki様
このコメントより上のわたしの5つのコメントについて、改めて削除を御願いできませんか?
この下に、削除頂いた分について、まとめてコメントを入れさせて頂きますので、よろしく御願い致します。
akatuki様、sentaro様、藤堂様
計算高速化を狙って作ったプログラム PICALC2 をまとめます。
// 高速化検討
// fx-5800P用 PICALC2
// =========================
0→DimZ // 配列領域解放
"DIGITS"?→A // 求める桁数
"BASE"?→K // 結果変数1個の桁数
10^(K)→B // 結果変数1個を切り出す倍数
Int(K÷log(2))→E◢ // 計算精度得るための計算数
EInt(A÷K+1)→F◢ // 計算項数
Int(FInt(F÷E)(2F-1))◢ // 配列アクセス回数
Int(A÷K)→H // 結果変数の個数
F→N // ループで使用する計算項数
F+H+1→DimZ // 配列領域確保
"EXE TO GO"◢ // ここから時間測定開始
Cls
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Z[I]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," "
Locate 1,2,J
2J-1→D
Int(TJ+BZ[J])→T
Int(T-DInt(T÷D))→Z[J]
Int(T÷D)→T
Next
Int(C+T÷B)→Z[F+I]
Int(T-BInt(T÷B))→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Z[F+I]◢ // 一回目の表示で測定終了
Next
0→DimZ // 配列領域解放
"END" // 最終行再表示抑制
// =========================
結果表示の桁数を最初10桁にすると、円周率の計算結果の特定桁以降に0が並ぶことが分かりました。
計算途中に小数点以下が電卓の変数精度桁数を超えたためと思われます。
そこで、結果変数の桁数を1つづつ減らしてゆくと、結果変数の桁数が7桁以下で正しく計算できることが分かりました。
このアルゴリズムは、次のサイトを参考にしました。
http://xn--w6q13e505b.jp/program/spigot.html
結果表示の桁数を最初10桁にすると、円周率の計算結果の特定桁以降に0が並ぶことが分かりました。
計算途中に小数点以下が電卓の変数精度桁数を超えたためと思われます。
そこで、結果変数の桁数を1つづつ減らしてゆくと、結果変数の桁数が7桁以下で正しく計算できることが分かりました。
fx-5800Pで、ネタ元のアルゴリズム PICALC と 今回検討の PICALC2 で比較してみました。
PICALC PICALC2 短縮
------------------------------------------
100桁 10分50秒 7分50秒 27%
175桁 33分02秒 22分21秒 32%
------------------------------------------
桁数が増えて計算量が増えると、高速化の効果がより顕著に出てくるようです(^_^)/
色々と試すには、fx-5800Pでは遅すぎて待ち時間ばかりになるので、fx-9860GIIで遊んだ方が良さそうです。
fx-9860GII版は、配列変数を行列に変更するだけでOKです。
// 高速化検討
// fx-9860GII用 PICALC2
// =========================
ClrMat Z // 配列領域解放
"Digits"?→A // 求める桁数
"Base"?→K // 結果変数1個の桁数
10^K→B // 結果変数1個を切り出す倍数
Int(K÷log 2)→E◢ // 計算精度得るための計算数
EInt(A÷K+1)→F◢ // 計算項数
Int FInt F÷E)(2F-1)◢ // 配列アクセス回数
Int(A÷K)→H // 結果変数の個数
F→N // ループで使用する計算項数
{F+H+1,1}→Dim Mat Z // 配列領域確保
"EXE To Go"◢ // ここから時間測定開始
ClrText
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Mat Z[I,1]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," "
Locate 1,2,J
2J-1→D
Int(TJ+BMat Z[J,1])→T
Int(T-DInt (T÷D))→Mat Z[J,1]
Int(T÷D)→T
Next
Int (C+T÷B)→Mat Z[F+I,1]
Int (T-BInt (T÷B))→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Mat Z[F+I,1]◢ // 一回目の表示で測定終了
Next
ClrMat // 配列領域解放
"End" // 最終行再表示抑制
// =========================
いろいろ遊んでみてください。
リストありがとうございます。ぼちぼち入力していきますね。
藤堂様
fx-9860GII のソースの下から2行目、ClrMat Z
としてください。
Z が抜けていました。
fx-9860GII の PICALC2 の g1mファイルを下記かららウンロードできるようにしました。
http://egadget2.web.fc2.com/archives/picalc2.html
ご利用ください。
やす様がアップされたg1mファイルが404になってしまうので…(^^;
fx-9860GII&CG10/20 CasioBasic版をこちらにまとめてアップしておきました。
Casio_PICALC.zip
やす様バージョンのHP Prime版です。
PI_CALC5.txt
6桁*168で79秒まで短縮できました。
ノーマル版 8桁*125
PI_CALC2.txt
180秒
計算量削減版 7桁*144
PI_CALC3.txt
118秒
fx-CG20で新アルゴリズムを入力。動きました。時間はこれから計測します。数の動きは楽しいですね。
ところで、fx-5800Pのプログラムコマンド入力がfx-CG20よりラクですね。軽快ですぐに実行できるのが魅力的です。
fx-CG20の場合、英語表記なんで、Locateはどこだなんて探し回っている私がいる。
日本語表記にすれば。fx-CG20等のグラフ関数電卓。fx-5800Pは大いに売れると感じました。
藤堂様、こんにちは!
fx-CG20版、動いたのですね!(^^)
>ところで、fx-5800Pのプログラムコマンド入力がfx-CG20よりラクですね。軽快ですぐに実行できるのが魅力的です。
メインでグラフ電卓使いの私が言うのもなんですけど、その通りです(笑)
グラフ電卓はコマンド数が豊富なのはいいとしても、普段よく使うコマンドが優先的に入力できるような仕組みがあってもいいと思いますよね。
>日本語表記にすれば。fx-CG20等のグラフ関数電卓。fx-5800Pは大いに売れると感じました。
fx-CG20は中国語版があって日本語版が無いのが不思議です。日本語電卓としてHP Primeに先を越されてどうするという感じですよね。
高精細液晶が採用されるであろうfx-5800Pの後継機では完全日本語化されることを期待したいです。
やす (Krtyski) 様、お疲れ様です !
今回は、新しい方式のコード、有り難く !
あと、文字抜けコメントの削除の件、今しがた対応しました。
コメントが伸びるのは割りかし好きなのですが、こうした成果が「鄙びた辺り」で埋もれるのは勿体無いので、やす様の所でも積極的に公開され度、と思っていましたら、ありました ! ヨカッタ。
やす様の所にもお邪魔して、コメントを残しましたが、つぎの「お題」というか、ネタを準備中であります。余り期待されては困ってしまうのですが ... 。
sentaro様、お疲れ様です !
> newRPLのところにHPGCC3ってありました。
> とりあえず最初はWin環境で使えるならそっちから始めてみようかなと思ってます(^^ゞ
そうです、それです !
以前に見た際には、なかなか敷居が高そうな印象だったのですが、今は時間が経っているので、使いやすいのかな ? なんて。
> 昨日Googleのアカウントを作ってそれで書き込みしたんですけどスパム扱いになってたとは(^^;
> Googleのアカウントあると削除できるんですね。ってことで、後の書き込みを削除しました。
> お手数おかけしましたですm(_ _)m
いえいえ、こちらこそお手数をお掛けしました。
最近、Bloggerもヘンな所がある様子で、何だか ... 。
藤堂様、お疲れ様です !
今回は、時ならぬ「円周率計算祭り」となり、多くのコードが寄せられましたが、これも藤堂様の評価があればこそ、と。
で、今度はもう少し「ユーザーが楽しめる」ネタを考えているので、気長にお待ち戴き度。
sentaro様
404エラーでダウンロードできない代わりに、ファイルのご準備いただき、ありがとうございます。
e-GadgetアーカイブはFC2のホームページスペースを使っているのですが、ここの仕様でファイルへの直接リンクを許さないようになっていて、同じスペース内にあるhtml経由ならダウンロードできます。
なので、いつもはダウンロード用のhtmlを作って、それをポップアップさせて、それ経由でダウンロードできるようにしていたのですが、今回はうっかり直接リンクを張ってしまったのが原因です。
FC2の仕様はセキュリティー上良いのかも知れませんが、面倒です。
せっかく作っていただいたファイルなので、e-Gadgetアーカイブに収録させていただくことを考えています。
1つのプログラムを、これだけ多くの異なる機種に移植するケースは少ないので、ベンチマークとして面白いと思います。
akatuki様
新アルゴリズムはカウントダウンの表示でかなり時間を食っているようなので、この表示を消せば(コメントアウトすれば)もっと速くなります。
電卓特有の事情、メモリが少ない、PCなどに比べてCPUが遅い(最速 Primeでも400MHz)、シングルタスク?、などを考えると、PC用のプログラミングの常識から外れて考えることになって、それがまた面白いですね。
円周率ネタも元はといえばかなり昔の記事で、最近abedaster様のご来訪で、sentaro様がは口火を切ってくれて再燃!
いつものペースで結構ですので、のんびりいきましょう。
当方は、円周率計算で、たぶん記事3つのネタにできそうです。膨らませればもっと膨らむかも(その気はありませんが...)おかげで私もハマッてしまいました。
藤堂様
私も数字の動きを見ていると楽しくなります。無事に fx-CG20 で動いて良かったです。
私が持っているfx-9860GIIとは、Basic命令を使う限りほぼ互換のようです。Getkeyコマンドで使うキーコードも fx-CG20 と fx-9860GII は近いように思います。キーコードさえ気をつければ、互換性の問題は少ないと思います。
使いやすさについては、私も圧倒的に fx-5800Pが良いと思います。プログラムコマンドも、ほぼ1カ所に集まっているのが、入力し易すさの要因だと思います。
fx-9860GII は、おそらく fx-CG20 と同じだと思いますが、コマンドが分散しているので、いつも指がウロウロしてしまいます。体で覚えられないですね。
fx-5800Pは fx-9860GII の3倍から4倍のスピードでコマンド入力できます。
日常使いの関数電卓としても fx-5800P は圧倒的に使いやすいですよね。グラフ関数電卓は関数を使うのも面倒です。
fx-5800Pの進化発展型の登場を切望するところです。
akatuki様、こんばんは!
>つぎの「お題」というか、ネタを準備中であります。余り期待されては困ってしまうのですが ... 。
ネタはいくつあっても困らないので(笑)楽しみにお待ちしております!
やす (Krtyski) 様、こんにちは!
>なので、いつもはダウンロード用のhtmlを作って、それをポップアップさせて、それ経由でダウンロードできるようにしていたのですが、今回はうっかり直接リンクを張ってしまったのが原因です。
なるほどです。
いまどきのサイトのセキュリティは不便なこと多いのですね(^^;
>せっかく作っていただいたファイルなので、e-Gadgetアーカイブに収録させていただくことを考えています。
akatuki様&やす様の元ネタから派生してるものですから、煮るなり焼くなりよろしくです(^^)
>1つのプログラムを、これだけ多くの異なる機種に移植するケースは少ないので、ベンチマークとして面白いと思います。
シンプルなのにこれだけ遊べる題材はなかなかないですね。
少し複雑になってくると移植する気力が失せてしまいますし(^^;
円周率を調べるといろんな公式ありますけど、この単純な式で延々と求められるというのがすごく不思議です。
このエントリーを作られたakatuki様、そして、このエントリーに注目させていただくきっかけになったabedaster様のおかげです。
あらためてお礼を言いたい気分です(^^)
そういえば、abedaster様のHP Primeがどうなったのかというのもちょっと気になるところではありますが…。。。
藤堂様のサイトを拝見していて、ふと、思ったんですけど、プチコンでこのプログラムは動くんでしょうか?
実数が扱えるようになっている上に新しい3DS版だと相当に速くなるらしいのでちょっと気になってます(^^;
New3DSは3DSより高速ですから、円周率の計算をさせるとどんな結果になるかですね。
プチコンの3号のBASIC文法は従来のBASICを元に独特の表記をしていますから。
やす 様、どうもです !
> 電卓特有の事情、メモリが少ない、PCなどに比べてCPUが遅い(最速 Primeでも400MHz)、シングルタスク?、などを考えると、PC用のプログラミングの常識から外れて考えることになって、それがまた面白いですね。
良い指摘ですネ ! 実に「パーソナルな」プログラミングであり、「エンドユーザーコンピューティング」へのストリームであるという事で !
> 円周率ネタも元はといえばかなり昔の記事で、最近abedaster様のご来訪で、sentaro様がは口火を切ってくれて再燃!
仰る通りで、ある意味「面目ない」。
> いつものペースで結構ですので、のんびりいきましょう。
痛み入ります。最近、気分が塞ぎがちなの ... 、って、女の子じゃあるまいに !
> 当方は、円周率計算で、たぶん記事3つのネタにできそうです。膨らませればもっと膨らむかも(その気はありませんが...)おかげで私もハマッてしまいました。
いえいえ、ネタになるのでしたら、幾らでもやって下さいまし !
Sentaro 様、どうもです !
> ネタはいくつあっても困らないので(笑)楽しみにお待ちしております!
いや、今回はかなり「ヘタレ」なネタなので、余り期待しないでネ ... 。
> そういえば、abedaster様のHP Primeがどうなったのかというのもちょっと気になるところではありますが…。。。
そうなんですケド、abedaster様からは、まるっきりコメントが無くて ... 。
マイッタなぁ。
藤堂 様、どうもです !
> New3DSは3DSより高速ですから、円周率の計算をさせるとどんな結果になるかですね。
> プチコンの3号のBASIC文法は従来のBASICを元に独特の表記をしていますから。
という事は、「プチコン版」やってみます ?
当方、なかなかSysRPL版に着手出来ないでおりますから、エラそうな事は言えませんが、ゆっくりでもいいので「楽しみながら」やってみませんか ! いや、もしかして準備中なのかな ?
ぜひ、プチコン3号で試してみましょう。
藤堂様
プチコン3だと、かなり高速かつ多くの桁数まで計算できるのではないかと、大いに期待されるところです。
ところで、カシオ版については、以下で続いています。sentaro様がさらにプログラムの効率化を提案され、それを取り込んだ Casioo Basic版の Ver3 ができました。
http://egadget.blog.fc2.com/?no=194
fx-5800P で、100桁の計算時間は、
初版 PiCalc: 10分56秒
2版 PiCalc2: 7分35秒
3版 PiCalc3: 6分53秒
ちなみに、BASE = 6 で計算しています。BASE = 6 でないと計算結果が違ってしまうことにきづいたからです。
ちなみに、
fx-9860GII(SH4)版では、桁数の制限は、使っている行列が最大999行999桁までとの制限があって、これが桁数を制限します。
fx-9860GII (SH4A) の 280MHz オーバークロックで走らすと、最大293桁 (Base=6) で、
PiCalc2: 1分40秒
PiCalc3: 1分32秒
と効率化の効果が出ています(fx-5800Pほど顕著ではありませんが...)
ご参考まで...
akatuki様、こんばんは!
>いや、今回はかなり「ヘタレ」なネタなので、余り期待しないでネ ... 。
私もNSipireのLuaのイはともかくロハがまだいまいちよく分からない状況なので(^^;
じっくりゆっくりまったりといきましょう(^^)
>そうなんですケド、abedaster様からは、まるっきりコメントが無くて ... 。
輸入品だと交換となっても交換在庫が無かったりしたらかなりの時間がかかりますよね。
海外製電卓は今在庫を持ってる店がかなり少なくなってるのがちょっと気がかりですね。
やす (Krtyski) 様、こんにちは!
PICALC3おつかれさまです!
計算時間の短縮効果はかなり出てきましたね(^^)
今度は計算桁数の制限が問題になってきてるのでPICALCの効率化版のPICALC1をまたちょっと煮詰めてみます!
藤堂様、こんにちは!
3DSは持ってないのですが、プチコン3号のサイトを見ていたら何気にBASICの完成度が高そうですね。
プチコンで動くつもりのリストを書いてみましたが上手く動作するかどうか…(^^;
INPUT "DIGITS=";A // 計算する桁数
INPUT "BASE=";K // 変数あたりの桁数
B=POW(10,K)
E=FLOOR(K/LOG(2)*LOG(10)) // 省略する計算項数
F=FLOOR(A/LOG(2)*LOG(10))+1 // 計算項数
H=FLOOR((A+K-1)/K)+1 // 結果格納配列数
DIM Z(F),A(H) // 配列確保
CLS
FOR I=1 TO N
LOCATE 1,1:PRINT I
Z(I)=FLOOR(B/5)
NEXT
CLS
PRINT "PI=";
C=0:1=I
FOR N=F TO 1 STEP -E
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z(I)*B
T=FLOOR(W/D)
Z(I)=W-T*D
NEXT
W=FLOOR(T/B)
A(I)=C+W
C=T-W*B
PRINT A(I); // 計算結果表示
I=I+1
NEXT
PRINT "END"
藤堂 様、お疲れ様です !
> ぜひ、プチコン3号で試してみましょう。
との事、イイですね ! 歩みは遅くとも、楽しみながら進めていきましょう !
で、成果が上がりましたら、藤堂様のblogで公開するのは最初として、先ずは やす様のサイトにポストされ度。ここでもいいのですが、やはり、sentaro様、やす様のコメントに負う所が大きく、藤堂様のプチコンの成果につきましては、ここよりも先に、やす様のblogにコメントをポスト戴きたいのです。
やす 様、お疲れ様です !
新しいメカの研究、オツです。
> ちなみに、BASE = 6 で計算しています。BASE = 6 でないと計算結果が違ってしまうことにきづいたからです。
ウーン。当方、未だ試していないのでよく判らんのですが、チョット興味深いです。
HP Primeで書いた初期コードは、やはり計算桁を減らさないとアカンかったのです。HP Primeの計算精度由来だったのか、と思っていましたが、もしかして「アルゴリ由来だった」となると、オモシロイですネ。
sentaro 様、お疲れ様です !
> 私もNSipireのLuaのイはともかくロハがまだいまいちよく分からない状況なので(^^;
> じっくりゆっくりまったりといきましょう(^^)
気が楽になります、有難う御座います !
> 輸入品だと交換となっても交換在庫が無かったりしたらかなりの時間がかかりますよね。
> 海外製電卓は今在庫を持ってる店がかなり少なくなってるのがちょっと気がかりですね
当方もabedaster様の実情が確認できないので、購入元に問い合わせるのが確実だろうと思ったのですが、「輸入品」だったのでした。
仰る様に、扱いの店舗が減りつつある現状では、問い合わせてもいい返事が期待できないという気掛かりはあります。
どうなったのだろうか ... 。
プチコンのリスト、早々にアップ戴き有難う御座居ます。
リストを見ると、これは由緒正しき(?)MS BASICの様なコード ... 。プチコン、恐るべし。
プチコン3号で入力しました。DIMの括弧は[]でした。これに変更して実行すると、《Duplicate definition 配列が二重に定義されている》のエラーが出ました。
A[H]を外して実行すると、最後のNEXTに対してFORがないのエラーが出ました。さあ、これから頭の体操。
とりあえずこのように修正し、数字を受け付けるようになりました。
INPUT "DIGITS=";A // 計算する桁数
INPUT "BASE=";K // 変数あたりの桁数
B=POW(10,K)
E=FLOOR(K/LOG(2)*LOG(10)) // 省略する計算項数
F=FLOOR(A/LOG(2)*LOG(10))+1 // 計算項数
H=FLOOR((A+K-1)/K)+1 // 結果格納配列数
DIM Z(F),A0(H) // 配列確保
CLS
FOR I=1 TO N
LOCATE 1,1:PRINT I
Z[I]=FLOOR(B/5)
NEXT
CLS
PRINT "PI=";
C=0:I=1
FOR N=F TO 1 STEP -E
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z(I)*B
T=FLOOR(W/D)
Z[I]=W-T*D
NEXT
FOR I=1 TO H
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
PRINT A0[I]; // 計算結果表示
I=I+1
NEXT
PRINT "END"
うまくいけば、New3DSび¥の計算結果は爆速です。
ただ、こに場合だと、0を大量に吐き出して、
A0[I]=C+W
の部分で、Subscript out of rangeのエラーで止まります。
藤堂様
プチコンを触ったことが無いので、推測ですが...
プログラム全体で、FOR の数が4個、NEXT の数が3個なので、両方の数が合っていないようです。
後半部分の W=FLOOR(T/B) の上にある FOR I=1 TO H を消してみては如何でしょうか?
sentaro様の案では、この1行がなく、おそらく不要のはずです。
あと、最初の部分での配列 A0 の領域確保のところで、H個確保していますが、ここでは H+1 にしてみたら、Subscript our of rangeエラーが消えると思います。
なお、プログラムを走らす時に、BASE を入力するように聞かれたら、10でなくて、それより少ない数を試してみると、計算精度が出てくると思います。
藤堂様
配列 A0 の領域確保については、見なかったことにしてください。多分関係ないです。
藤堂様、やす様、こんにちは!
昨日はちょっと(どころじゃない)バグ入りソースでお手数おかけしてしまい申し訳ありませんでした。
配列の二重定義エラーはAという変数がすでに使われていたからですね。
途中添え字がJであるはずなのにIになっていたりともうボロボロです(^^;
ってことで、再度修正版です。
今回はロジックを十進BASICでチェック済みなのでだいじょうぶだと思います(^^)
----------------------------------------
INPUT "DIGITS=";A
INPUT "BASE=";K
B=POW(10,K)
E=FLOOR(K/LOG(2,10))
F=FLOOR(A/LOG(2,10))+1
H=FLOOR((A+K-1)/K)+1
DIM Z[F],A0[H] // 配列名をAからA0
CLS
FOR I=1 TO F // NではなくてF
Z[I]=FLOOR(B/5)
NEXT
CLS
PRINT "PI=";
C=0:1=I
FOR N=F TO 1 STEP -E
LOCATE 1,1:PRINT N // 途中経過表示
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z[J]*B // 添え字がJ
T=FLOOR(W/D)
Z[J]=W-T*D // 添え字がJ
NEXT
W=FLOOR(T/B)
A0[I]=C+W // 配列名をAからA0
C=T-W*B
I=I+1
NEXT
PRINT "PI="; // 計算結果表示は最後にまとめて
FOR I=1 TO H
PRINT A0[I];
NEXT
PRINT "END"
----------------------------------------
akatuki様、こんにちは!
>プチコンのリスト、早々にアップ戴き有難う御座居ます。
初歩的なバグ入りでお恥ずかしい限りです(^^;
>リストを見ると、これは由緒正しき(?)MS BASICの様なコード ... 。プチコン、恐るべし。
プチコンの仕様を見るとほとんどそのまんまBASICですよね。
ゲーム機でBASICというのはプログラミング入門にはいいきっかけになると思うのですけど、外部とのリンクが制限されてるのがちょっと残念でしょうか。
ところで、3DSってハードを調べてみると高機能電卓真っ青な高性能なんですね。
ARM11が2コアで264MHzにFPU付、new3DSはさらに4コアとなっているらしいので、もはや電卓とは別次元の高性能携帯マシンですね。
400MHzのHP Primeとどっちが速いのか…FPUありますから3DSの圧勝のような気がしますね(^^;
ってことで、
プチコンで動作するはずの他のバージョンもアップしておきます。
akatuki様、オリジナルバージョンとほぼ同じバージョン。
3DS_PI_CALC.txt
1000桁だとBASEは10桁でいけそうです。
乗除算を一緒にした計算量削減バージョン。
3DS_PI_CALC1.txt
1000桁だとBASEは10桁でいけるはずです。
やす様のSpigotアルゴリズム効率化バージョン。上でアップしてるバージョンです。
3DS_PI_CALC2.txt
1000桁だとBASEは7桁にしないとだめなようです。
藤堂様、1000桁での結果、よろしくです(^^)
数字を入力後、
Z[I]=FLOOR(B/5)の部分で、Subscript out of rangeがでました。原因を探っています。
http://pm.matrix.jp/3DS_PI_CALC.txt
を入力した結果、W=Z[I]*N+Cで、Subscript out of rangeが発生します。
プチコンの仕様書を読んでみました。配列DIMは0番から始まっているとなっていました。
簡易集計表を二次元配列で組んでいるときに、このエラーで頭を抱えたものです。※初心者レベルがばれてしまいますね。
藤堂様、こんにちは!
またまたすみません(^^;
配列のエラーは0から始まってることで確保数が1足りないのでエラーになっていたのだと思われます。
ということで、DIM文のところで確保数を+1にしてくださいませ。
今度こそたぶんいけると思います(^^)
あと、昨日のリストですが、
配列エラーを回避するために外側のループの条件を変更しました。
以前のリストだと必要な桁数の配列数以上にループが回ってしまうのでエラーが出てしまいます。
----------------------------------------
INPUT "DIGITS=";A // 計算する桁数
INPUT "BASE=";K // 変数あたりの桁数
B=POW(10,K)
E=FLOOR(K/LOG(2,10)) // 省略する計算項数
F=FLOOR(A/LOG(2,10))+1 // 計算項数
H=FLOOR(A/K)+1 // 結果格納配列数
DIM Z[F+1],A0[H+1] // 配列確保
CLS
FOR I=1 TO F
Z[I]=FLOOR(B/5)
NEXT
N=F
C=0
FOR I=1 TO H // 外側ループは結果の格納配列数でよい
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z[J]*B
T=FLOOR(W/D)
Z[J]=W-T*D
NEXT
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
N=N-E
NEXT
PRINT "PI="; // 計算結果表示
FOR I=1 TO H
PRINT A0[I];
NEXT
PRINT "END"
----------------------------------------
修正したリストは再アップしました。
http://pm.matrix.jp/3DS_PI_CALC.txt
http://pm.matrix.jp/3DS_PI_CALC1.txt
http://pm.matrix.jp/3DS_PI_CALC2.txt
上のリストもA0[I]=C+W でエラー発生。プチコン配列の0番開始は意外と鬼門。なお、前のリストで配列を1つ増やしたら、動きました。1000で約8秒。出た答えが上手くいきませんでした。入力誤ったかな(汗)
任天堂SNS ミーバースに、プチコン掲示板があります。ここでこの話題を紹介いたしましょうか?
(補足)プチコンの対数は、関数電卓のLNと同じ働きをします。
藤堂様、こんばんは!
検証おつかれさまです。
>1000で約8秒。
やはり爆速ですね。
HP Primeでも1000桁となると1分以上かかるので電卓で秒単位の速度出そうと思ったらCを使うしかありません(^^;
3DSがちょっと欲しくなります(笑)
>(補足)プチコンの対数は、関数電卓のLNと同じ働きをします。
プチコン3号の命令表で、LOG( 数値 [,底 ] )となってるので、
LOG(2,10)で合ってると思うのですけど、一応
PRINT E
PRINT F
PRINT H
で変数が正しく設定されているか確認してみてください。
桁数DIGITSが1000でBASEが6の場合は、
E:19
F:3322
H:167
となる計算です。
>任天堂SNS ミーバースに、プチコン掲示板があります。ここでこの話題を紹介いたしましょうか?
プチコン掲示板、ちょっと見てきました。
ゲーム機だけに色鮮やか華やかな感じですね。
円周率はちょっと、いや、かなり地味かもしれませんね(^^;
皆さん
藤堂様が悩んでおられる事の一つに、結果格納配列のエラーがあります。実は、私も、Casio Basic で同じ悩みがありました。
やっと解決しました。
Base の桁数 K が 2 × log2 より大きいときは、
A0[H+1]
K が 2 × log2 より小さいときは、
A0[H+2]
と、配列確保すれば良いのです。
ここで log は底が10の常用対数です。なので、2 × log2 は、3.3 くらいになります。
計算精度の考え方と実際にループが回る回数には誤差があって、やっとこさ数学の裏付けがとれました。
実際には、
Kが7以上で、
A0[H+1]
そうでないときは、
A0[H+2]
とすれば良いので、
IF K>7 THEN L=1
ELSE L=2
END IF
DIM A0[H+L]
とすればOK!
計算精度と配列メモリ領域のいいとこどりについては、e-Gadget でsentaro様からアドバイスをもらっていたのですが、どうもスッキリせずだったから、これでスッキリです。
結果格納配列A0[ ] 以外は、そのまま触らないでくださいね。
藤堂様が、配列領域を1増やしたら、うまくいった、といわれてたなさは正しかったと言う訳です。K が 6 でないと精度がでないので、その場合は2を
足すので良いことが、証明されました。
(プチコンのIF 文系の書式が怪しいです)
訂正です。
2 × log 2 は、約3.3 でなくて約6.6 ですね。
失礼しました。
上の修正を追加した Casio Basic版 Spigotアルゴリズムのソースです。
// fx-5800P用 PICALC3A
// =========================
0→DimZ // 配列領域解放
"DIGITS"?→A // 求める桁数
"BASE"?→K // 結果変数1個の桁数
10^(K)→B // 結果変数1個を切り出す倍数
Int(K÷log 2)→E◢ // 計算精度得るための計算数
Int(A÷log 2)+1→F◢ // 計算項数
Int(A÷K)+1→H◢ // 結果格納配列数
If K>6:Then 1→L
Else 2→L:IfEnd
F+H+L◢ // 全配列数
F→N // ループで使用する計算項数
F+H+L→DimZ // 配列領域確保
"EXE TO GO"? // ここから時間測定開始
Cls
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Z[I]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
2J-1→D
TJ+BZ[J]→W
Int(W÷D)→T
W-DT→Z[J]
Next
Int(T÷B)→W
C+W→Z[F+I]
T-BW→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Z[F+I]◢ // 一回目の表示で測定終了
Next
0→DimZ // 配列領域解放
""
Locate 1,4,"LAST DIGIT:" // 最終行再表示抑制
Locate 12,4,KH-1
// =========================
// fx-9860GII用 PICALC3A
// =========================
ClrMat Z // 配列領域解放
"Digits"?→A // 求める桁数
"Base"?→K // 結果変数1個の桁数
10^K→B // 結果変数1個を切り出す倍数
Int (K÷log 2)→E◢ // 計算精度得るための計算数
Int (A÷log 2)+1→F◢ // 計算項数
Int (A÷K)+1→H◢ // 結果格納配列数
If K>6:Then 1→L
Else 2→L:IfEnd
F+H+L◢ // 全配列数
F→N // ループで使用する計算項数
{F+H+L,1}→Dim Mat Z // 配列領域確保
"EXE To Go"? // ここから時間測定開始
ClrText
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Mat Z[I,1]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," "
Locate 1,2,J
2J-1→D
TJ+BMat Z[J,1]→W
Int (W÷D)→T
W-DT→Mat Z[J,1]
Next
Int (T÷B)→W
C+W→Mat Z[F+I,1]
T-BW→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Mat Z[F+I,1]◢ // 一回目の表示で測定終了
Next
ClrMat Z // 配列領域解放
""
Locate 1,7,"Last Digit:" // 最終行再表示抑制
Locate 13,7,KH-1 // 表示された小数点以下の桁数
// =========================
Sentaro 様、こんばんは!
コメントがスパム扱いになっておりましたので、解除しますた。
> プチコンの仕様を見るとほとんどそのまんまBASICですよね。
> ゲーム機でBASICというのはプログラミング入門にはいいきっかけになると思うのですけど、外部とのリンクが制限されてるのがちょっと残念でしょうか。
ウーン。
外部とのリンクというと、例えば(シリアル)通信機能とかでしょうか ? 高性能だけに、惜しい所でありますが、結構プチコンも普及しつつある様子なので、改良の可能性も ?
意外に興味深いのが、LOG( 数値 [,底 ] )ですネ。普通の関数電卓では常用対数と自然対数しかなく、一般的な数を底とするにはチュッと工夫が必要でしたが、既にそういう需要を見越しているのか、この構文は ! と思う所です。
> ところで、3DSってハードを調べてみると高機能電卓真っ青な高性能なんですね。
> ARM11が2コアで264MHzにFPU付、new3DSはさらに4コアとなっているらしいので、もはや電卓とは別次元の高性能携帯マシンですね。
ありゃ、ARM11だったのね。HP50gがARMv7だったかしらん ? HP Primeはどうだったか ... 。
ポケットサイズとは言え、やはりグラフィクスを重視したゲーム機。高性能は納得です。そこへプチコンが登場した事で、BASICプログラミングが楽しめる様になった。この流れで見ると、3DSは、昔のBASICパソコンの「末裔」だったりするのではないか、と。
> 400MHzのHP Primeとどっちが速いのか…FPUありますから3DSの圧勝のような気がしますね(^^;
仰るとおりですネ。藤堂様の実行レポートでもそれが示されてしまった ... 。
やす様、藤堂様、sentaro様、こんばんは !
お疲れ様です !
現在、些事にかまけている事もあり、円周率の計算についての話題には割り込んでいく気力もないのです。
akatuki様
どうぞお構いなく(^。^;
人様のお宅で、コメント100超えで大騒ぎさせてもらって、妙な物言いではありますが...
やす様、おつかれさまです!
新バージョン早速試してみました。
配列エラーに関しては私もいまいちスッキリしないまま回避方法を考えていたというところですけど、新バージョン上手くいきましたね。
285桁でも問題なく完走します。
ってことで、CasioBasicではこれ以上計算桁数は増やせないので変数あたりの桁数を試しに5桁、4桁、3桁と桁数を少なくしていくと3桁のときにDimension ERRORが(^^;
というところで、
やす様の、
>計算精度の考え方と実際にループが回る回数には誤差があって、やっとこさ数学の裏付けがとれました。
ここの誤差のところでピンときました!
誤差を最小に抑えるためには、
Int(K÷log 2)→E◢
このEは1変数あたりの桁数の計算が終了するたびに減らしていっていい項数の数なので、無理に整数化しなくてもいいわけなんですね。
つまり、最初のEを求めるところは実数のままで、
(K÷log 2)→E◢
途中の、
For N-1→J To 1 Step -1
を
For Int(N)-1→J To 1 Step -1
にすれば誤差がほぼなく配列エラーも起こさない回数できちっとループが回ります。
これでほぼ完全版となると思います(^^)
1000桁以上の計算になるとHP Primeのエミュでも辛くなるので、ロジックの検証用にWindowsの十進BASICでのソースをアップしておきます。
今回のやす様バージョンそのまま移植バージョン
http://pm.matrix.jp/PICALC3A.BAS
配列数等を確認するためのPRINT文は最後にまとめて追加してあります。
Eを実数化したバージョン
http://pm.matrix.jp/PICALC3B.BAS
プチコン用ソースに対応した検証用バージョンもアップしておきます。
http://pm.matrix.jp/PICALC.BAS
http://pm.matrix.jp/PICALC1.BAS
http://pm.matrix.jp/PICALC2.BAS
akatuki様、こんにちは!
>コメントがスパム扱いになっておりましたので、解除しますた。
毎度毎度お手数おかけしましてすみませんです。
なぜにスパム扱いになったかと考えてみれば、前の時も今回もリンクでタグを使ってたのでプレビューを何度か試してました。
たぶん、それがスパムになってしまったかもなのですが(^^;
>外部とのリンクというと、例えば(シリアル)通信機能とかでしょうか ?
はい。現行製品ですしハッキングを考えれば仕方ないところとは思いますけど、クローズドな機器というのは何かにつけて不便ですよね。
HP Primeもクローズドなままだと魅力半減ともいえますし、そのあたりは難しいところですよね。
>結構プチコンも普及しつつある様子なので、改良の可能性も ?
前のmk2ではQRコードで交換可能になってたみたいですけど、3号ではまた出来なくなってるとかで…。
>意外に興味深いのが、LOG( 数値 [,底 ] )ですネ。
これBASICで使えるのは便利ですよね。
>ありゃ、ARM11だったのね。HP50gがARMv7だったかしらん ? HP Primeはどうだったか ... 。
HP50GもHP PrimeもARM9だったと思いますけど、3DSに比べると一世代以上古いんですよね(^^;
電卓では10進演算なのでFPUは使わないですし、ARM9でも何も問題は無いのだろうと思いますけど、3DSのパソコン級のCPUパワーにはちょっと驚きます。
>この流れで見ると、3DSは、昔のBASICパソコンの「末裔」だったりするのではないか、と。
BASICなのに速度は当時のマシン語レベルで、出来ることも数段上となれば…恐るべし「末裔」ですよね。
Fは3322になっていました。
IF K>7 THEN L=1
ELSE L=2
END IF
DIM A0[H+L]
記述すると、ELSE L=2でsyntax error。
IF K>7 THEN L=1 ELSE L=2
END IF
とすると、ENDIF without IFのエラー。ここで、ENDIFを消して実行すると、Z0[I]=FLOOR(B/5)で配列エラー。プチコンBASICとの格闘が続きます。
sentaro様、藤堂様
親と一緒に花見に行っていて遅くなりました。満開を過ぎてしまっていますが、まだなんとか、今日が限度のようですね。
さて、実際のループとの誤差の件、目の付け所は良かったのですが、詰めが甘かったです。
解析的に解こうとしたのですが、求める桁数とBaseの桁数の全ての組み合わせには対応していません。カシオの電卓ですと 285桁が限となので、1000桁まで考えていませんでした。
IF K>7 THEN L=1
ELSE L=2
END IF
DIM A0[H+L]
この部分ですが、そもそも DIM A0[H+1] が間違っていました。A0[ ]ではなくて Z[ ]の配列数を設定すべきでした。
また、そこで、 IF文のところは、以下の1行に置きかえます。
L=FLOOR((F-1)÷E)+1-H
そして、このLを使って
DIM Z{F+L]
とします。
藤堂様>振り回してしまって、申し訳ありません。
既に提案されている にsentaro様のやり方で良いと思います。
私のアプローチは、計算した誤差で配列数を修正するという方法で、ループは整数のまままわします。
fx-5800P では、途中経過の表示を整数に直す時間がばかにならないし、ループ内で
N-E→N でも整数に変換する時間を節約したいので、ループは整数のまま回したいという事情があるので、このようなアプローチにしています。
そもそも速度の速いプチコンですと、どちらでも関係ないと思います。
整数のままループを回すアプローチ;
----------------------------------------
INPUT "DIGITS=";A // 計算する桁数
INPUT "BASE=";K // 変数あたりの桁数
B=POW(10,K)
E=FLOOR(K/LOG(2,10)) // 省略する計算項数
F=FLOOR(A/LOG(2,10))+1 // 計算項数
H=FLOOR(A/K)+1 // 結果格納配列数
// ここまでは変更なし
L=((F-1)÷E)+1-H // 実際のループとの誤差
DIM Z[F+L],A0[H] // 配列確保、両方とも[ ]の中が変わっています
// 以下も変更なし
CLS
FOR I=1 TO F
Z[I]=FLOOR(B/5)
NEXT
N=F
C=0
FOR I=1 TO H // 外側ループは結果の格納配列数でよい
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z[J]*B
T=FLOOR(W/D)
Z[J]=W-T*D
NEXT
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
N=N-E
NEXT
PRINT "PI="; // 計算結果表示
FOR I=1 TO H
PRINT A0[I];
NEXT
PRINT "END"
----------------------------------------
sentaro様
いつもながら、素早いですね。
fx-5800P のためには、Locate 表示部分を整数のまま表示したいので、通常の算術演算と同等の処理時間とはいえ(確認済み)、Int( )を節約して、整数のままループを回したいので、別アプローチを試みています。
一応今朝作ったので、公開しておきますね。
誤差(変数L)を計算して、その分だけ配列を最小必要限度確保する方法で、PICALC4 としておきます。
なお、プログラムの最後の表示部分は、正しい円周率と比較しやすいように、小数点以下の桁数を表示しています。
例えば、計算する桁数に285、Baseに6を指定してプログラムを走らすと、表示の最後の部分は、
664821
339341
Last digit: 287
となります。
末尾2桁の41は286桁と287桁目で、
285桁目は3だと用意委容易に分かります。
そして、285桁目までは正しいことが確認できて、OKとなります。
// fx-9860GII用 PICALC4
// =========================
ClrMat Z // 配列領域解放
"Digits"?→A // 求める桁数
"Base"?→K // 結果変数1個の桁数
10^K→B // 結果変数1個を切り出す倍数
Int (K÷log 2)→E◢ // 計算精度得るための計算数
Int (A÷log 2)+1→F◢ // 計算項数
Int (A÷K)+1→H◢ // 結果格納配列数
Int ((F-1)÷E)+1-H→L◢ // 実際のループ回数との誤差
F+H+L◢ // 全配列数
F→N // ループで使用する計算項数
{F+H+L,1}→Dim Mat Z // 配列領域確保
"EXE To Go"◢ // ここから時間測定開始
ClrText
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Mat Z[I,1]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," "
Locate 1,2,J
2J-1→D
TJ+BMat Z[J,1]→W
Int (W÷D)→T
W-DT→Mat Z[J,1]
Next
Int (T÷B)→W
C+W→Mat Z[F+I,1]
T-BW→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Mat Z[F+I,1]◢ // 一回目の表示で測定終了
Next
ClrMat Z // 配列領域解放
""
Locate 1,7,"Last Digit:" // 最終行再表示抑制
Locate 13,7,KH-1 // 表示された小数点以下の桁数
// =========================
で、私には最終目的である fx-5800P 用です(^^;)
// fx-5800P用 PICALC4
// =========================
0→DimZ // 配列領域解放
"DIGITS"?→A // 求める桁数
"BASE"?→K // 結果変数1個の桁数
10^(K)→B // 結果変数1個を切り出す倍数
Int(K÷log 2)→E? // 計算精度得るための計算数
Int(A÷log 2)+1→F◢ // 計算項数
Int(A÷K)+1→H◢ // 結果格納配列数
Int((F-1)÷E)+1-H→L◢ // 実際のループ回数との誤差
F+H+L◢ // 全配列数
F→N // ループで使用する計算項数
F+H+L→DimZ // 配列領域確保
"EXE TO GO"◢ // ここから時間測定開始
Cls
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Z[I]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
2J-1→D
TJ+BZ[J]→W
Int(W÷D)→T
W-DT→Z[J]
Next
Int(T÷B)→W
C+W→Z[F+I]
T-BW→C
Isz I:N-E→N
LpWhile N>0
For 1→I To H // 計算結果表示
Z[F+I]◢ // 一回目の表示で測定終了
Next
0→DimZ // 配列領域解放
""
Locate 1,4,"LAST DIGIT:" // 最終行再表示抑制
Locate 12,4,KH-1
// =========================
藤堂様、プチコン格闘おつかれさまです。
Fの値は正常ですね。
配列エラーは確保数を+100ぐらいにしておけばとりあえず配列エラーは完全回避できるはずです。
ロジック的にはたぶん間違いなく動くと思われるのであとちょっとですね(^^)
変数のミスタイプ1文字で全然動かなくなるのでそこだけですね。
やす様、こんにちは!
誤差をそのまま計算するか、最初に補正値を求めて確保しておくかですね。
実数のままで計算するのはCasioBasicでは表示でさらにIntを使う必要ありなので、やす様の最初に補正がよさそうですね(^^)
あ、整数のまま回すアプローチは配列確保数がループ回数なので配列エラーが出るはずはないので補正は必要ないかと(^^;
DIM Z[F+1],A0[H+1]
で大丈夫かと思います。
3DS_PI_CALC.txt
3DS_PI_CALC1.txt
3DS_PI_CALC2.txt
ちょっと脇道。高機能電卓の意見交換の場を作りました。
興味があればご覧ください。
https://www.facebook.com/scientificcalculatorfunclub
藤堂様、やす様、sentaro様、お疲れ様です。
当方、未だに気分がすぐれず、なかなか話題を追いかける余裕もありませんで、申し訳ない。一応眺めては居るのですが ... 。
当方の事は氣にせず、自由闊達なる議論を進めて戴き度。
※ 新しいreCAPTHCAをクリックしたら「歪み文字を答えよ」って出やがったよ。ロボットぢゃねェぞ、バーロー !
藤堂様、こんにちは!
関数電卓研究会、拝見しました!
fx-5800Pの存在感半端ないですね(^^)
facebookのアカウント持ってないので見るだけになっちゃいそうなのですが…(^^;
ところで、プチコン3号、動いたでしょうか?
akatuki様、こんにちは!
>※ 新しいreCAPTHCAをクリックしたら「歪み文字を答えよ」って出やがったよ。ロボットぢゃねェぞ、バーロー !
ワインとお肉とケーキをこの中から全部選べというのも出ました(^^;
やす様、こんにちは!
ロジック的にはほぼ煮詰まって、新たなアルゴリズムでもないと新展開はなさそうな感じなので(^^;
出力の整形をちょっと考えてみました。
2~9桁(任意)から10桁に整形出力するプログラムです。
とりあえずfx-9860GII版ですが、ここだけサブルーチンにしておけば結果表示は各プログラムで共通化できます。
For 1→I To H
Mat Z[F+I,1]◢ // 一回目の表示で測定終了
Next
この部分を差し替えます。
0→M // 配列の先頭より表示開始
Prog"PICALOUT"
PICALC2以上はSpigotアルゴリズム版では
1→M // 最初の配列の2桁目から表示開始
Prog"PICALOUT"
fx-9860GII版 "PICALOUT"
----------------------------------------
For 1→I To Int((A+9)÷10) //
0→P // 計算結果
0→N // 10桁のうち変換できた桁数
While N<10 // 10桁変換できるまでループ
10(I-1)+N+M→C // C桁目を変換
Int(C÷K)→J // C桁目の存在する配列インデックスJ
C-JK→X //配列のX桁目から
K-X→D //使える桁数D
D>10-N=>10-N→D //使う桁数設定
Isz J:J>H=>Break //配列アクセスエラー回避
K-X→W // W桁目からD桁抽出
Int(Mat Z[F+J,1]÷10^W→T
Mat Z[F+J,1]-T*(10^W)→R
W-D<0=>D→W
Int (R÷10^(W-D))→S
P+S*10^(10-D-N)→P
N+D→N
WhileEnd
P◢ // 10桁ずつ計算結果表示
Next
----------------------------------------
すみません。
Spigotアルゴリズム版でしか正常に動きませんでした(^^;
修正版です。
A:桁数
K:1変数あたりの桁数
H:結果配列数
F:配列オフセット
M:表示開始位置
Z[]:配列
修正版
fx-9860GII版 "PICALOUT"
----------------------------------------
For 1→I To Int((A+9)÷10) //
0→P // 計算結果
0→N // 10桁のうち変換できた桁数
While N<10 // 10桁変換できるまでループ
10(I-1)+N+M→C // C桁目を変換
Int(C÷K)+1-M→J // C桁目の存在する配列インデックスJ
C-(J-1+M)K→X //配列のX桁目から
K-X→D //使える桁数D
D>10-N=>10-N→D //使う桁数設定
Isz J:J>H=>Break //配列アクセスエラー回避
K-X→W // W桁目からD桁抽出
Int(Mat Z[F+J,1]÷10^W→T
Mat Z[F+J,1]-T*(10^W)→R
W-D<0=>D→W
Int (R÷10^(W-D))→S
P+S*10^(10-D-N)→P
N+D→N
WhileEnd
P◢ // 10桁ずつ計算結果表示
Next
----------------------------------------
リハビリのため、バスの乗降訓練と、ダイヤ改正の新路線に乗るため、プチコンを触る機会が減っていました。すみません。(;´д`)」
結果はまたご報告します。
sentaro 様、
> ワインとお肉とケーキをこの中から全部選べというのも出ました(^^;
ゲーッ ! 何ですか、ソレ !? 最近のBlogger、かなりおかしな事になっているみたいです。マイッタなぁ。
> HP50GもHP PrimeもARM9だったと思いますけど、3DSに比べると一世代以上古いんですよね(^^;
ARM9でしたっけ ? 最近、HPGCCも使っていないので、勘が鈍ってイケナイ。それでも3DSの方が新しい世代というのは ... 。
> 電卓では10進演算なのでFPUは使わないですし、ARM9でも何も問題は無いのだろうと思いますけど、3DSのパソコン級のCPUパワーにはちょっと驚きます。
> BASICなのに速度は当時のマシン語レベルで、出来ることも数段上となれば…恐るべし「末裔」ですよね。
仰る通りです。
ゲーム機と言えども、これだけのプロセッサを積んでいる、その御時世に驚きを禁じ得ないのであります。
ゲーム機はガキ共をはじめとして広く売上を伸ばしているので、新しいハードウェアを次々と出してくる、その「良循環」が、ここまでの製品になったのですが、そこにプチコンを盛り付けたのは、なかなか考えたモノではあります。
>> 意外に興味深いのが、LOG( 数値 [,底 ] )ですネ。
> これBASICで使えるのは便利ですよね。
この部分も、プチコン開発者の「愛」を感じる部分だと思うのです。最近のゲームも、数値計算などを応用する所がある様で、(教育的硬貨を狙い)関数表現を少し凝った形でインプリメントしたのか、と期待しているのです。
やす様、sentaro様のコード、後でまとめて見ようと思っておりましたが、ここまで展開が進むと、少々骨が折れそうで、なかなか手が回りません、御容赦戴き度。リアルタイムで追っかけないとクルシイです。
その内、やす様が簡潔にまとめたものをblogにアップしてくれるものかと期待して。
藤堂様。
リハビリの方、お疲れ様です。
「やす様が作成されたfx-5800Pのコードがあります」と呼びかけて以来、長きにわたる「コード合戦」に引きずり込んでしまった形になってしまいました。
やす様、sentaro様のレスポンスが早く、ヒートアップしてしまいましたが、一息ついて、のんびりと試され度。
さっそく、入力しました。 INPUT "DIGITS=";A // 計算する桁数
INPUT "BASE=";K // 変数あたりの桁数
B=POW(10,K)
E=FLOOR(K/LOG(2,10)) // 省略する計算項数
F=FLOOR(A/LOG(2,10))+1 // 計算項数
H=FLOOR(A/K)+1 // 結果格納配列数
// ここまでは変更なし
L=((F-1)÷E)+1-H // 実際のループとの誤差
DIM Z[F+L],A0[H] // 配列確保、両方とも[ ]の中が変わっています
// 以下も変更なし
CLS
FOR I=1 TO F
Z[I]=FLOOR(B/5)
NEXT
N=F
C=0
FOR I=1 TO H // 外側ループは結果の格納配列数でよい
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1
D=2*J-1
W=T*J+Z[J]*B
T=FLOOR(W/D)
Z[J]=W-T*D
NEXT
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
N=N-E
NEXT
PRINT "PI="; // 計算結果表示
FOR I=1 TO H
PRINT A0[I];
NEXT
PRINT "END"
は、桁数を入力後、A0[I]=C+Wの部分Subscript out of range。これは、ソフトハウスに聞いてみるしかないかもですね。
ソフトハウスに聞く前に、Miiverseにソースを掲載して、プチコンのセミプロに質問として掲載しました。
皆様、
在りし日のNIFTY-Serve 、ソフトウェアギャラリーを思い出し、ヒートアップを楽しんでおります。
今回のネタは、様々なプラットフォームに同じプログラムを異色したこと、メモリ消費とスピードという相反する要素への複数な解が提示されたことが、とても貴重だと思います。
なので私のブログで、どのように紹介してゆくか思案中でして、思いっきり数学的な解説から始めるスタイルにするか、逆にかここでの流れのダイジェット版にするか?
多分その間に落ち着くと思うのですが、モタモタすると私の興味が他へ行ってしまいそうで、やる気がなくなる恐れもあり、色々と思案中なわけです。
私の性格上、数学から説き起こしたいので、そこら辺りから準備を始めていますが、アルゴリズムをキチンと比較するところで、つまずいています。
なので、プログラムを簡単な説明(解説以外の簡単なもの)と共に掲載して、実行できるまでを提供し、あとはとにかく読者にプログラムをはしらせてもらって楽しんでもらう、こんな感じに落ち着く可能性大です。
sentaro様
面白いですね。昨日は時間がなかったのですが、最終的にはfx-5800P に実装したいところです。
akatuki様、こんにちは!
>ゲーッ ! 何ですか、ソレ !? 最近のBlogger、かなりおかしな事になっているみたいです。マイッタなぁ。
絵が9枚くらい出てきて合う画像を選ぶみたな感じです。
いつもではないのでどのタイミングで出てくるのかはちょっと謎です(^^;
>ARM9でしたっけ ? 最近、HPGCCも使っていないので、勘が鈍ってイケナイ。それでも3DSの方が新しい世代というのは ... 。
15CLEとかはARM7のようですがHP50GとHP PrimeはARM9みたいです。
AARMを調べてるとv5とかv6とか内部アーキテクチャでまた分かれてたりと、慣れてないとちょっとややこしいです(^^;
最近ラズパイなどというコスパ物件があるのを見かけました。
>ここまで展開が進むと、少々骨が折れそうで、
akatuki様が最初に移植されたのは多倍長抜きで単純にすると、
-------------------------------
F=Int(10÷Log(2))
Z=2
For N=1 to F
Z=Z*N/(2*N+1)+2
Next
-------------------------------
これでZに円周率が求まるということだと思うのですけど、
これが、
π=1/4arctan(1)
この式からとして、そこからなぜにこうなるというのが不思議な感じで(^^;
円周率.jpを見てると分かったような気がするけどいまいちスッキリしないというか…Spigotアルゴリズムになってくると未だにパズルを解いてるとしかいいようがない感じです。
最初の方にアップしたコードはとりあえず移植して動くという段階で、そこから、やす様とヒートアップしつつ(^^)一つ一つの変数の役割、意味が少しずつわかってきても、なぜにこれで円周率が求まるのかはまだ謎な感じです。
ロジックを組み上げたり高速化はまた別の面白さがあるんですけどね。
ということなので、私もやす様の数学的解説版にちょっと期待してしまいます(^^)
藤堂様、こんにちは!
リハビリ&プチコン3号おつかれさまです。
>桁数を入力後、A0[I]=C+Wの部分Subscript out of range。
プチコンでは配列が0から始まるとのことなので、配列確保で失敗してるような気がします(^^;
DIM Z[F+L],A0[H]
↓
DIM Z[F+L],A0[H+1]
これでOkになれば、配列仕様の問題ですね。
プチコン版がfx-9860GII/CG10のアドイン版とどっちが速いのかちょっと興味津々です(^^)
やす様、こんにちは!
>今回のネタは、様々なプラットフォームに同じプログラムを異色したこと、メモリ消費とスピードという相反する要素への複数な解が提示されたことが、とても貴重だと思います。
はい。
最初はakatuki様のHP Primeへの移植版から始まったわけですけど、昨年の段階でやす様がfx-5800Pへの移植を示唆されてましたね(^^)
円周率を求めるだけなのに、いざやってみるとロジック的にはかなり頭の体操になることと電卓間の相違(言語、精度、速度)が面白いところでかなりツボにはまります(^^)
>私の性格上、数学から説き起こしたいので、そこら辺りから準備を始めていますが、アルゴリズムをキチンと比較するところで、つまずいています。
数学的にというところがなかなかによいです。
個人的に数学的思考ははるか昔に置き忘れてきた感覚なのでなにげにとても新鮮です(^^)
円周率という題材に似たものとしてネイピア数を計算するネタも面白そうですね。
>面白いですね。昨日は時間がなかったのですが、最終的にはfx-5800P に実装したいところです。
ほぼそのままでfx-5800Pにちょいと移植してみましたところ、若干もっさり感があるものの結果の表示としては10桁単位になってすっきりしますね(^^)
ここの高速化もまた頭の体操になるかもです(^^;
やす様、おばんです。
> 在りし日のNIFTY-Serve 、ソフトウェアギャラリーを思い出し、ヒートアップを楽しんでおります。
ウーム。
> 今回のネタは、様々なプラットフォームに同じプログラムを異色したこと、メモリ消費とスピードという相反する要素への複数な解が提示されたことが、とても貴重だと思います。
それは、やす様、sentaro様の貢献であります。多謝 !
> なので私のブログで、どのように紹介してゆくか思案中でして、思いっきり数学的な解説から始めるスタイルにするか、逆にかここでの流れのダイジェット版にするか?
> 多分その間に落ち着くと思うのですが、モタモタすると私の興味が他へ行ってしまいそうで、やる気がなくなる恐れもあり、色々と思案中なわけです。
簡潔にまとめるのも、諸事情を深く理解していなければならないので、結構大変であります。
当方もモタモタしていたので、他の話題に気を取られてしまい、追いつかなくなった始末で、なるほど、こういう旬な話題のまとめは急いで行うのが吉、という具合ですね。
> 私の性格上、数学から説き起こしたいので、そこら辺りから準備を始めていますが、アルゴリズムをキチンと比較するところで、つまずいています。
> なので、プログラムを簡単な説明(解説以外の簡単なもの)と共に掲載して、実行できるまでを提供し、あとはとにかく読者にプログラムをはしらせてもらって楽しんでもらう、こんな感じに落ち着く可能性大です。
この大状況を俯瞰する様な記事、という事で、楽しみにしております !
sentaro様
計算結果を10桁ずつ表示するサブルーチン、使えるアイディアですね。
そこで、fx-5800Pでどの程度使えるのか、軽く動くプログラムに挑戦してみました。
・最初の行には 3 のみを表示し、
・そのあと 10 桁づつ表示し、
・最後の行は、指定桁数に併せて、10桁以下の表示にする
というものにしました。
主に、fx-5800P 対応を考慮して、
・配列変数へのアクセス回数を極力抑える
・計算量を抑える
という方針。
なので、1行表示あたり、配列変数アクセスを1回のみ(これ以上は減らせない)と最低限にし、
ループを1つだけにして、100桁なら100回まわすのみ、という作戦。
最初の行の 3 のみの表示と、それ以降の10桁表示、そして最後の行の 10桁以下の表示も、
1つの Do ループに押し込んでしまいました。
一応、許せる程度処理速度になったかな、と思います。
ロジックがかなり違うので、プログラム名をちょと変えて PIDISP としました。
Fx-5800P向け
ファイル名:PIDISP
PICALCx と共用する変数
Z[ ], A(求める桁数), F(計算項数), K(Baseの桁数)
================
K-1→C
1→J:1→S:1→T:0→R
Z[F+J]→P
Do
Int(P÷10^(C))→C
10R+Q→R
P-10^(C)Q→R
If C:Then
C-1→C
Else
Isz J:Z[F+J]→P
K-1→C
IfEnd
S-1→S:Isz T
If T>A:Then R◢
Break:IfEnd
If S<1:Then R◢
0→R:10→S:IfEnd
LpWhile 1
""
Locate 1,4,"LAST DIGIT:"
Locate 12,4,A◢
================
Z[F+J] で、J を 1 から大きくしながら、1桁づつ読み出すこと、
読み出した数(1桁)を10倍して次を足す、という方法で、10桁を作って、すぐに表示。
あとは、
・表示を10桁で区切ること、
・タイミイングをみて配列 Z[F+J] の J を1つ増やすこと
・A桁最後を検出したらループを脱出すること
が do ループの中の If文で実装しています。
すみません、さっそくですが修正です。
19行目の If T>A は、If T>A+1 に変更です。
Fx-5800P向け
ファイル名:PIDISP
PICALCx と共用する変数
Z[ ], A(求める桁数), F(計算項数), K(Baseの桁数)
================
K-1→C
1→J:1→S:1→T:0→R
Z[F+J]→P
Do
Int(P÷10^(C))→C
10R+Q→R
P-10^(C)Q→R
If C:Then
C-1→C
Else
Isz J:Z[F+J]→P
K-1→C
IfEnd
S-1→S:Isz T
If T>A+1:Then R◢
Break:IfEnd
If S<1:Then R◢
0→R:10→S:IfEnd
LpWhile 1
""
Locate 1,4,"LAST DIGIT:"
Locate 12,4,A◢
================
sentaro様
皆様
表示のサブルーチンと従来の表示の両方に対応するように PICACL4 を変更しました。
メモリ残量が確保できる配列数を決めるので、今回は計算可能な桁数がメモリ残量で制限されます。
私の fx-5800P には多くの自作プログラムがあるので、メモリ残量がかなり少なくなっています。ここで新たなプログラムを追加するのではなくて、既存のプログラムを変更したのは、メモリ事情のためです。
計算が終わったら、表示モードが 0 か 1 かをの入力を求め、
- 0 の時、従来の表示方法
- 1 の時(実際は0以外の時)、10桁表示のサブルーチンを呼びだす
というように変更しました。
// fx-5800P用 PICALC4 (改)
// =========================
0→DimZ // 配列領域解放
"DIGITS"?→A // 求める桁数
"BASE"?→K // 結果変数1個の桁数
10^(K)→B // 結果変数1個を切り出す倍数
Int(K÷log 2)→E // 計算精度得るための計算数
Int(A÷log 2)+1→F◢ // 計算項数
Int(A÷K)+1→H // 結果格納配列数
Int((F-1)÷E)+1-H→L // 実際のループ回数との誤差
H+L◢ // 実際の結果格納配列数
F+H+L◢ // 全配列数
F→N // ループで使用する計算項数
F+H+L→DimZ // 配列領域確保
"EXE TO GO"? // ここから時間測定開始
Cls
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Z[I]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
2J-1→D
TJ+BZ[J]→W
Int(W÷D)→T
W-DT→Z[J]
Next
Int(T÷B)→W
C+W→Z[F+I]
T-BW→C
Isz I:N-E→N
LpWhile N>0
“DISP MODE”
“0 Or 1:”?→M
CLS
If M:Then
Prog “PIDISP”
Else
For 1→I To H // 計算結果表示
Z[F+I]◢ // 一回目の表示で測定終了
Next
""
Locate 1,4,"LAST DIGIT:" // 最終行再表示抑制
Locate 12,4,KH-1
IfEnd
0→DimZ // 配列領域解放
// =========================
akatuki様、すみません…(^^;
昨晩、新ネタ?パスタを選べ!が出て答えを間違えたかも…(^^;
で、またまたまたスパム扱いになってしまってたかもです。
今見たら復活してますね(^^)
お手数おかけしましたm(_ _)m
やす様、こんにちは!
100桁100ループの新しい10桁整形ロジック、これから試してみます(^^)
やす様、
PIDISPの最初のこの部分が微妙に違ってたのでそれを修正したら動きました!(^^)
---------------------
Do
Int(P÷10^(C))→Q
10R+Q→R
P-10^(C)Q→P
---------------------
10桁で10ループですが計算量が少ないので速度的にはそこそこ出ますね。
私のは10桁あたり2~3ループですけど、計算量が多めなので変数1個の桁数が多い時はいいのですが、桁数が少なくなるにつれて重くなります。
一長一短というところですね(^^;
元々はPICALC1で9桁計算になるのがあまりにも半端なので10桁整形を考えたのですが桁数を汎用化するとやっぱりオーバーヘッド出てきますね。
桁数を限定すれば速度的にはまだ最適化できそうです。
Miiverseで質問した内容の回答が以下の通りです。
《
DIM A0[H] の宣言で使える範囲は A0[0]~A0[H-1] FOR I=1 TO H の中でA0[H] を参考にしているようにみえます。 配列の上限を確認して1つ多く確保するなりすれば良いと思います。
》
追記
A0[]の配列を1増やしてもエラーが解消しません。開発元のメールフォームから訪ねてみます。
sentaro様
ありゃぁ、私の電卓では、
P-10^(C)Q→P
となっているのに、なんで
P-Q10^(C)→P
と書いたのだろうか?(謎)
ご指摘ありがとうございます。
ところで、
>私のは10桁あたり2~3ループですけど、計算量が多めなので変数1個の桁数が多い時はいいのですが、桁数が少なくなるにつれて重くなります。
これって、どういうカラクリなんでしょうか?
藤堂様、こんにちは!
配列増やしても配列エラーが出る原因として考えられるのは、はて???
プチコン3号、なかなか、一筋縄ではいかないですね(^^;
しかし、Miiverse、きちんと回答してくれるのはさすがです。
やす様、こんにちは!
>これって、どういうカラクリなんでしょうか?
やす様の一桁ずつ取り出して10桁にしていくのを一度に出来るだけ桁数多くまとめてやっている感じになります。
ただ、10桁ごとに配列のどの位置からそのデータを引っ張ってくるかをループ毎にいちいち計算しているのでループ回数が多くなると重くなってくるという感じですね。
9桁から10桁の場合は毎回2ループなので一番効率がよくなりますが、6桁から10桁にする場合は最小2ループ最大3ループで、これが3桁とかになると最小4ループ最大5ループとなってきてループ毎の計算がオーバーヘッドになってくるという感じですね。
今のロジックだと同じ配列のアクセスが2回になることが多いのでここらあたりまだ高速化の余地ありです。
とか考えていると、やす様の一桁ごと取り出しているアルゴリズムを複数桁にしていけば上手いこと高速化出きそうな気がしてきました。
>となっているのに、なんで
>P-Q10^(C)→P
>と書いたのだろうか?(謎)
あ゛…
最初から
P-10^(C)Q→R
と書かれてたのでそこの問題ではなかったというツッコミを少々…(^^;
もとい、
私もfx-9860GIIからfx-5800Pに移植する時に打ち間違えてしまうことがよくあって、1文字違っただけで動かないのでこれでしばらく悩むことたびたびです。
変数名が1文字だけのCasioBasicでは変数名は最重要チェック項目ですよね(^^;
sentaro様
>とか考えていると、やす様の一桁ごと取り出しているアルゴリズムを複数桁にしていけば上手いこと高速化出きそうな気がしてきました。
なるほど、そういうアプローチもありますね。
実は、PIDISP でちょっと気になる動作があって、考えてみました。
例えば、PICALC4 で 求める桁数を 77 とします。
そして、サブルーチン PIDSIP で 10桁単位で表示させると、最後から2行の表示は以下のようになります。
5923978164
628620
ところが、本当は
5923978164
0628620
となるべきなんですね。
上位の桁に0がある場合、数値として表示さっれているために、上位の0が消えることから、それが認識されません。
一方、桁臼を 80 としたときの表示は、本来
5923978164
0628620899
となるべきところ、
5923978164
628620899
となります。これなら空白が0だと分かります。
そこで、77桁表示も戻って、本来以下のようになることから、
5923978164
0628620
必ず10桁表示になるように、下位の桁を0で埋めてしまう作戦を考えました。
5923978164
628620000
こうすると、空白は0と分かり、下位の4桁は指定桁数外と分かります。
もう一つ問題が残ります。
本来は、以下のように 77桁目(最下位)は0なのですが、余計に追加した0と区別がつきません。
そこで、77桁目を示すようにしました。
fx-9860GII の場合
5923978164
628620000
[77]▲
77桁目は、▲で示した0ですよ、という表示です。
fx-5800P の場合は、▲記号を使えないので代わりに!を使うことにして、
5923978164
628620000
[77]!
とします。
実は、この変更はループの中には1行追加するだけで済むので、処理速度への影響が最低限になるのが、ポイントだったりします。
Fx-5800P向け
ファイル名:PIDISP Ver2
PICALCx と共用する変数
Z[ ], A(求める桁数), F(計算項数), K(Baseの桁数)
================
K-1→C
1→J:1→S:1→T:0→R
Z[F+J]→P
Do
Int(P÷10^(C))→C
10R+Q→R
P-10^(C)Q→R
If C:Then
C-1→C
Else
Isz J:Z[F+J]→P
K-1→C:IfEnd
S-1→S:Isz T
If T>A+1:Then
10^(S)R→R // この行を追加
R◢
Break:IfEnd
If S<1:Then R◢
0→R:10→S:IfEnd
LpWhile 1
""
Locate 15-S,4,"]!"
Locate 13-S-Int(log(A)),4,"["
Locate 14-S-Int(log(A),4,A◢
================
最後の3行は、桁末尾の表示です。
[77]!
と表示する際、この場合は2桁の 77 ですが、これが 120 と3桁になる場合もあるので、Locate の表示開始位置を正しく計算するために A の桁数が 1+Int(log(A)) であることを利用しています。
sentaro様、皆様
10桁表示のfx-9860GII版を掲載します。
fx-5800P 用のPIDISP の最新版を移植したものです。
併せて、PICALC4 (改) の移植版も掲載します。
Fx-9860GII 用 PIDISP Ver2
ファイル名:PIDISP Ver2
PICALCx と共用する変数
Mat Z[ ], A(求める桁数), F(計算項数), K(Baseの桁数)
================
K-1→C
1→J:1→S:1→T:0→R
Mat Z[F+J]→P
Do
Int(P÷10^C)→C
10R+Q→R
P-(10^C)Q→R
If C:Then
C-1→C
Else
Isz J:Mat Z[F+J]→P
K-1→C:IfEnd
S-1→S:Isz T
If T>A+1:Then
(10^S)R→R:R◢
Break:IfEnd
If S<1:Then R◢
0→R:10→S:IfEnd
LpWhile 1
“”
Locate 20-S,7,”]▲”
Locate 18-S-Int(log(A)),7,”[“
Locate 19-S-Int(log(A),7,A
================
// fx-9860GII用 PICALC4(改)
// =========================
ClrMat Z // 配列領域解放
"Digits"?→A // 求める桁数
"Base"?→K // 結果変数1個の桁数
10^K→B // 結果変数1個を切り出す倍数
Int (K÷log 2)→E // 計算精度得るための計算数
Int (A÷log 2)+1→F◢ // 計算項数
Int (A÷K)+1→H // 結果格納配列数
Int ((F-1)÷E)+1-H→L // 実際のループ回数との誤差
H+L◢ // 実際の結果格納配列数
F+H+L◢ // 実際の全配列数
F→N // ループで使用する計算項数
{F+H+L,1}→Dim Mat Z // 配列領域確保
"EXE To Go"? // ここから時間測定開始
ClrText
For 1→I To N
Locate 2,1," "
Locate 1,1,I
Int(B÷5)→Mat Z[I,1]
Next
0→C:1→I
Do
Locate 2,1," "
Locate 1,1,N
0→T
For N-1→J To 1 Step -1
Locate 2,2," "
Locate 1,2,J
2J-1→D
TJ+BMat Z[J,1]→W
Int (W÷D)→T
W-DT→Mat Z[J,1]
Next
Int (T÷B)→W
C+W→Mat Z[F+I,1]
T-BW→C
Isz I:N-E→N
LpWhile N>0
“DISP MODE”
“0 Or 1:”?→M
ClrText
If M:Then
Prog “PIDISP”
Else
For 1→I To H // 計算結果表示
Mat Z[F+I]◢ // 一回目の表示で測定終了
Next
""
Locate 1,4,"LAST DIGIT:" // 最終行再表示抑制
Locate 12,4,KH-1
IfEnd
ClrMat Z // 配列領域解放
// =========================
やす様、みなさま、こんにちは!
桁数整形はfx-9860GIIでは文字列処理で自由に表示できるはずなのですが、数字から文字列への変換コマンドが装備されていないっぽいので文字列処理でというわけにも簡単にいかないですよね(^^;
ってことで、
やす様の10桁整形プログラムを多桁で高速化改造しようとしててロジックがわけわかめになってしまったので(汗)
結局、自分のPICALCOUTのループ内を最適化したりで2割ほど高速化しました。
fx-5800Pでも10桁あたり1秒以内でいけると思います。
高速版
fx-9860GII版 "PICALOUT"
----------------------------------------
For 1→I To Int((A+9)÷10) //
0→P // 計算結果
10→N // 10桁のうち変換残り桁数
10(I-1)+10-N+M→C // C桁目を変換
Int(C÷K)+1-M→J // C桁目の存在する配列インデックスJ
(J-1+M)K→Q //結果配列ではQ桁目
While N>0 // 10桁変換できるまでループ
K-C+Q→W //使える桁数W
Isz J:J>H=>Break //配列アクセスエラー回避
Mat Z[F+J,1]→T // Z[F+J]→T (fx-5800P)
T-Int (T/(10^W)(10^W→R
W→D
D>N=>N→D
N-D→N // 残り桁数
P+Int (R/(10^(W-D))(10^N→P
C+D→C // 現在の桁
Q+K→Q // 結果配列の先頭桁
WhileEnd
P◢ // 10桁ずつ計算結果表示
Next
“”
Locate 20-S,7,”]▲”
Locate 18-S-Int(log(A)),7,”[“
Locate 19-S-Int(log(A),7,A
----------------------------------------
最後に、やす様の桁指示ルーチンそのまま追加しました(^^)
まだ最適化&高速化の余地はあるはずですが、すでに何をどう処理してるのかわからなくなりつつあるので、このあたりで打ち止めにしておきます(^^;
やす様、PICALC4(改)ですが、この部分が、前回そのままです(^^;
---------------------
Do
Int(P÷10^(C))→Q // →Cではなくて→Q
10R+Q→R // ここは大丈夫
P-10^(C)Q→P // →Rではなくて→P
---------------------
要のロジックなのでここが違うと全然動きませんです(^^;
というところで、最新版のCasioBasic版をまとめてアップしました。
CasioBasic版PICALC その2
やす様バージョンをPICALC4Aとして入れておきました(^^)
(PICALOUTとPIDISPが後で再び表示できるように配列をクリアしないようにしています)
PICAL B ほぼオリジナル版 100桁(10桁)2分38秒
PICAL1B ほぼオリジナル独自最適化版 100桁(9桁)1分44秒
PICAL2B やす様PICALC2独自最適化版 100桁(6桁)1分19秒
PICAL4A やす様PICALC4(改) 100桁(6桁)1分19秒
時間はfx-9860GIIのノーマルでの結果です。
sentaro様
訂正ありがとうございます。
うっかり者のやすです(^^;
まとめて頂き、さらにありがとうございます。
やす様、どもです!
うっかりなところは私も同じです(^^;
ってことで、私の方も修正です。
----------------------------------------
Locate 20-N,7,”]▲”
Locate 18-N-Int(log(A)),7,”[“
Locate 19-N-Int(log(A),7,A
----------------------------------------
PIDISPでの変数SはPICALOUTだと変数Nでした。
季節の変わり目か、痙攣が時々強くなり、体調不良が続いていました。
プチコンの配列問題。開発元のメールフォームからといわせたところ、無回答でした。どうやら、公式解説本を読めの意思表示なんでしょうか。(;´д`)」
藤堂様、こんにちは!
ここの所、突然に寒くなったりと異常な気象状況が続いてますよね。
>プチコンの配列問題。開発元のメールフォームからといわせたところ、無回答でした。どうやら、公式解説本を読めの意思表示なんでしょうか。(;´д`)」
最初の回答以上の回答が来ないということは…プチコンの配列はバグあり??
最初の、
3DS_PI_CALC.txt
このプログラムは一応動作したことから配列問題は起きてなかったと思われるのですけど、
こっちはどうでしょうか?
3DS_PI_CALC1.txt
3DS_PI_CALC1は、バッチリ動作しました。桁数を7ないし8にして、100桁は1秒以内、1000桁で約4秒。10000桁で約4分21秒でした。
1000万桁はK=10以上で計算をはじめます。それ以下だと、メモリ不足のエラーが出ます。ただし、単純計算で5万時間かかるようなので、やめました・
Sentaro様
計算に成功したプログラムソースを含めて、私のブログでご紹介してもよろしいでしょうか、
藤堂様、こんにちは!
プチコン版、おつかれさまです!
3DS_PI_CALC1は無事動いたのですね(^^)
それにしても、1000桁で4秒とはプチコン3号、さすがに速いです!
桁数が7桁、8桁での結果ということなので10桁で計算するとさらに速くなる余地がありますね(^^)
3DS_PI_CALC1.txtと同じバージョンのプログラムは、
HP Primeが1000桁で118秒ほどかかりますし、
TI Nspire CXはLuaでも10秒ほどなのでプチコンがまだ速いです。
fx-9860GIIならばCasioBasicでは思いっきりオーバークロックしても100桁でやっと10秒という感じなので1000桁だと2桁以上違います(^^;
Cでのアドインならばノーマル29MHzで1000桁で5秒くらいなのでやっとプチコンと勝負できます(^^)
>計算に成功したプログラムソースを含めて、私のブログでご紹介してもよろしいでしょうか、
はい!無事動いたということなのでぜひぜひよろしくです(^^)
あとは、配列問題が起きたこのプログラムが動けば…とりあえずプチコン版は一段落ですね(^^)
3DS_PI_CALC2.txt
ってことで、CasioBasic版とアドイン版、
fx-9860GII/CG10 CasioBasic版PICALC その2
fx-9860GII アドイン版 PpicalcFX2b
CasioBasic版に準拠したHP Prime版もアップしておきます。
桁数入力を追加しました。
爆速のPrimeといえどもそれなりに計算時間がかかるのでデフォルトは100桁です(^^;
100桁計算時間 1000桁
HP Prime版 PICAL B(8桁) 2.1秒 180秒
HP Prime版 PICAL1B(7桁) 1.4秒 118秒
HP Prime版 PICAL2B(6桁) 0.9秒 80秒
この部分のNEXTで、NEXTに対するForがないのエラーがでました。
《
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
N=N-E
NEXT
》
藤堂様、こんにちは!
>この部分のNEXTで、NEXTに対するForがないのエラーがでました。
プログラム全体でFOR~NEXTが3つありますが、FORとNEXTがそれぞれ対応しているか確認してみてください。
配列エラーが出なければそれでだいじょうぶだと思います(^^)
FOR I=1 TO F // 1つ目のFOR
Z[I]=FLOOR(B/5)
NEXT //1つ目のFORに対するNEXT
N=F
C=0
FOR I=1 TO H // 2つ目のFOR
LOCATE 1,1:PRINT N
T=0
FOR J=N-1 TO 1 STEP -1 // 3つ目のFOR
D=2*J-1
W=T*J+Z[J]*B
T=FLOOR(W/D)
Z[J]=W-T*D
NEXT //3つ目のFORに対するNEXT
W=FLOOR(T/B)
A0[I]=C+W
C=T-W*B
N=N-E
NEXT //2つ目のFORに対するNEXT
ソースを見直したところ、一部誤入力がありました。申し訳ありません。
1000桁 K=8で、約2秒ではじき出しました。K=10にすると、答えが一部おかしくなり、9の連続になります。
10000桁 K=8 では2分27秒でした。
付記
K=8以上の答えが違って出力されます。
8の場合
3.1415926535897932384628433832795
から先の数値が違っています。ソースの誤入力がないか調べてみます。
K=7にしても、1000桁は2秒でした。
藤堂様、こんにちは!
やっとこ上手く動作したのですね!おつかれさまでした!
これでプチコン版も3バージョンともに動作できたことになりますね(^^)
しかし、1000桁、2秒というのはやっぱり速いです。
10000桁でも2分台となるというのがすごすぎますね。
fx-9860GIIのCのアドイン版では整数演算1000桁(4桁)で2秒程度なのでかなりいい勝負ですが、実数で計算すると1000桁(7桁)で30秒以上かかるので、プチコンがFPU標準装備なのはすごく大きいです。
>K=8以上の答えが違って出力されます。
Spigotアルゴリズム版なので、途中計算でBASEの倍の桁数が必要になるので、変数の有効精度の半分以下にしないと正しく計算できないようです。
プチコンだと倍精度15桁だと思われるので7桁以下でないと正常な計算ができないということですね。
10桁にすると計算は若干速くなります。ただ、おっしゃるとおり精度の関係で、うまく出ませんでした。
使った3DSは、New3DSLLです。ここまで早いと、子どもが遊ぶゲーム機となめてかかっては損をします。
プチコンをきっかけに、プログラム関数電卓の人気に火がつけばいいですね。
藤堂様、こんにちは!
使われた3DSはNew3DSLLだったのですね。
4コアARM-266MHzの高機能電卓を軽く越えるパワーを目の当たりにするとなんかちょっと物欲が沸いてきます(笑)
HP PrimeやNspireCXとは液晶の解像度が同じでタッチパネル内蔵なのでHP PrimeやNspireCXの電卓ソフトがそのままアプリとして移植できそうな感じですし、3D表示も3Dグラフとかで上手く活用できれば、ゲーム機だけにしておくにはもったいないハードですね(^^)
皆様、お晩です ! 今ではすっかり「部外者」となってしまいました ... 。
やす様は、お仕事の方があって、こちらの方へのポストが止まっている様です (sentaro様は御存知かな ?)。
現在は3DS・プチコンBASICでの話題という事で進んでいる様で何よりですが、当方、持っていないし、ついて行けないのヨ ... 。
それは「言い訳」なので、皆様、思う存分、議論を深めて行って戴き度。
sentaro 様、藤堂様のレポートに刺激を受けて、New3DS LL を !?
藤堂様、New3DS LL+プチコンのパワーというのは、かなり凄そうですね !
CPUパワーとグラフィクスの両方が欲しいネタを探している所で、近々、投稿できたらイイなぁ、と思っております。当てにせず、お待ち戴き度 !
皆様
すみません、すっかり沈んでおります。
仕事で社内用途の計測制御ソフトを作るハメになっており、それも片手間仕事を要求されているもんですから、電卓を触る暇がなく...
今日はCRCチェックルーチンを作っています。10年ぶり(13年ぶり?)でVisual C++ の開発環境をインストール( VS 2013 Communityと言うフリーで有りながら、リソースエディタが使えるという有り難~いもの)し、ボチボチとやっています。
以前だと頭の中が同時進行だったのですが、今やすっかりシングルタスク状態で、それも色々と捜し物をしながらウロウロしている状況です。
昔作り込んだルーチンを使えば良いので、単純なバグだけ気をつければ良いのですが、嫌になるくらいコンパイルやビルドでエラーが...(^^;)
通信系は、新しいWin8.1に慣れないとどうにもならないです...(>_<)
..といった状況なので、ご容赦を...
皆様にヘルプです
上で Visual Studio 2013 Community と言う開発環境をインストールしたと申しました。
実は、これで1つ困ったことが起きており、皆様に相談させてください。
Lotus Organizer 2001 と言う大昔のオーガナイザーソフトを長年使っており、ナント Win8.1でも動作してくれるので、いまだに使っております。
そもそも、これが無茶な話しなんですが、動くのですよ(^^;)
で...上記の VS 2013 Community をインストールしたら、Lotus Organizer 2001 が起動できなくなった、と言う事件が起こりました。
試しに、VS 2013 Community をアンインストールするとOrganizer 2001は正常動作するんですね。
なので、Organizerが動かなくなる理由としては、WindowsやSystemフォルダなどにある DLL が書き換えられてしまうか、パスが通らなくなってしまうか...そんな感じのシステム側に原因がありそうです。
この解決方法をご存じならば、教えて欲しいと言うところですが、こんな特殊な事例は先ず経験なさった方は少ないでしょう。
そこで教えて頂きたいのは、Lotus Organizer に匹敵する他のソフトウェアに、何か良いものがあるかどうか? なんです。
当方としては、主にメモ機能を使い、パスワードプロテクトをかけられることが必須なのです。
幾つか調べて試してみたところ、期待した動作をしない(つまり使いづらい)ものや、パスワードプロテクトの無いものばかりです。
場違いかも知れませんが...よろしく御願い致します。
New3DSは、ゲーム専用機にしておくのはもったない性能です。自分で作ったプログラムを走らせられるのは、今のところプチコンです。
それでも、かなり使えて高速な動きをします。
取りあえず、ポケコンの説明書を元に二次元配列で簡単な表を作った程度です。
akatuki様、こんにちは!
akatuki様のオリジナル移植版から、やす様のSpigotアルゴリズム移植版まで、この興味深い円周率計算プログラムがひと月以上の興味の対象になったのはakatuki様によってHP Primeに移植されていたからなのですごく感謝してますm(_ _)m
>やす様は、お仕事の方があって、こちらの方へのポストが止まっている様です (sentaro様は御存知かな ?)。
昨日やす様の書き込みで知りましたです(^^)
>藤堂様のレポートに刺激を受けて、New3DS LL を !?
はい!
BASICなのに電卓でのマシン語レベル同等以上に速いとは想像を超えました。FPUを持っているのもなんか惹かれるものがありますね。
>CPUパワーとグラフィクスの両方が欲しいネタを探している所で、
ぉお!?楽しみにお待ちしてます!(^^)
やす様、こんにちは!
私はWin環境プログラミングは実験用程度にいじってただけでまともなプログラムを作った経験がないのでさっぱりだったりするのですけど(汗)10年ぶりの計測制御ソフト、Win8.1対応はかなり大変そうですね。
visual studio 2013 communityってなんぞや?ってちょこっと調べてみると、Proレベルがフリーになっていたなんて…
元々は計算機であるパソコンももっとしっかりCPUレベルで使い倒さないといけないなぁとちょこっと反省モードです(^^;
>そこで教えて頂きたいのは、Lotus Organizer に匹敵する他のソフトウェアに、何か良いものがあるかどうか? なんです。
MS純正OutlookならパスワードOkでデータがそのまま引き継げるみたいですけど、どうでしょうか?
藤堂様、こんにちは!
プチコンは最初のプチコン1号が出た時から気にはなっていたのですけど、固定小数点だけで実数が扱えないとか微妙な仕様にひっかかってたところ、プチコン3号では普通に数値計算プログラムも書けるように進化しているというのがポイント高いです。
そして、なんといっても携帯マシンで昔懐かしBASICで爆速というのがポイント高すぎますね(^^)
やす様、オバンです、いや、オヤジです。
> そもそも、これが無茶な話しなんですが、動くのですよ(^^;)
いや、これは驚いた ! MSも結構頑張っているのですね !
あるいは、Lotusが後々まで使える、ホントに良い物を作ったからなのか !?
> Lotus Organizer に匹敵する他のソフトウェアに、何か良いものがあるかどうか?
ウーム。こういったツールを使った事がないので、何とも。
PIMの簡単なモノならAndroidにもあるのでしょうが、やす様の書き溜めたOrganizerのデータ、ドキュメントをポートするには、少々荷が重い様にも思われます。そもそも、AndroidではPCの様にキーボードがありませんし、クラウドにドキュメントを置くとなると、パスワードも無意味 ... 。
使い慣れたツールが使えなくなる(正確には、制限が付いてしまった、という所ですが)のは、キツイです。
お力になれず、申し訳ない。
藤堂様、オバンです、いや、オヤジです。
3DS+プチコン、パワーがあるのは羨ましい所であります。
タッチパネルもあり、自由度の高いI/Fも構築できそうです。
そんな3DSでも楽しめそうな話題を模索しております。何かありませんかネ ? (弱気 ...)
sentaro様、オバンです、いや、オヤジです。
> はい!
> BASICなのに電卓でのマシン語レベル同等以上に速いとは想像を超えました。FPUを持っているのもなんか惹かれるものがありますね。
いやぁ、参りました !
プチコンの仕様とか見たわけではないのですが、ハッカブルだったりして !?
> ぉお!?楽しみにお待ちしてます!(^^)
あ、余り期待されても ... 。
久しぶりのコメント入力、今回は「交通標識を選べ」という、知能テストの様なものが出ておりました。何を考えておるのか、Google ...。
Miiverseのプチコンコミュでは、CADもどきを作っていた方がいました。
ゲーム機だから、ゲームを作る、プログラムランチャ(OSもどき)が主流のようです。
akatuki様、こんばんは!
new3DSLLをamazonで欲しいものリストに入れてたら、HP50GがJulyさんから\14900で出てるのを発見!
10点在庫ありのところで見たのですが見るたびに在庫減ってたので、ついにポチっと…(^^;
HP Primeは相変わらずの在庫なしなんですけど、何かあるんでしょうかね。
>久しぶりのコメント入力、今回は「交通標識を選べ」という、知能テストの様なものが出ておりました。何を考えておるのか、Google ...。
ワインにお寿司にハンバーガーにケーキと出たことありましたけど、交通標識はまだ見かけたことがないです(^^;
藤堂様、こんにちは!
Miiverse見るとプチコンユーザーパワーをすごく感じますね(^^)
前に見た時はCP/Mを移植していた方がいたような…で、ほとんど昔のパソコンのマシン語レベルのソフトがBASICで動くのがびっくりです。
藤堂 様、こんばんは!
> Miiverseのプチコンコミュでは、CADもどきを作っていた方がいました。
> ゲーム機だから、ゲームを作る、プログラムランチャ(OSもどき)が主流のようです。
プチコンでは、かなり高度な事ができる様ですね。
プチコンBASICの仕様で、スタックとか扱えるのでしょうか。いや、少し気になったもので ... 。
Sentaro 様、こんばんは!
> new3DSLLをamazonで欲しいものリストに入れてたら、HP50GがJulyさんから\14900で出てるのを発見!
> 10点在庫ありのところで見たのですが見るたびに在庫減ってたので、ついにポチっと…(^^;
アッー、ポチりましたか !?
今、見ましたら、16800円になっていて、在庫4つ、とか。イイ買い物になると良いのですが ... 。
> HP Primeは相変わらずの在庫なしなんですけど、何かあるんでしょうかね。
ウーン。
「50Gの扱いが再び」という事で、Primeの方も少し前向きに考えましょうか。青い50Gなんてのもありますし ... 。
akatuki様、こんばんは!
>アッー、ポチりましたか !?
>今、見ましたら、16800円になっていて、在庫4つ、とか。イイ買い物になると良いのですが ... 。
今、見たら在庫3でまた14900に戻ってますね(^^)
で、今日届いたのですけど、なにやらすごい新鮮な感じがするのはスタック処理が基本になっているからでしょうかね(^^;
PDFの日本語ユーザーズガイドがちょうどRPLのところで省略されているのが惜しいですけど、[ON]+[F4]の本体テストモードも無事通ったので一安心です。
キーの押した感はHP Primeよりは硬めという感じはありますね。
とりあえず、すぐに使えるという電卓ではないのでじっくり攻めてみます(^^)
Sentaro 様、こんばんは!
> 今、見たら在庫3でまた14900に戻ってますね(^^)
最近は扱いが無かったからなのか、かなり速いペースで売れている様です。もう2個になっておりました。Sentaro様、これは「運命の出会い」ですヨ。
> で、今日届いたのですけど、なにやらすごい新鮮な感じがするのはスタック処理が基本になっているからでしょうかね(^^;
もう届きましたか !
画面デザインはインジケータ表示が多く、そこがカッコいい。
そこでスタックにデータを置いて操作する、という感じですから、病みつきになる人も多いのです。
50Gのスタックは深さがメモリ上限なので、バンバンとデータを保持しておけます。そんな事で、ついついEnterキーでデータの複製を保存していると、いつしかスタック上に200個のデータが溜まったりとかしている ... 。
> PDFの日本語ユーザーズガイドがちょうどRPLのところで省略されているのが惜しいですけど、[ON]+[F4]の本体テストモードも無事通ったので一安心です。
英文クイックガイドの翻訳らしいので、そこから先は英文のPDFを読め、という具合です。
なので、当方もヒーヒー言いながら読んだりするのですが、なかなか身につかない ... 。
> とりあえず、すぐに使えるという電卓ではないのでじっくり攻めてみます(^^)
当方も未だに使いこなしていないのでエラそうな事は言えませんが、結構「重量級」の画面デザインですネ。
安くなったとは言え、高機能電卓ですから「機能満載」、じっくり攻めるのがオモシロイのです !
プチコンのスタックは公式ページ、書籍にも書かれないいません。擬似的なものは作れるかもしれませんね。
akatuki様、こんばんは!
>最近は扱いが無かったからなのか、かなり速いペースで売れている様です。もう2個になっておりました。Sentaro様、これは「運命の出会い」ですヨ。
普段なら見逃してたかもだったのでまさに「運命の出会い」だったのですね(^^)
その運命のHP50Gですが、関数電卓としての機能確認はそこそこに早速にRPLをかじってます(^^;
>画面デザインはインジケータ表示が多く、そこがカッコいい。
>そこでスタックにデータを置いて操作する、という感じですから、病みつきになる人も多いのです。
なんでもかんでもスタックに積んでというこの仕組みはCPU動作的に考えると普通に分かりやすいですね。
SysRPLのキー入力で「@」や「%」など、どこから入力するのかしばらく悩んでしまいましたけど、ALPHAと左右シフトの組み合わせでいけると分かればその先はとんとん拍子に、akatuki様の”SysRPLを始めようと思っている人のために”はわかりやすくてすぐに出来ました(^^)
RPLに関してはマニュアルが英文しかないので必要なところから少しずつという感じですが、SysRPLのマシン語よりも難解になっているんじゃないかという言語構造は妙にツボにはまりそうです。
>結構「重量級」の画面デザインですネ。
はい!
アナログ時計表示まで出来るのにはちょっとびっくりでしたけどこの情報が詰まった感じはまさに「重量級」です(^^)
最初からハードの深いところまでいじれることも含めて使いこなせた時の満足度はHP Primeよりも高そうな感じしますね。
それと、最近の高機能電卓としては珍しく音が出るので、なんかポケコンっぽい感じがよいです(^^)
Sentaro 様、こんばんは!
> 普段なら見逃してたかもだったのでまさに「運命の出会い」だったのですね(^^)
> その運命のHP50Gですが、関数電卓としての機能確認はそこそこに早速にRPLをかじってます(^^;
いいですね !
数式を定義する機能があるのですが、実体としてはプログラムを構成していたりします。
'f(X)=X^2-3*X' DEFINE とでもやって見て下さい。カレント・ディレクトリに「f」という名前のプログラムが作られます。結構UserRPLのプログラムは基本要件としてあちこちに顔を出しているので、より深い活用が出来るのです。
> SysRPLのキー入力で「@」や「%」など、どこから入力するのかしばらく悩んでしまいましたけど、ALPHAと左右シフトの組み合わせでいけると分かればその先はとんとん拍子に、
[EVAL]キーの[CHARS](右シフト)も結構便利ですが、こればかり使っているので、キー配置を忘れてしまうのです。
> akatuki様の”SysRPLを始めようと思っている人のために”はわかりやすくてすぐに出来ました(^^)
恐れ入ります。
少ししたら、SysRPLについての短いメモ記事をポストする予定ですので、お楽しみ ?
> RPLに関してはマニュアルが英文しかないので必要なところから少しずつという感じですが、SysRPLのマシン語よりも難解になっているんじゃないかという言語構造は妙にツボにはまりそうです。
ウーム ... 。
> 最初からハードの深いところまでいじれることも含めて使いこなせた時の満足度はHP Primeよりも高そうな感じしますね。
それ、確かに !
今の所、HP Primeではシステム・ハッカブルなAPIがないので、50Gが未だオモシロイ所があるのだと。そこで青箱50Gが出た、となると ... ?
> それと、最近の高機能電卓としては珍しく音が出るので、なんかポケコンっぽい感じがよいです(^^)
あっ、そうでした !「音出し」、Primeにはありませんでしたネ。
BEEPとWAITを連ねて、簡単な音楽とか演奏できました。その昔、ポケコンの雑誌にMMLをUserRPLに変換するプログラム「Beep郎」という記事が掲載されているのを見ました(当時は48SX向け)。原理的には同じ事が出来るのだと思いますが、MMLを書くのも大変だし、変換プログラムも面倒だったり ... 。
akatuki様、こんばんは!
>'f(X)=X^2-3*X' DEFINE とでもやって見て下さい。カレント・ディレクトリに「f」という名前のプログラムが作られます。結構UserRPLのプログラムは基本要件としてあちこちに顔を出しているので、より深い活用が出来るのです。
DEFINE、目から鱗です。
最初にRPLプログラムのファイルへの保存はどうやるの?っていう素朴な疑問があったんですけど、全部そのままファイルとして保存されているのですよね。
ファイルマネージャがあってちゃんとファイルとして管理されているのが見えるので分かりやすいです。
>[EVAL]キーの[CHARS](右シフト)も結構便利ですが、こればかり使っているので、キー配置を忘れてしまうのです。
うわ、CHARS…こんなのところにキャラクタ一覧が、って気が付いてませんでした(^^;
そういえば、HP PrimeにもCharsっていうのがありますが、滅多に使ってなかったのですっかり忘れてました。
>少ししたら、SysRPLについての短いメモ記事をポストする予定ですので、お楽しみ ?
おお!SysRPLは知れば知るほどに何でも出来そうなのと引き換えに敷居もかなり高いので、楽しみにお待ちしております!(^^)
>今の所、HP Primeではシステム・ハッカブルなAPIがないので、50Gが未だオモシロイ所があるのだと。そこで青箱50Gが出た、となると ... ?
この一年でCASIOからTIからHPと高機能電卓に一通り触れてきましたけど、50Gはかなりいじりがいがあるというか、迷宮探索みたいなところも多々ありますけど、触れば触るほどに面白いです(^^)
Sentaro 様、こんばんは!
> おお!SysRPLは知れば知るほどに何でも出来そうなのと引き換えに敷居もかなり高いので、楽しみにお待ちしております!(^^)
いえね、当方、ゴニョゴニョとやっておりましたら、とんでもない事になっておりまして、今日一日、青い顔になっておりました。その辺りの顛末も含めて書く予定なので、もう少しお待ちを !
> この一年でCASIOからTIからHPと高機能電卓に一通り触れてきましたけど、50Gはかなりいじりがいがあるというか、迷宮探索みたいなところも多々ありますけど、触れば触るほどに面白いです(^^)
User/SysRPLがとても面白くHPGCCもあって、盛り沢山であります !
もちろん、普通の「高機能電卓」としても面白いので、是非、御活用され度 !
hpgcc に思わず反応(^。^;)
やす 様、こんばんは !
> hpgcc に思わず反応(^。^;)
やす 様も、どうでしょうか、HP50G。
当方はFord氏のHPGCC2で満足していて、HPGCCの新しい方(HPGCC3)は未だ試して居らんのですが、結構面白そう ?
それに、RPL自体が面白いものですから、ちょっと浮気しても ?
やす様、こんにちは!
>hpgcc に思わず反応(^。^;)
ぉぉお?!
akatuki様、こんばんは!
Win上でいけるHPGCC2はとりあえずサンプルをビルドしてドライストンが94000ほど出るのを確認しましたが、今のところはまだそこまでです(^^;
HPGCC3はubuntu環境が要るみたいなのでとりあえずHPGCC2で一通り出来てからになりそうです(^^;
Sentaro 様、こんばんは!
> Win上でいけるHPGCC2はとりあえずサンプルをビルドしてドライストンが94000ほど出るのを確認しましたが、今のところはまだそこまでです(^^;
いや、もう試したのですか !
当方、最近になって使えるようになったので、何かやってみようと思っている所です。
> HPGCC3はubuntu環境が要るみたいなのでとりあえずHPGCC2で一通り出来てからになりそうです(^^;
ありゃ、そうだったの ?
HPGCC3のWin版が無いとなると、まだまだ2の出番がありそうですネ。
akatuki様、こんばんは!
>いや、もう試したのですか !
>当方、最近になって使えるようになったので、何かやってみようと思っている所です。
ドライストンも含めてサンプルがいくつかあったのでそれをビルドして転送して実行したら一発で上手くいったという感じです。
上手く行き過ぎてその後はまだ手付かずなのですが(^^;このトピック的に円周率プログラムのHPGCC2版はすんなりいけそうですね(^^)
>ありゃ、そうだったの ?
>HPGCC3のWin版が無いとなると、まだまだ2の出番がありそうですネ。
akatuki様の過去記事にもHPGCC3ネタがちょこっとありましたけど、本体のflash書き換えも必要みたいなのでちょい敷居高い感じはありますね。
HPGCC3でないと出来ないことがあれば…ですけど、まずはHPGCC2からです(^^)
Sentaro 様、こんばんは ! 連休も真夜中の...、いや、このフレーズはやめておきましょう。
> ドライストンも含めてサンプルがいくつかあったのでそれをビルドして転送して実行したら一発で上手くいったという感じです。
> 上手く行き過ぎてその後はまだ手付かずなのですが(^^;このトピック的に円周率プログラムのHPGCC2版はすんなりいけそうですね(^^)
確か、Ford氏版のHPGCC2には「円周率計算」(半端ない桁数を計算させているらしい)も入っていたので、当方としては二番煎じとなりそうな気がして居り。
> akatuki様の過去記事にもHPGCC3ネタがちょこっとありましたけど、本体のflash書き換えも必要みたいなのでちょい敷居高い感じはありますね。
ありゃ。HPGCC2の方で十分満足してしまったので、3の方は追っかけて居なかったのですが、カスタムFlash書き換えでしたか ... 。
まあ、それが面白いのかも知れませんが、チョットクルシイです。
> HPGCC3でないと出来ないことがあれば…ですけど、まずはHPGCC2からです(^^)
HPGCC2ではシリアル(だったかな ?)が使えないとかいう話があったらしいのですが、それでも色々と出来るみたいです。
面白いのは、乱数の上限 RAND_MAXが(signed) int ではなくunsigned intだったり、とか。HPGCC2も、結構面白い !
HPGCC2で十分慣れてから、3へ行っても遅くありません !
お久しぶりです。
体調が不安定続きで、ゆううつでした。プチコン3号での計算、私のブログで紹介しました。
http://nanzocamera1.cocolog-nifty.com/blog/2015/05/post-08f7.html
お気づきの点があれば、指摘下さい。
akatuki様、こんばんは!
>確か、Ford氏版のHPGCC2には「円周率計算」(半端ない桁数を計算させているらしい)も入っていたので、当方としては二番煎じとなりそうな気がして居り。
こちらのHPGCC2のサイトにサンプルとして円周率計算プログラムがありました。
http://sense.net/~egan/hpgcc/
ので、HPGCC2版はとりあえず後回しでSysRPL版をなんとか移植してみたいです(^^)
藤堂様、こんにちは!
プチコン3号での円周率計算記事、拝見させていただきました。
プチコン画面写真を見ると、昔の8ビットパソコンそっくりですね(^^)
これが爆速で動くのがなんとも魅力的です。
で、最終出力がどういう感じになるのかわからなかったのですけど、1行50文字できっちりスペース無しで表示されるのですね。
となると、計算結果の上位の桁がゼロになってしまう場合はそれが表示されないで桁が詰まってしまうのでゼロで埋められないかとプチコン3号の命令表を見たらちょうどFORMAT$という書式整形が出来る命令があったのでこれを使って出力の部分を変更してみます。
最初のプログラム
---------------------------
CLS // 計算結果表示
PRINT "PI=3." // ←変更箇所 ;を削除して改行。
FOR I=2 TO H
PRINT FORMAT$("%0"+STR$(K)+".0F",Z[I]); // ←変更箇所 先頭をゼロ埋め。
NEXT
---------------------------
後のプログラム
---------------------------
PRINT "PI=" // ←変更箇所 ;を削除して改行。
FOR I=1 TO H
PRINT FORMAT$("%0"+STR$(K)+".0F",A0[I]); // ←変更箇所 先頭をゼロ埋め。
NEXT
---------------------------
藤堂 様、お疲れ様です。
> 体調が不安定続きで、ゆううつでした。
当方も、なかなか気分が晴れず。準備中のネタですが、簡単なネタのつもりが、なかなか公開出来ず、申し訳ない。
> お気づきの点があれば、指摘下さい。
ここの記事は、やす様、Sentaro様にお願い、と思っておりましたら、Sentaro様からは既にお返事を戴いておりますね。
やす様はお仕事の方で気が抜けない模様、もう少し掛かるかも知れず、焦らずにお待ち戴き度。
追加の情報ありがとうございました。従来は、PRINT USING。プチコンは、FORMAT$。3桁区切りがないのは、事務用・一般用に使うことはないだろうとの考えなのでしょうか。
天気が不安定だと、気分が乗らなくて。(;´д`)
藤堂様、こんにちは!
早速にブログに反映していただきましてありがとうございます(^^)
プチコン3号の命令仕様を見ていると、ところどころでC言語仕様になっているところがありますけど、3桁区切りは自分でプログラミングせよということでしょうかね(^^;
akatuki様、こんばんは!
>当方、色々と調べておりましたら、自分はまだまだSysRPLの初心者だったと再認識しており、なかなか歩みが遅いので、Sentaro様にお願いしちゃおうかな ... 。
akatuki様が初心者でしたら私は超初心者というところなのでまだまだです。っていうか、配列をどうアクセスするのかという超初歩的なところでちょっとつまづいてたりします(^^;
まずはUserRPLの場合ですけど、配列はリストをスタックに展開してそれを個別にアクセスという感じになるのでしょうか?
他の言語のようにA[2]とかでは出来なさそうですよね?
ここが突破できればあとはなんとかなりそうな気がしてるところなのですけど…(^^;
Sentaro 様、こんばんは!
> 配列をどうアクセスするのかという超初歩的なところでちょっとつまづいてたりします(^^;
> まずはUserRPLの場合ですけど、配列はリストをスタックに展開してそれを個別にアクセスという感じになるのでしょうか?
> 他の言語のようにA[2]とかでは出来なさそうですよね?
いやいや、どうも。当方も、この辺りあやふやなもので、AUR (AUH ; Advanced Function Handbookではなく、Referenceでした。申し訳ない!)を見たのですが、GETで配列要素を取り出せますネ。スタックに置くオペランドは配列そのものでも、配列を収蔵した変数名(シングルクォートで括ります)でもOKでした。
'M' { 1 2 } GET
の様に。(Mは行列を収蔵しているので、行、列の指定でリストを使用)
詳しくはAURなどを御山椒戴き度。
> ここが突破できればあとはなんとかなりそうな気がしてるところなのですけど…(^^;
SysRPLの方は未だ調べておりませんで、これは当方への「宿題」として、後ほど。
akatuki様、こんばんは!
>GETで配列要素を取り出せますネ。スタックに置くオペランドは配列そのものでも、配列を収蔵した変数名(シングルクォートで括ります)でもOKでした。
配列要素のアクセスはGETで出来るんですね!すごく助かりました(^^)
早速にAURを見てGETとPUTで配列読み書きができるってことで、
3DS版のBASICソース3DS_PI_CALC1.txtからUserRPL版への移植版です。
桁数とBASEをスタックに置いてPICALCで計算です。
------------------------------------------------
%%HP: T(3)A(R)F(.);
\<<
0 0 0 0 0 0 0 0 0 \-> A K b f h j c g n t w
\<<
TICKS
A 3 DISP
K 4 DISP
10 K ^ 'b' STO
A 2 LOG / IP 'f' STO f 5 DISP
A K + 1 - K / 1 + IP 'h' STO
1 h FOR j 1 NEXT h \->LIST 'arry' STO
f 1 FOR n
n 6 DISP
n n + 1 + 'g' STO
0 'c' STO
1 h FOR j
arry j GET n * c b * + 't' STO
t g / IP 'w' STO
t w g * - 'c' STO
arry j w PUT 'arry' STO
NEXT
arry 1 DUP2 GET 2 + PUT 'arry' STO
1 NEG STEP
0 'c' STO
h 1 FOR j
arry j GET c + 'w' STO
w b / IP 'c' STO
arry j w c b * - PUT 'arry' STO
1 NEG STEP
TICKS SWAP - B\->R 8192 /
\>>
arry
\>>
'PICALC' STO
------------------------------------------------
100桁(BASE8桁)での結果は3分49秒でした。
スタックを駆使することなく変数アクセスでのベタ移植なのでUserRPLでも速度はまだまだ詰められるかもしれません(^^;
Sentaro様
ゲームの得点表示に3桁区切りはいらないから省いたんでしょうね。
プチコンの命令、一部Cを意識した記述もありますね。
Sentaro様のソースを、他のプチコンユーザにも試してもらいために、2秒で計算したソースを、Miiveseのプチコンコミュに掲載いたしました。
Sentaro 様、こんばんは!
> 早速にAURを見てGETとPUTで配列読み書きができるってことで、
> 3DS版のBASICソース3DS_PI_CALC1.txtからUserRPL版への移植版です。
ウーム、やりますネ。お疲れ様です !
> スタックを駆使することなく変数アクセスでのベタ移植なのでUserRPLでも速度はまだまだ詰められるかもしれません(^^;
うーん、どうなんじゃろ ?
変数に配列を「保存する」と書いたのですが、実体としては変数名シンボルに配列を「束縛する」というイメージ (一応List-processorでしたからネ、RPL)であって、ソレに伴うリスト処理やらデータ処理周りのオーバーヘッドが結構嵩んでいる様子です。
そこで、プログラム実行前にGC(garbage collection)を行うと、リスト処理で使われなくなったセルが回収され、少しは実行速度が稼げるらしいのです。MEMコマンドを実行するとGCが行われ、利用可能メモリの値がスタックに返ります。空きメモリの値が不要ならばDROPで取り除いてしまいましょう。このプロセスを最初のTICKSの前に実行すると、少しはイイ値が ... ?
現在、些事にかまけており、チョットこちらのコードを試せないので、暫くしたら試させて戴き度 ! 多謝 !!
藤堂様、こんにちは!
>Sentaro様のソースを、他のプチコンユーザにも試してもらいために、2秒で計算したソースを、Miiveseのプチコンコミュに掲載いたしました。
恐縮です。
Miiveseの方でどういう反応あるかわからないですけど、興味を持ってくれる方がひとりでもいてくれたら大成功ですね(^^)
結果のゼロ埋め整形は、FORMATコマンド仕様を見てC言語っぽいのでそのまま使ってしまいましたけど、BASICなので従来の文字列命令を使う方がスッキリかもしれません。
PRINT RIGHT$("00000000"+STR$(Z[I]),K);
akatuki様、こんばんは!
MEMコマンドでガベージコレクションはまたひとつ勉強になりました(^^)
ってことで、プログラムソースに早速取り入れました。
PI_CALC1_UserRPL.txt
実行時間は誤差の範囲ぐらいでしたけど、空きエリアが240KBくらいあるので効果が出なかったかもですね。
Spigotアルゴリズム版の方も移植してみたら、
PI_CALC2_UserRPL.txt
こちらは100桁(BASE6桁)で5分43秒と遅くなってしまいました(^^;
Spigotアルゴリズムでは配列の要素数が桁違いに増えるのでとGET、PUTコマンドでの配列アクセスはオーバーヘッドがかなりありそうですね(^^;
AURを眺めていたらPICK、UNPICKコマンドを見つけたので、スタックに置いたままで配列アクセスするようにしてみました。
PI_CALC1_UserRPL2.txt
100桁(BASE6桁) 2分40秒
100桁(BASE8桁) 2分 5秒
PI_CALC2_UserRPL2.txt
100桁(BASE6桁) 1分43秒
fx-9860GIIよりちょい遅いですけど、Saturnエミュなのでこんなところでしょうかね(^^)
Sentaro 様、お疲れ様です !
> ってことで、プログラムソースに早速取り入れました。
素早い対応、有難う御座います !
> こちらは100桁(BASE6桁)で5分43秒と遅くなってしまいました(^^;
> Spigotアルゴリズムでは配列の要素数が桁違いに増えるのでとGET、PUTコマンドでの配列アクセスはオーバーヘッドがかなりありそうですね(^^;
ウーム。配列の操作が増えるのは苦しい様です。
当方、今はグラフィクス関連のコードを作業していて、やはりUserRPLの遅さを痛感しておりますが、一方、かなり楽に書けるので、コード生産性は良く、取り敢えず動く事を確認出来た所です。
更に高速動作を求めるとなると「飛び道具」の使用、となってくるのでしょう。
> AURを眺めていたらPICK、UNPICKコマンドを見つけたので、スタックに置いたままで配列アクセスするようにしてみました。
あっ、そんなコマンドがありましたか !
進化しておりますネ !
> fx-9860GIIよりちょい遅いですけど、Saturnエミュなのでこんなところでしょうかね(^^)
そこでSysRPLですヨ、と言いたいのですが、少々時間が取れずに居り ... 。
プチコンをはじめ、プログラム関数電卓で円周率計算がここまで盛況になるとは思っていませんでした。
円周率を一般電卓で計算させる方法が、講談社ブルーバックス 電卓で遊ぶ数学(大野栄一 1992)にも紹介されています。※図形から計算するため、手順も厖大で、電卓の表示範囲までの計算です。
この著者がBASICで円周率を計算させた《パソコンで挑む円周率》(ブルーバックス)もありましたが、どちらも絶版になっているようです。私は、後者の本を紛失してしまいました。
akatuki様、こんにちは!
>当方、今はグラフィクス関連のコードを作業していて、やはりUserRPLの遅さを痛感しておりますが、一方、かなり楽に書けるので、コード生産性は良く、取り敢えず動く事を確認出来た所です。
ぉお!グラフィックス! 私はまだ全然試してないところなので楽しみです!
ところで、UserRPLはインタプリタという感じなのでしょうか。
となると、やはり使いやすさと速度は両立しないというところですよね(^^;
もし、ARMネイティブに動作することができればHP Primeレベルの速度も出せるのでしょうけども。
>更に高速動作を求めるとなると「飛び道具」の使用、となってくるのでしょう。
「飛び道具」いいですねぇ(^^)
普通の電卓だとUserRPLレベルしか使わせてもらえないのが普通なのにコンパイラ系のSysRPLがあってアセンブラまで使える、さらにARMのアセンブラもとなると奥が深すぎますね。
とりあえずSysRPLに行くまでにUserRPLの限界をということで、内側ループ内を出来るだけスタックだけで処理するように変更してみました。
一番最初のベタ移植から比較するとスタック最適化はほとんど暗号状態ですね。
前のソースと比較して比べないと何やってるのか分からなくなりそうな感じです(^^;
PI_CALC1_UserRPL3.txt
100桁(BASE6桁) 1分57秒
100桁(BASE8桁) 1分32秒
PI_CALC2_UserRPL3.txt
100桁(BASE6桁) 1分17秒
スタック処理最適化の結果、fx-9860GIIを越えてfx-CG10/20に近いところまで来ました。
これ以上の高速化はいよいよSysRPLでということになりそうです。
>そこでSysRPLですヨ、と言いたいのですが、少々時間が取れずに居り ... 。
アセンブラまで内蔵してるのですから、UserRPLからSysRPLへのコンパイラもあったら助かるのですが…(^^;
藤堂様、こんにちは!
このエントリのコメントがもうすぐ200!
ここまで続くとはちょっとびっくりですね。
円周率を電卓で計算するというのは今の時代ではかなり珍しいことだと思われるのですけど、プログラム電卓を使いこなす上での基本的なコマンド習得(入出力、配列等)には一番手っ取り早い感じがしてます(^^ゞ
ブルーバックスと言えば、「電卓に強くなる」というかなり古いのを持ってました。
大変興味深い本を紹介していただきましてありがとうございます(^^)
電卓に強くなるも大事にもっています。この本も絶版のようです。
電卓で遊ぶ数学は、カシオ一般電卓を使っての操作方法でした。電卓に強くなるはどちらかと言えば、シャープの一般電卓での説明になっているようです。
電卓に強くなるの著作の理想電卓は、乗算の定数計算が、2×5==の操作をしたときに50になる電卓に◎を示していました。一般電卓でこの動作をする電卓は今のところ見たことがありません。
代替策としてEXまたはRV(X-Y変換)キーをもつ電卓でも出来るとありました。これは、キヤノン過去の一般電卓の一部、ノーブランドの中国製電卓の一部、過去の日本製一般電卓の一部に存在していました。
藤堂 様、所用で色々とあって遅うなりました。申し訳ない。
> プチコンをはじめ、プログラム関数電卓で円周率計算がここまで盛況になるとは思っていませんでした。
それは、やす様、Sentaro様、そして藤堂様のコメントに拠る所です。有難う御座居ます。
> 円周率を一般電卓で計算させる方法が、講談社ブルーバックス 電卓で遊ぶ数学(大野栄一 1992)にも紹介されています。※図形から計算するため、手順も厖大で、電卓の表示範囲までの計算です。
ブルーバックス、イイですネ !
当方も何冊かお世話になっております。最近は専門的になる一方、薄い本(「同人誌」じゃなくて、内容の方です)が多くなったきらいがあるような ?
> この著者がBASICで円周率を計算させた《パソコンで挑む円周率》(ブルーバックス)もありましたが、どちらも絶版になっているようです。私は、後者の本を紛失してしまいました。
仰るように、円周率計算はプロ電やPCなどの計算資源が普及し始めた頃から、市井の研究者の話題にもなっている所であります。
当方、今回の円周率計算のネタで途中で脱落してしまったクチなのでエラそうな事は言えませんが、こういった研究がプロ電なり高機能電卓で行える、そうしたリテラシイを涵養すべく、と言うか「そうできたらいいなぁ」という思いで、面白そうな話題を提供して行こうと思う所なのであります。
Sentaro 様、所用で色々とあって遅うなりました。申し訳ない。
> ぉお!グラフィックス! 私はまだ全然試してないところなので楽しみです!
いや、あんまり期待してもらいますと ... 。
ただ、簡単なコマンドで、取り敢えずグラフィクス、というか、線画くらいは出来るので、それで少し遊んでいる程度の話でして。
HP50gの「威力」というと、z=f(x,y)の曲面グラフを描く「Fast3D」が、実にスゴいです。HP Primeには同等の機能がないので、3D plotの機能をプログラムで作った方がいるそうです (HPCALC.ORGにありました)。
> ところで、UserRPLはインタプリタという感じなのでしょうか。
> となると、やはり使いやすさと速度は両立しないというところですよね(^^;
どうも、その様です。ウーン、悩ましい ... 。
> もし、ARMネイティブに動作することができればHP Primeレベルの速度も出せるのでしょうけども。
HP PrimeのPPL (Prime Programming Language)は、どうもJITコンパイラの様子。
「Conn kitで電卓内のメモリを覗くと、P-codeバイナリがあって ... 」みたいな話題がMoHPCに出ていた様に記憶して居ります。
ARMネイティブではないものの、JITコンパイルして得られたP-codeをVMで実行するイメージ ? なので早いらしいですネ。
> 「飛び道具」いいですねぇ(^^)
> 普通の電卓だとUserRPLレベルしか使わせてもらえないのが普通なのにコンパイラ系のSysRPLがあってアセンブラまで使える、さらにARMのアセンブラもとなると奥が深すぎますね。
当方、そこも興味があって50Gを購入したのですが、長らく使っているというのに、未だにものになっていない ... 。
まあ、それだけ奥が深く「噛めば噛むほど」という事なので、のんびりとやっております。
> とりあえずSysRPLに行くまでにUserRPLの限界をということで、内側ループ内を出来るだけスタックだけで処理するように変更してみました。
> スタック処理最適化の結果、fx-9860GIIを越えてfx-CG10/20に近いところまで来ました。
> これ以上の高速化はいよいよSysRPLでということになりそうです。
おおっ、コレは !
UserRPLだけでも、ここまで最適化出来る、という成果ですね、素晴らしい !
> 一番最初のベタ移植から比較するとスタック最適化はほとんど暗号状態ですね。
> 前のソースと比較して比べないと何やってるのか分からなくなりそうな感じです(^^;
それは ... (苦笑)。
確かに、RPLは「書きやすく読みにくい」所があり、普及し損ねた様な所がありますネ。
> アセンブラまで内蔵してるのですから、UserRPLからSysRPLへのコンパイラもあったら助かるのですが…(^^;
それ、仰る通りです !
Sentaro 様がお知らせ下さいましたFlag -85ですが、これがかなり勉強になります。
今、色々とプログラムの断片を書き出しならが、Flag -85でどういった表示になるのか、観察しているのですが、これが実に興味深い。
で、もうすぐネタをポストする予定なのですが、色々とお仕事の方が立て込んでしまい、少々遅れそうです。そこで、簡単なグラフィクスのネタを。
ERASE でグラフィクスバッファを消し去り、{ #0 #0 } PVIEW でグラフィクスバッファを表示します。後は integer 2個のリスト、もしくは複素数をスタックに置き、PIXON, PIXOFF を使えば、点が描けます。一番簡単な手法です。
<< ERASE { #0 #0 } PVIEW
{ #10 #10 } PIXON
(1, 2) PIXON
>>
複素数表現の場合には、WIN ([F2] キー) で設定されるグラフィクス区間にてマップされた座標で点が打たれます。通常のプログラムの場合、座標系の変換を行う必要があって、少々面倒でありますが、高機能電卓ならば、こうしたサービスがあるので、簡単なグラフィクスならばUserRPLで簡単に計算グラフィクスが楽しめる、という事で !
藤堂様、こんにちは!
「電卓に強くなる」は藤堂様もお持ちだったのですね(^^)
>電卓に強くなるの著作の理想電卓は、乗算の定数計算が、2×5==の操作をしたときに50になる電卓に◎を示していました。一般電卓でこの動作をする電卓は今のところ見たことがありません。
CASIOやSHARPの二大メーカーもそれぞれ別の設計思想があったということで、「電卓に強くなる」の理想電卓が現実にはかなり珍しかったというのが面白いところですよね。
>代替策としてEXまたはRV(X-Y変換)キーをもつ電卓でも出来るとありました。
スタック計算のRPNだとこの機能がないと計算そのものが成り立たないことも多いですけど、手持ちの電卓でこの機能を装備しているのはプロ電のFX-603Pしかないです。
これって電卓を使いこなす上では必須の機能に思えるのですが、その機能を実装していた電卓が少数派だったのが惜しいです。
akatuki様、こんにちは!
おかげさまでやっとこSysRPLで計算できるようにはなったのですけど、あまり速くなっていないような感じが…(^^;
PI_CALC1_SysRPL3.txt
100桁(BASE6桁) 1分04秒
100桁(BASE8桁) 0分51秒
PI_CALC2_SysRPL3.txt
100桁(BASE6桁) 1分03秒
配列アクセスがオーバーヘッドになってそうなのでそこを工夫すればまだ高速化できそうですけど、効率的な配列アクセス方法がまだよくわかってません(^^;
移植はPC上でDebug4xを使ったのですけど、何度もリセット&メモリオールクリアになってしまったのでSysRPLから先はエミュ必須ですね(^^;
>HP50gの「威力」というと、z=f(x,y)の曲面グラフを描く「Fast3D」が、実にスゴいです。HP Primeには同等の機能がないので、3D plotの機能をプログラムで作った方がいるそうです (HPCALC.ORGにありました)。
「Fast3D」なかなかよいですね(^^)
50Gでのグラフィックはakatuki様が紹介してくださっている例以上にはまだ踏み込んでないところですけど、とりあえずはUserRPLでいじくり回すのがよさそうですね。
最近はほとんど50GばかりでPrimeおろそかになってしまってますけど(^^;そういえば、HP Primeはデフォルトでは3Dグラフが無かったですね。
>今、色々とプログラムの断片を書き出しならが、Flag -85でどういった表示になるのか、観察しているのですが、これが実に興味深い。
最初見た時にはSysRPLに変換されてる?って思ったんですけど、xで始まるUserRPLと同じ内部コマンド?がSysRPLで使えると便利かなと思ったんですけど、なんかそのままでは使えない感じで?(^^;
Sentaro 様、今晩は ! お勤め(?)、お疲れ様です !
> おかげさまでやっとこSysRPLで計算できるようにはなったのですけど、あまり速くなっていないような感じが…(^^;
あっー、もうやっちゃったのですか !
> 配列アクセスがオーバーヘッドになってそうなのでそこを工夫すればまだ高速化できそうですけど、効率的な配列アクセス方法がまだよくわかってません(^^;
当方、やっていないので、なかなかうまい方法を考える事も出来ませんが、一つには実数ではなくBINT (Binary Integer), ZINT (Extended Integer) を使う計算が効果的なのだろうと思うのであります。BINT, ZINT を配列で扱えるのか、もう少し研究してみないとなりませんので未だに着手出来ずなのですが、そんな事を考えていたら色々と忙しい事になって仕舞い。
> 移植はPC上でDebug4xを使ったのですけど、何度もリセット&メモリオールクリアになってしまったのでSysRPLから先はエミュ必須ですね(^^;
やはりDebug4x、イイですね。当方も検討してみようかなぁ。
> 「Fast3D」なかなかよいですね(^^)
> 50Gでのグラフィックはakatuki様が紹介してくださっている例以上にはまだ踏み込んでないところですけど、とりあえずはUserRPLでいじくり回すのがよさそうですね。
(UserRPL+)グラフィクスで準備中のネタがあるのですが、他の用事でちょっと忙しいので、もう少し先になってしまいそうです。
(3Dではなく、数値計算グラフィクスです。内容は大して長いものではないのですが、文章を少し書こうと思っておりまして)
> 最近はほとんど50GばかりでPrimeおろそかになってしまってますけど(^^;そういえば、HP Primeはデフォルトでは3Dグラフが無かったですね。
(電卓にしては)高精細度のグラフィクスが採用されたので、3D表示くらいは欲しい所だったのですが。
> 最初見た時にはSysRPLに変換されてる?って思ったんですけど、xで始まるUserRPLと同じ内部コマンド?がSysRPLで使えると便利かなと思ったんですけど、なんかそのままでは使えない感じで?(^^;
UserRPLの内部表現という事らしいのですが、この表示を良くみると、SysRPLのPDF文書に出ているサンプルの理解が深まるのです。
サンプルの中に「x<<」っていうのがあってナニコレ珍百景だったのですが、どうもプログラム括弧「<<」のSysRPL表現だった、と-85フラグのセットで始めて判った、という次第。他にも勉強になっております。
惜しむらくは、編集しようとするとUserRPLに戻ってしまう所ですネ。まんま、文字列にしてASMコマンドに掛けられると良かったのですが。表示だけなので、フォントの指定を替えて、なるべく多く表示される様にしてみましたが、それでも限界。UserRPLをSysRPLに機械的に置き換えるツールとかあったりするのかなぁ ? なんてネ。
藤堂様、Sentaro様
初めてCASIO関数電卓を買った時の事です。友人のSharp製関数電卓を触らせてもらい、どうも使い方が「違う」という印象があったのですが、置数操作の感触が違うために、こうした印象を持ったらしいのですね。
当時はプログラミングなんて全く知らなかったので、その内、忘れちまったのですが、その後、関数電卓の取説を見ると、計算のための内部スタックが6段用意されているとか書かれており、それが括弧の計算のために使われていると知って、スタックというものがどんな所に使われているのか、少し理解が進んだのでした。
置数操作の自由度がなくなって行ったのは惜しい所であります。この辺り、もう少しやっていけば、独自の電卓プログラム言語とか出て来たりしたのかなぁ、と夢想できそうな所です。ロマンがありそう。
と、書いていたらキリ番の200コメント目です ! と、先回りして書いちゃいましたヨ !!
akatuki様、こんばんは!
200コメント目のキリ番、おめでとうございます!
200コメントあってもあまり重くならないのがよいですね(^^)
>あっー、もうやっちゃったのですか !
んと、変数の扱い方がわかれば後はUserRPLからSysRPLへは1対1で移植できるかと思ったらUNPICKとかSysRPLにはないコマンドがあることがわかってちょっと手間取りました。
あとループ構造も初期値はBINT形式とか同じようにはいかないので、SysRPL形式に変換するところがちょっとややこしかったですね。
>一つには実数ではなくBINT (Binary Integer), ZINT (Extended Integer) を使う計算が効果的なのだろうと思うのであります。
やはり整数型にするのが一番高速化に寄与しそうですよね。
と思って、整数処理化しようと思うとBINTは5バイト、ZINTは任意精度ということで、なかなか一筋縄では上手くいきません(^^;もう少し経験値をつむ必要ありみたいです。
>惜しむらくは、編集しようとするとUserRPLに戻ってしまう所ですネ。まんま、文字列にしてASMコマンドに掛けられると良かったのですが。
ですよね。
そうなると即SysRPLに出来てコンパイルできてお手軽なんですけどね。
>UserRPLをSysRPLに機械的に置き換えるツールとかあったりするのかなぁ ? なんてネ。
SysRPLやSaturnアセンブラもかなり昔から存在していると思われるのですけど、UserRPLからのコンパイラ系の自動変換ツールとか見当たらない?ってことは…結構内部構造がややこしいことになっているんでしょうか。
いや、それとも、逆にコマンドに慣れていけば機械的コンパイラよりも最適化された形でSysRPLもアセンブラもサクサク書けてしまうってことでしょうかね(^^;
>その後、関数電卓の取説を見ると、計算のための内部スタックが6段用意されているとか書かれており、それが括弧の計算のために使われていると知って、スタックというものがどんな所に使われているのか、少し理解が進んだのでした。
HP電卓や機械語だとスタックは当たり前の概念ですけど、今の自然表示な関数電卓はもはやスタックを全然意識する必要がないので、便利にはなった反面、スタックという言葉自体廃れていく感じもしますね。
昔、Z80のコンパイラを作っていじってたことがあったんですけど、その時の数式評価はまさにRPNそのものだったので、なんか、RPLプログラミングっていうのはマシン語への変換&最適化を手作業でするハンドコンパイル感覚を思い出します。
当時にHP電卓使いだったら機械語のプログラミングは数段楽だったのかも?とちょっと思うところです(^^;
コメントを投稿