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しようかしらん ?