マルコムのカスケーディングアキュームレータ

マルコムのカスケーディングアキュームレータプログラムは十数年前に自作したものです。 製作途中で投げだしたので、掛け算割り算がまだ十分サポートされていない欠陥品ですが、加算は正常に動作します。 プログラム開発が散漫的だったため機能が統合されていない問題があり、やむをえず2種類のプログラムを用意しました。 プログラム命名法も統一感がなく、最近の潮流から外れていますが、ご容赦ください。 なお、プログラムの欠陥があった場合の修正作業はしばらく行なわない予定。 (正直言うと、作った本人が詳細を忘れてしまっている。割り算、あるにはあるが、スパゲッティ状態。) また、当方、プログラムの欠陥などによる損害の責任は負いませんので、自己責任でご利用ください。 プログラムがまだ整理されておらず、整理後、ソースの公開予定。とりあえず、jarファイルのみの公開。

1 ダウンロード

以下をクリックするとダウンロードが始まる。

Summation.jar

2 利用法

ダウンロードファイルを任意のフォルダにコピー、クラスパスを設定し、メインプログラムを実行する。 以下、実行例。(同じフォルダに置く必要はないが、解説の都合上同じにしている。)

実行例
C:\JavaTest\sumtest>dir
 ・・・・・・・・・
2024/03/04  10:49            24,766 Summation.jar
2024/03/04  13:30             3,775 test.java
 ・・・・・・・・・
C:\JavaTest\sumtest>javac -cp Summation.jar test.java
C:\JavaTest\sumtest>java -cp Summation.jar; test
 ・・・・・・・・・・・・・

なお、メインプログラムには、「 import com.example.sum.Malcolm9_CA; 」などを記述すること。 eclipseで実行する場合は、プロジェクト名を右クリック、ビルドパスの構成でjarファイルの指定ができる。 プログラムの記述法は大まかに前ページで紹介しているが、簡単に以下に示す。

  1. 最初に利用するクラスをnewする。(インスタンスの生成)
    Malcolm9_CA a = new Malcolm9_CA();
    SAcc_v1_5 b = new SAcc_v1_5();
  2. 基本は加算。(倍精度浮動小数点doubleのみ加算)
    void add(double a) アキュームレータにaを加算
    double getSum() アキュームレータの総和を求める
    a.add(1.0);
    a.add(-5.33);
    a.add(x*y + z);
    double sum = a.getSum();
    など
  3. 速度は、Malcolm9_CA > SAcc_v1_5 なので、加算はMalcolm9_CAがお勧め。
  4. 総和は、SAcc_v1_5のほうが正確。(微妙な差なので、しなくてもよい。)
    a.addto(b);
    b.getSum();
    このようにして総和を求める。
  5. Malcolm9_CAには、基本的に加算add(x)と総和getSum()の2つしかない。
    注意事項として、10の-300乗付近以下の非正規数では誤差が発生する。
    通常、このような極小の数値は無視できる場合が多いので、極小値を扱う場合のみ注意を要する。
  6. SAcc_v1_5にはその他のいくつかの機能がある。
    BigDecimal getSum_DECIMAL128_() 128ビットBigDecimalで総和を求める。
    void muladd(double a1, double a2) 無誤差積和 a1×a2 -> アキュームレータへ加算
    void muladdto(double a,SAcc_v1_5 b) アキュームレータ×a -> bのアキュームレータへ加算
  7. 追加項目として、整数値のべき乗計算プログラムを追加。
    long Power.pow(long n, int pw) nのpw乗の計算
    int Power.pow(int n, int pw)

3 計算テストによる検証

積分$\int_0^1 \frac{4}{1+x^2}dx$ はπになるので、この積分を台形公式で計算する。 分割数nを非常に大きくすると計算結果がπに収束する様子を見ることができる。

表1. 台形公式の計算
n計算値計算値-π計算時間1(ms)計算時間2
67108864
536870912
4294967296
34359738368
274877906944
1099511627776
正しいπの値
3.14159265358979320143388
3.14159265358979324028502
3.14159265358979323763592
3.14159265358979323833420
3.14159265358979323844317
3.14159265358979323845518
3.14159265358979323846264
-3.703e-17
+1.822e-18
-8.267e-19
-1.284e-19
-1.948e-20
-7.463e-21
---
27
204
1560
12572
103039
418353
---
63
304
1733
13678
106923
430285
---

分割数nが大きくなるとしだいに計算値がπの正しい値に近づいていることがわかる。 また、計算精度が倍精度浮動小数点数の限界(約16桁)を超え、20桁を超えていることがわかる。 もともとは倍精度浮動小数点数を使った加算なので、とても奇妙に思える。 分割数をこれ以上増やすと、計算時間が膨大になるので、ここで終了とした。
計算時間1はSpring WebFluxで前頁で紹介したWebFlux用プログラムを実行した場合。
計算時間2は通常のJavaプログラムをcommand実行した場合の計算時間。
微妙な差だが、若干Spring WebFluxの方が速い。なぜかはよくわからない。

作成日: 更新日:


back    next