ブログトップ

電子工作やってみたよ

タグ:HP電卓ファン ( 22 ) タグの人気記事

前回 π(パイ)円周率 を求めるのにモンテカルロ法を使って遊んでみましたが、調べる範囲が解っているのになぜ乱数使ってやるの? 
と疑問が湧いたのでモンテカルロ法をちょっと変えてやってみました。
図のNo1はモンテカルロ法で、ひとつの真四角の中に乱数でランダムに点を置いて半円(1/4円)の内側にあるかを調べて数の比率で円周率を求めます。
しかし 調べる範囲が決まっているのだから、なにも不安定な乱数でやることはないと思います。
No2は端から順番に均一に調べていく方法です。 これならばらつきもなく精度が上がるのでないかと思いやってみました。
とりあえず 演算時間もあるので真四角を立て横100等分して合計10000点で調べました。



c0335218_18194215.jpg



c0335218_10462042.jpg


全プログラムリスト 

HP32Sのプログラムです。
10000点のデータが出るまでに20分かかりました。

A01 LBL A
A02 0
A03 STO X
A04 STO Y
A05 STO T
A06 STO P

B01 LBL B
B02 RCL X

C01 LBL C
C02 XEQ H
C03 0.01
C04 STO +Y
C05 RCL Y
C06 1
C07 X>Y ?
C08 GTO C
C09 0
C10 STO Y
C11 0.01
C12 STO +X
C13 RCL X
C14 PSE
C15 1
C16 X>Y ?
C17 GTO B
C18 RCL T
C19 RCL P
C20 STOP

H01 LBL H
H02 1
H03 STO +T
H04 RCL X
H05 X^2 Xの2乗
H06 RCL Y
H07 X^2
H08 +
H09 1
H10 X<Y ?
H11 RTN
H12 1
H13 STO +P
H14 RTN


使用した変数
X
Y
P
T

結果
円の内側の点  7953
真四角の全点 10000

円周率  ( 7953 * 4 ) / 10000 = 3.1812

モンテカルロ法より悪いですね。 縦横100等分ではまだ粗いということでしょうか。
しかし HP電卓でやてみるとこれでも20分かかりました。



************************************************************************

同じ動作をするものを PC9801のN88Basicで組んでみました。(古いですね)
内部演算をバイナリでやっているため、計算の終わりに近づくと少しづつ誤差が累積してきます。
演算時間は30秒くらいでしょうか。

X=0: Y=0: T=0: P=0

WHILE X < 1
PRINT X
WHILE Y < 1
T = T + 1
L = ( X^2 + Y^2 )
IF L < 1 THEN P = P + 1
Y =Y + 0.01
WEND
Y = 0
X = X + 0.01
WEND
PRINT T
PRINT P




これで終わりです。





親戚の農家から柿を貰いました。
柿の品評会で金賞を何度もとったことがあるそうです。
この家の周りには、手入れをされた柿の木がなん十本もあります。
今は 80歳をとうに過ぎていますが、柿を作り始めた歳がなんと70歳だそうで、今の私より歳をとっていたんだ。 弟子入りして教わろうかな。
最初木になっている時は渋柿ですが、木になっている状態でビニール袋を被せ渋抜きをして甘くするそうです。
柿を切って見ると断面にはゴマというのですか黒いつぶつぶがたくさんあります。 当然種なしです。
実は固くて歯ごたえがあり、とても美味しいです。
さて 悩むのは、お返しをどうしよう、ということですね。
もう少したつとりんごがもらえる予定なのでそれ持ってお返しかねて遊びに行ってみようかな。
ついでに言ってしまうと、我が家のネギの苗もこの親戚からもらったものです。
プロというか年期が入っていて市販されている苗よりもとても元気の良いものを作ります。
写真の左下にあるのはHP29c電卓です。大きさ比較のために置きましたがじゃまでしたね。
電卓の上下の長さは13cmです。  この柿を貰う前日スーパーで一つ100円の柿買ってきて食べましたが、それよりもこの方が大きくて美味しいです。

c0335218_19432926.jpg




by telmic-gunma | 2017-11-16 11:20 | HP電卓 | Trackback | Comments(0)

HP電卓の入門解説書(モデル67,07)が本棚の奥から出てきました。
これは YHP(横河ヒューレット・パッカード株式会社)が作ったもので、逆ポーランドの動作や、HP電卓の操作がとても解りやすく書いてあります。
HP電卓においては機種が違っても逆ポーランド法の基本はすべて同じです。
上位機種になるほど命令の種類やメモリーがふえるだけです。
ですので ここに載せたモデル67/モデル97の基本のところはたの機種にもそのまま使えます。

この冊子をスキャナで読みjpgファイルにしてパソコンで読むにはくっきりと大きな文字で読みやすいのですが、ブログに転送すると途端に小さな文字となり読みにくくなってしまいます。
いろいろ試したのですが jpgファイルの大きさにより違いがあるようです。
あるサイズ以下ならば拡大され、あるサイズを超えるとそのままか縮小されてしまうようです。
もう少し試してみます。とりあえずは大小混在していますが、ガマンしてください。


c0335218_23353432.jpg

c0335218_08453438.jpg

c0335218_08460848.jpg

c0335218_08474937.jpg

c0335218_08490040.jpg

c0335218_08495602.jpg

c0335218_08503585.jpg

c0335218_08515099.jpg

c0335218_08530244.jpg

c0335218_08535581.jpg

c0335218_08545157.jpg

c0335218_08572368.jpg

c0335218_08594930.jpg

c0335218_09013315.jpg

c0335218_09033212.jpg

c0335218_09043306.jpg

c0335218_09052911.jpg

c0335218_09064069.jpg

c0335218_09081649.jpg

c0335218_09102264.jpg

c0335218_09112729.jpg

c0335218_09125588.jpg

c0335218_09281082.jpg

c0335218_09143865.jpg

c0335218_09302151.jpg

c0335218_09315866.jpg

c0335218_09370363.jpg

c0335218_09354987.jpg

c0335218_09380429.jpg

c0335218_09391805.jpg

c0335218_09403267.jpg

c0335218_09414487.jpg

c0335218_09423894.jpg

c0335218_09433998.jpg

c0335218_09484526.jpg


by telmic-gunma | 2017-11-07 21:24 | HP電卓 | Trackback | Comments(2)

プログラムコンテストとは関係ないけど、kusakaさんが送ってきたプログラムです。

以下 kusaka さんのプログラム  3時休みの10分間で作ってしまったそうです。
若いですね、うらやましいなー

***********************

1~1000までの素数を見つけて合計するっていうのはどうですか?簡単かな

三時休みでできちゃった。難しい問題ないかなー

全プログラムリスト 

number of prime = 169
sum of prime = 76128
#include <stdio.h>

void main()
{
    int i;
    int a;
    int num_ans = 0;
    int sum_ans = 0;
    int prime = 0;
    for(i = 1; i <= 1000; i++){
        prime = 1;
        for(a = 2; a < i; a++){
            if(i % a == 0)
                prime = 0;
        }
        if(prime){
            printf("%d\r\n", i);
            num_ans++;
            sum_ans += i;
        }
    }
    printf("number of prime = %d\r\n", num_ans);
    printf("sum of prime = %d\r\n", sum_ans);
}


これで終わりです。

kusakaさんのC言語 シンプルですね。


c0335218_13073923.jpg

以下わたしが HP32S で組んだものです。
私の答えは 
素数の数   168
素数の加算値 76127

kusakaさんの値より、なぜかどちらも 1つ小さいです。
演算時間は丁度30分かかりました。
えーと ソフトを作った時間は、ないしょ
フローチャートなど事前に作らないとソフトを組むことできないですね。

全プログラムリスト (HP32S を使用)

変数名
A:   調査する数      初期値1として+2づつ増やし 奇数のみ調査する。
B: 調査する数を割る数  初期値1として+2づつ増やす、奇数でのみ調査する。
C: 素数を加算した合計  最初の素数2は初期値として置いておく
D: 素数の累積の数    1を最初とする。(素数2を置いてあるから)



A01 LBL A   *******

A02 3
A03 STO A   調査する数 素数2は既知とし3から調べる
A04 STO B   調査する数を割る数
A05 2
A06 STO C   素数を加算した合計 最初の2のみ手で入れておく
A07 1
A08 STO D   素数

B01 LBL B   *******
B02 RCL A   調査する数
B03 RCL B   調査する数を割る数
B04 X=Y
B05 GTO F   値が一致していれば素数なので G へ行く

C01 LBL C   *******
C02 ÷     調査する数を順次割って割り切れるかチェックする
C03 FP   (少数以下を取り出す)
C04 X=0
C05 GTO G   少数以下ゼロ、(り切れた)なら素数ではないので次の数値を調べに行く
C06 2
C07 STO +B  割る数を2増やしてチェックし直す 
C08 GTO B

F01 LBL F   ********
F02 RCL A   素数だったので今の値を素数の積算値の足す
F03 STO +C
F04 1
F05 STO +D  素数だったのでカウンターに1を足す 

G01 LBL G   *******
G02 3
G03 STO B   割る数を出発点の3に戻す
G04 2
G05 STO +A  調べる数を2増やす。
G06 1000   上限値の1000
G07 RCL A   調べる数を読み込む
G08 X>Y    調べる数が上限値を越えたか調べる
G09 GTO H   上限値を越えたのでHへ行く
G10 GTO B   まだ上限値でないのでさらにチェックを続ける

H01 LBL H   *******
H02 RCL C   素数積算値を表示する
H03 STOP   停止して終わり

これで終わりです。



C言語だとフローチャートなどなくてもリストだけで全体の動きが見られますね。
これ 図形としてプログラムの形も表現されているからでしょうか。

HP電卓の方は、コメントがあったとしても、一つづつの動作を追っていかなければ理解が難しいですね。
ましてや コメントのないリストは知恵の輪を解くようなものですか。 
これが 結構楽しいのですけけれどね。


追記
プログラムを作っていて頭が混乱してきたのでフローチャートを作りました。
これ 最初にやるべきでしたね。

c0335218_20210497.jpg

素数かいなか調査するときの数値を追って考えました。
この絵を書いたことにより頭がスッキリしました。
やはり絵で表現すると脳が理解しやすいのでしょうか。


c0335218_20213508.jpg

上の続きです。


c0335218_20221011.jpg


by telmic-gunma | 2017-10-23 14:56 | HP電卓 | Trackback | Comments(4)

”すがわら”さんから HP35Sの遅い理由を教えていただいたのでここに載せます。

35sのバッテリーについてはやはり「持たない!」と海外でも騒いでいるようです。それと速度ですけど、35sのCPUは液晶駆動用LSIにCPUが内蔵された形のもので、SPLB31Aという台湾のGeneraplusという会社の物とのこと。
で内蔵されているCPUですが、MOS Technologyの8502です。
ここでヌヌヌと思われたかもしれませんが、8502は「あの」6502のI/O内蔵版である6510の改良品だそうです。
しかしながら8bitであり、低消費電力のためクロックもそれほど高くできないので、それほど早く無いとなります。
オリジナルの8502は2MHzクロック。SPLB31Aはデーターシート上ではVDD 3.6V時にMax 5MHzです。
チップのデーターシートではVDDの最大値が5.5Vとなっていますので、35sについてはバッテリーはパラ接続と思われます。というか、実際に片方外しても動きました... なので、消費電流計測も失敗なさったのだと思います。
hpmuseumというところのフォーラムには10uAだったてな話も出ていますが、もっと暗電流がありそうな気がします。
対して15C-LEにはAtmelのAT91SAM9というCPUが使用されていて、動作クロックも200M~400MHzと桁違い。CPU coreも32bitですし。なのでこれだけの速度差が出るのですね。
英語版のWikipediaにはいろいろと興味深いことがかいてあります。35sのご先祖様であるHP35はMostek製の1bit CPU(シリアル処理CPUですね。MC14500みたいな)で構成されているとか。
それにしてもこんなところで6502にお目にかかるとは思っても見ませんでした。8bitの名CPUって結構しぶとく生き残っているものですね。
知っている範囲では、パチンコ台の出玉制御のZ80(コアのみですけど)、古いタイプになりますがPS/2キーボードの8051、某ICカードの68HC11...

”すがわら”さんからの情報は以上です。 ありがとうございました。
HP35Sの消費電流 ますます計ってみたくなりましたね。 



c0335218_18081020.jpg












by telmic-gunma | 2016-11-25 06:42 | HP電卓 | Trackback | Comments(0)

HP電卓の演算速度 HP35S, HP41CV を計測しました。
HP35SはHP15C_LEよりも十倍以上遅いのは不思議です。
測定プログラムは前回使用し他の機種に使ったものと同じです。
そもそもこういう仕様なのか、私の計測ミスなのか、もし原因判ったら教えてください。

HP41CVのプログラムはカウント終了比較のところが Xキ0 から X=0でやるために
ループのステップ数が6から7に増えています。

HP41CVのテストプログラムです。

LBL ”AA"
200
STO 00
LBL "BB"
1
STO -00
RCL 00
X=0?
R/S
GTO "BB"


HP35Sはしまっておくだけで電池がなくなるので、消費電流計ろうとしたのですが、まだ上手くいってません。
c0335218_19010913.jpg














c0335218_18081020.jpg
































by telmic-gunma | 2016-11-24 19:00 | 基板製作 | Trackback | Comments(0)

HP電卓の機種事の演算速度の比較をしてみました。
方法は下記のごく単純な同一プログラムを入れてプログラムが停止するまでの時間を測定してみました。
機種によってラベル名や変数名がアルファベットや数値なったりします。
また HP32S,HP32Sⅱ,HP4Sでは初期設定の200が1ステップで済みますが、
影響は微小なので無視します。
さすが新しいHP15C_LEは旧HP15Cに比べて150倍はすごいですね。
命令の種類によって1ステップの処理時間は当然変わってくるはずですが、
機種事の比較だけならこれでよいとおもいます。

追記 2016-11-24 HP35S、HP41CVの測定結果を載せたものをこの後のブログで出しています。

テストプログラム

LBL A
2
0
0
STO 0
LBL B
1
STO -0
RCL 0
Xキ0
GTO B
 

c0335218_05582268.jpg
















c0335218_19565409.jpg



by telmic-gunma | 2016-11-17 06:20 | HP電卓 | Trackback | Comments(4)

HP電卓の機種により消費電流が大幅に違うように感じたので比較測定をしてみました。
測定したのは、電池がLR44(アルカリボタン電池)のものだけです。
他の充電式やHP28S,HP41C,HP48Gなどは電池が大きいので消費電流が大きくても持ち時間は気にならないと思い測定してありません。
電流測定は、三和計測器のデジタルテスター PC5000を使用しました。
いつも気になっていたのは、HP42Sの電池がすぐ無くなってしまうことでした。

電源OFFの状態では、全機種とも測定限界以下なので問題ないと思います。
プログラム実行中は各機種とも電流が多いですが、通常の使い方では、キー入力待ちの状態で放置されているのが多いと思います。
やはりHP42SはHP15C(旧)に比べて10倍以上電流が多いですね。
電池の消耗を防ぐには、こまめにON-OFFを実行することでしょうか。
LR44アルカリ電池の値段をアマゾンで調べたら、今では1個10円程度で購入できるのですね。
これならまとめ買いをしておけば、さほど消耗を気にすることないのでしょうか。

追記 2016年12月2日のブログ にHP15C-LE と HP35S の消費電流のデータを追加して載せてあります。
c0335218_17304883.jpg










by telmic-gunma | 2016-11-11 17:56 | HP電卓 | Trackback | Comments(0)

ネットで逆ポーランド法のことを検索していたら「逆ポーランド記法」というのがほとんどであることに気が付きました。
私は「逆ポーランド法」と思い込んでいたので手元にある日本語マニュアルを調べてみました。(HP35S以外はYHP横河ヒューレットパッカードの製作)

HP25のカタログーーー 逆ポーランド法
HP15C-------- 逆ポーランド法
HP28S-------ー逆ポーランド記法
HP29C-------- 逆ポーランド記法
HP32S-------- 逆ポーランド記法
HP35S--------逆ポーランド方式(発行者記載なし)
HP42S--------???
HP48SX------- 記載なし?(見つからない)
HP97--------- 逆ポーランド記法
(本)カッコのない国ーー後置記法(中置記法との対比のため?)
その他 「逆ポーランド表記法」 なんていうのもネットで見ましたね。

まあ 国家試験では、「逆ポーランド記法」になるのでしょうが、
普通には 意味が通じれば、どうでもいいのじゃないですか。

c0335218_08494459.jpg





by telmic-gunma | 2016-11-03 08:51 | HP電卓 | Trackback | Comments(0)

by  すがわら at 2016-11-01 10:14
古い教科書だと、コンパイラ設計の基本は式をRPNで表せるように変換するってことが構文解析の肝と書かれていますで、RPNとコンパイラってのは相性が良いのでしょう。最近の技法についてはよくわかっていないのですが... MSの.Netframeworkは古い中間言語実行式に近いので、また違うのかもしれません。


by at 2016-11-01 19:34
すがわらさん
ありがとうございます。
私が9月に書いた「カッコのない国」の本もそのようなことが書いてありましたね。
「数式通り」の電卓は、電卓がカッコなどの対応を解析しながらデータと命令を作業手順通りにスタックに押し込んでいって最後は一直線に作業するということなんでしょうね。
ここの所に人間の思っていたことと、コンピューター側の解釈の違いが出てきてよく話題になる式がありますよね。
しかし逆ポーランド法は人間が式の解析と変換を行いカッコを取り外していますからキー操作(命令)と計算が1対1に対応し矛盾が入り込むすきがないはずです。
私はここの所が最高に好きです。 数学の勉強するにもこうでなくてはだめじゃないでしょうか。 
多くのHP電卓病の人達も同じ考えだと思います。(若干修正を加えてます。)
**********************************

昨日 すがわらさんのコメントに返事を書いてから これがHP電卓の本質であり逆ポーランド法の本質なのかなと思いました。
これがあるから製作されて40年以上たっても、生産中止から20年以上たっても、多くの人に愛され続けている理由だと思います。
私 昔は仕事上の計算をするために、HP電卓を使っていましたが、今ではHP電卓を使うために、数学の勉強を始めたり仕事を探したりしています。

c0335218_06544913.jpg




by telmic-gunma | 2016-11-02 07:07 | HP電卓 | Trackback | Comments(0)

HP29Cで素数を出すソフト作ってみました。
LBL0からスタートさせると最初は5から表示して停止します。
R/Sキーを押すたびに次の素数を表示します。
まあ それなりにかなり時間がかかりますので素数 101まで確認しました。
HP15C LE でもほとんど同じソフトなので移植すれば100倍以上の速度で動くので
こんど試してみます。

c0335218_06050533.jpg






















各 変数の意味
R0 未使用
R1 調査する素数  初期値3 加算数2
R2 調査する素数の1/2 (わり算で調査する上限)
R3 素数調査のために割る数 初期値3 加算数2


1- LBL 0
2- 3
3- STO 1 調査する素数  初期値3
4- LBL 1
5- 2
6- STO+1 調査する素数  加算数2
7- RCL 1
8- 2
9- ÷
10- STO 2 調査する素数の1/2をしまう
11- 1
12- STO 3  素数調査のために割る数 初期値3
13- LBL 2
14- 2
15- STO+3  素数調査のために割る数に2を加算する
16- RCL 2  調査する素数の1/2
17- RCL 3 素数調査のために割る数
18- X<=Y  調査する上限に到達したか?
19- GTO 3 まだ到達前なら素数調査を行う
20- RCL 1  素数だったので現在調査した素数を表示する
21- R/S   素数の確認したら また次の素数探しに行く
22- GTO 4  また頭に戻る
23- LBL 3
24- RCL 1  現在調査している素数を読み出す
25- RCL 3  現在素数調査のための割る数を読み出す
26- ÷     わり算をする
27- FRAC 割り切れたかを調べるため、少数以下を取りだす
28- X キ  0 ゼロでないなら割り切れていない
29- GTO 2  割る数を2増やすして調査をやり直すためLBL2行く
30- 0     割り切れたアンサーとしてゼロをセット(現在未使用)
31- LBL 4
32- GTO 1  調べる素数を2増やして最初へ戻りやり直す

追加加筆 2016-10-26
C言語で素数を出すプログラムを載せます。ネットに出ていたものです。
実質 for からの 8行で済んでおり、何をどのような手順でやっているか すぐわかりますね。
上の逆ポーランド法ではリストを緻密に追いかけないとその動きは理解できないと思います。
まあ HP電卓が出来たのは40年以上昔で表示は7セグメントのみ、キー入力もテンキー+アルファ程度 C言語はまだ動いてない時代ですから比べるのは可哀そうとは思います。
思いつきですがC言語や BASIC言語でソフトを書いてから、エクセルか何かで作ったコンパイラを通して、HPの逆ポーランド法に変換させたら、楽にソフトが出来そうな気がしてきました。
自動的なコンパイラでなくても、変換手順書を作っておき、C言語で書いたソフトの流れを機械的に逆ポーランド法に書き換えていけば、悩む時間も、また虫の入り込むことも少なくなると思います。
しかし それならそのままC言語やBASICで実行すれば済む話で、なぜわざわざ逆ポーランド法に変換してHP電卓にやらせる必要があるの、というぐるぐる回りに最後は陥るのですよ。


main( )
int i;
int number;
int flag = 0;

print f("自然数=");
Scanf(%d,& number);

for( i=2; i< number; ++i)
{
if ( number %i == 0 )
{
flag = 1;
break;
}
}





by telmic-gunma | 2016-10-20 06:14 | HP電卓 | Trackback | Comments(0)