2010年1月26日火曜日

HP35sで、円周率を計算してみたよ

前のエントリで紹介しました次の記事を参考に、HP35sで円周率を計算してみました。

Many Digits of Pi (HP32sii, HP-16c, HP-12c, HP-12cp, HP-19c, HP-30b)
http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899

この記事のトップにある、HP32sii向けのコードが移植しやすく思われ、試行錯誤を重ねて移植、実行してみた所、およそ01:05時間程度で結果が得られました。
桁数は小数点以下200桁です。以下、オリジナルのコードを移植する際の「差分」について述べておきます。

1) 32siiの行番号は英文字1文字 + 数字2桁ですが、35sは英文字1文字 + 数字3桁と異なります。また、GTOなどのジャンプでは32siiの場合には数字部分を指定しません(出来ないらしい)が、35sでは指定する必要があります。

2) 変数のマッピングが異なります。

2-1) 32siiでは、変数A~Zが配列として、1~26の番号を用いて操作可能ですが、35sではA~Zは-1~-26で操作されます。
2-2) 32siiでは、配列操作のインデクスに、特殊変数「i」を用意していますが、35sでは「I」、「J」を用います。
2-3) 統計機能の変数として「n」(Σ+キーを使って入力した、データの個数)を使いますが、この場所が、32siiでは配列番号28でアクセスされるのに対し、35sでは-27となります。

以上を踏まえて、書き換えたものを載せておきます。

original author ; Katie Wasserman (許可は取っていない ... ; 英語出来ない)


P001 | LBL P
P002 | CLVARS
P003 | CLΣ
P004 | 1 ; Set up index to store variable 'A' (on 35s, it is assigned to index 0)
P005 | STO J
P006 | -27 ; Set up to store the iteration counter in register n
P007 | STO I
P008 | 26 ; calculate number of iterations needed = log-base-2(10) * N
P009 | 8
P010 | *
P011 | 2
P012 | LOG
P013 | /
P014 | IP
P015 | STO(I) ; Store in n
P016 | 2
P017 | STO(J) ; starting value
P018 | *
P019 | 3
P020 | +
P021 | Σ+ ; the SIGMAx register is used to store (iteration_counter x 2 + 1)

B001 | LBL B ; main loop
B002 | 1.026 ; set up for register loop
B003 | STO I
B004 | 0 ; initial carry

C001 | LBL C
C002 | 1E8 ; 100,000,000 this determines the number of digits per register
C003 | *
C004 | n
C005 | RCL*(I)
C006 | + ; multiply and add carry
C007 | ENTER
C008 | ENTER
C009 | Σx
C010 | /
C011 | IP ; divide by (iteration_counter x 2 + 1)
C012 | STO(I)
C013 | Σx
C014 | *
C015 | - ; remainder is the carry
C016 | ISG I
C017 | GTO C001
C018 | 2
C019 | STO+(J)
C020 | Σ- ; decrement iteration_counter by 1; and (2 x iteration_counter + 1) by 2
C021 | x>0?
C022 | GTO B001
C023 | 26 ; set up for register loop to carry overflows up one register,
C024 | STO I ; register value can never be more than 2 x 10^8

E001 | LBL E
E002 | RCL(I)
E003 | 1E8
E004 | -
E005 | x<=0?
E006 | GTO F001 ; no carry
E007 | STO(I)
E008 | 1
E009 | STO- I ; these 3 instructions add the carry forward
E010 | STO+(I)
E011 | STO+ I
E012 | GTO E001 ; this isn't really needed since the overflow can never be more than 1E8, ; but it's nice to have if other algorithms are used
F001 | LBL F
F002 | DSE I
F003 | GTO E001
F004 | RTN

S001 | LBL S
S002 | 1.027
S003 | STO I
S004 | VIEW(I)
S005 | ISG I
S006 | GTO S004
S007 | RTN


実行は[XEQ] P [ENTER]です。実行が終わったら、[XEQ] S [ENTER]で、計算結果が見られます。結果は、配列1~26に、8桁毎に入っていて、それを表示するだけです。

いわゆる「Quick hack」的な書き換えなので、実行効率などは判りません。もっと、良いコードになる可能性はあると思います。
しかし、32sii(40分)より35s(1時間5分)の方が遅いとは ... トホホ。一方、30bでは600桁以上計算するのに、40分掛からないとか。やはり、ARMベースで新しい関数電卓とか、出ないかな ?

2010年1月22日金曜日

HP30bについて

もうすぐ、新たなHPの金融電卓「HP30b」が発売されるそうです。

HPCC
http://www.hpcc.org/

ここにある「Richard Nelson's HP30b Fact Sheet」によると、工場出荷が2010/01/29、webでの扱い開始が2010/03/01となっています。もう少し先ですね。

HP30b - Educalc.net
http://www.educalc.net/1842484.page

既に、20bが販売されていますが、上記ソースによりますと、違いは次の様です。

HP30b Business Proffesional
HP20b Business Consultant

これは名前。

32KBのRAMが用意されている様です。100個の配列があり、50個のペアの回帰分析データや、出納データなどを収容出来ます。レジスタは10個で、番号によって呼び出され、レジスタ0は配列の指標としても利用されます。
30bには、プログラミング機能が付きました。プログラムはPrgm 0 - 9の10個の区画があり、それぞれに00 - 99までのラベルを利用可能。1区画辺り290バイトまでのプログラムが作成可能で、サブルーチンスタックは4段。RPNでプログラムを書き、Solvreにも使える様子。
金融関連の機能について拡充が図られたと言います。統計機能では二項分布が増えていて、IP(Integer Part)、FP(Fractional Part)が新設されている様です。マニュアルには「population deviation, standard error, forecasting」の項目があるので、ガウス分布などの計算機能がありそうです。三角関数や指数/対数もあり、ある程度は関数電卓としても利用可能な雰囲気です(20bと同じ)。


カタログ・ダウンロードページ

Featured-Packed and Programmable - HP 30b Business Professional - hp.com
http://h20195.www2.hp.com/v2/getdocument.aspx?docname=4AA2-7918ENUC.pdf

そんでもって、290バイト程度のプログラム領域で何が出来るの ? という向きには、どうやら、凄い話があります。700桁のπを計算可能らしいのです。

30b programming environment - HP Forum - The Museum of HP Calculators
http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/forum.cgi?read=161716#161716

ここでは、30bを使ってπの700桁計算を試したという話が出ていました。30bでのコードは出ておりませんが、 何と、掲載されておりました。

Many Digits of Pi (HP32sii, HP-16c, HP-12c, HP-12cp, HP-19c) - HP Forum - The Museum of HP Calculators
http://www.hpmuseum.org/cgi-sys/cgiwrap/hpmuseum/articles.cgi?read=899

には、12Cなどのコードがあります。おそらく、移植して実行した模様。20bと同じくARM系の石らしく、かなり速度が出る様子です。(しかし16Cで17時間掛かったというので、余り早くは計算出来そうもありません)

何だか、良いかな ? でも、こうした感じで関数電卓が出てくれれば、と思うのは、当方だけではない様です。「Gene Wright's HP30b review」(HPCCサイトを御参照)を御覧下さい。

2010年1月16日土曜日

HP35Sの電池を交換しました

買ってから先程まで、電池を交換した事がなかったのですが、今般、交換の止むなきに至りました。

数値積分とかすると、電池切れのインジケータが出てきて、計算が終わると電源がOFFになっていたのですが、手計算では特に出なかったので、普段から出るようになった所で交換しようと思っておりました。
しかし、手計算で使っていると、いきなり「MEMORY CLEAR」が点滅するじゃないの ! リセットも出来ず、電池を交換した次第です。もちろん、中身もパァになってしまいました。
まあ、大したものを入れていた訳ではないので、それほど困る事はありません。メモリーが消えてしまったので、却って新品を使う様でもあります。

【教訓】 一度でも電池切れインジケータをみたら、急いで電源をOFFにして、電池を交換しよう !

恐らく、こうすればメモリーを消さずに済むと思います。

しかし、HP35Sの電池は長く持ちます。

2010年1月4日月曜日

仕事始め ?

謹賀新年。
仕事でやっている訳ではないのですが、今年も電卓に関する情報が提供できましたらと言うことで、皆様、宜しくお願い申し上げます。
でも、最近はネットブークの話ばかりで、余り電卓の話題を書いておりませんねぇ。コレはアカン。反省して居ります。
新年早々、反省かいや ... 。