VPC: Variable precision calculator

このソフトウェアはGNU Lesser General Public Licenseの規定に従って自由に配布することができます。
全てのソースプログラム等は GitHub からダウンロードできます。
Copylight (c) 2024 Shigeo Kobayashi. All rights reserved.
English

Windows 用実行ファイル(32-bit:vpc.exe と bigdecimal.dll) はここからダウンロードできます。二つのファイルをどこか同じフォルダにコピーしてから、エクスプローラー等から vpc.exe をダブルクリックすれば直ぐに利用できます。

プログラムを終了するには quit と入力してください。

基本情報 関数一覧 丸め操作 丸め操作の種類 繰返し計算 動作環境設定 入出力 特殊表記

VPC(Variable precision calculator) はBigdecimalを利用した任意精度のプログラマブル関数電卓です。搭載メモリー等が許す範囲で計算桁数は任意に指定できます。 例えば、円周率を200桁(標準は100桁、任意に設定可能です)計算する場合、以下のようにできます。
 c:\Test>vpc
VPC(Variable Precision Calculator V2) of Bigdecimal(V11)
  Copyright (c) 2024 by Shigeo Kobayashi. Allrights reserved.

Enter command
>a = pi();?a
 a =  0.3141592653 5897932384 6264338327 9502884197 1693993751 0582097494 4592307816 4062862089 9862803482 5342117068 E1

>$precision = 200
>b = pi()
>?b
 b =  0.3141592653 5897932384 6264338327 9502884197 1693993751 0582097494 4592307816 4062862089 9862803482 5342117067 9821480865 1328230664 7093844609 5505822317 2535940812 8481117450 2841027019 3852110555 9644622948 9549303819 6E1
>

詳細は後述するとして a と b は変数。a = pi() は a に関数 pi() で円周率を計算した後に値を代入します。 計算桁数は初期設定の 100桁 です。; は次の処理に移行する「区切り」です。そして ?a で a の値を表示しています。 基本的には 100桁 以上の値が表示されます。'...68E1' は '...68*101' を意味します。 次に $precision = 200 で、計算桁数を 200桁 に設定して同じ計算をして、変数 b に代入しています。 例えば $precision = 1000 とすれば、1000桁(以上)計算することになります。 同様に、 + - * / 等の四則演算も $precision の設定に応じて、要求された桁数まで計算されます。

基本情報

  1. 変数と関数による四則演算:
    VPC には予め a,b,c,...,x,y,z の変数26個(のみ)が用意されています。 さらに sin や cos 等の関数も使用できます。 変数や関数を利用して自由に四則演算が可能です。
    入力は一行単位に処理されます。一行は ';' で区切った複数のステートメントに分解されます。 VPCは先頭のステートメントから順に実行します。ステートメントに何らかのエラーがあった場合、以降の行末までのステートメントは実行されません。
    計算結果は必ず変数に代入(格納)する必要があります。途中計算は可能な限り正確(結果を格納できる桁数が自動的に確保された後)に実行されます。そして、最終的に左辺変数に代入するときに($precision の値より計算桁数が大きかった場合に)、$round 指定に従った丸め操作が実行されます。計算結果は ? で表示することが出来ます。
    Enter command
    >a=pi()/4;b= power(sin(a),2) + power(cos(a),2);?a;?b
     a =  0.7853981633 9744830961 5660845819 8757210492 9234984377 6455243736 1480769541 0157155224 9657008706 3355292669 9554E0
     b =  0.1E1
    
  2. 環境設定:
    変数以外に $precision(計算桁数指定)や $round(丸め操作指定)等、計算全体や表示に関係する設定があります。 変数と同様に $precision = 200 のように値を設定して、 ?$precision として内容を表示することが出来ます。 ただし、代入と表示だけで、直接計算のなかで使用することはできません。 $precision のように環境設定変数は必ず $ が先頭に付きます。
  3. 値の表示
    変数や環境設定の値は ? で表示することができます。ただし、? の後ろに計算式(や関数)を記述することはできません。
    '?' は値を表示した後に改行します。ただし、最後に '+' を付けると改行する代わりに ';' 表示します。
    例: a=1;b=2;?a+;?b ==> a = 1; b = 2
    特別用法:
    ?* ... 全ての変数と環境設定の値を表示します。
    ?$ ... 全ての環境設定の値を表示します。
  4. 処理単位:
    一行を ; で区切ることで複数の計算(表示)を実行できます。 a = pi();?a のように、まず a = pi() を実行してから、?a で結果を表示できます。 これは
    a = pi()
    ?a
    と同じです。ただし、a = pi() ?a と ; を省略した書き方はエラーとなります。
  5. 引用符( 'または " ):
    空白等の特殊な文字を含む文字列は引用符( 'または " )で囲みます。例えば長い数値はスペースやカンマ ( ,) で区切ると読み易くなります。そのような場合は、数値を ' または " で囲むことが出来ます。例えば '1,000' と記述できます。 逆に引用符を付けないと 1,000 では数値 1 と 000 に分離した形と見なされエラーになります。文字列の中に ' がある場合は " で囲みます。逆に " がある場合は ' で囲みます。' と " を同時に含む文字列は使用できません。
    例:
    a='pi'() は正しいけど、a=' pi '() はエラーです(piは関数名)。
    a=1000 は正しい。 a= " - 10.0 1" も a=-10.01 と見なされ、正しい記述です(文字列で与えられた数値表現中のスペース、または$formatで指定された文字、は無視されます)。
  6. 繰返し計算
    repeat、while の繰り返し(繰り返し対象は行末まで)計算が可能です。
  7. 入出力:
    write ".\result.txt" のようにして、現状の全ての状態をファイル".\result.txt"(任意)に出力して保存できます。 同様に read ".\result.txt" で全ての状態を回復できます。
  8. コメント:
    空白のかける場所に # を書くと、以降の行末までコメントと見なされ全て無視されます。

関数一覧

iterations() を除く全ての関数は $precision で指定された桁数(以上)まで計算します。
関数名説明使用例備考
atan(a)逆正接 (arctangent)の計算
c = tan-1(a)
>a=0.5;c=atan(a);?a
a = 0.8414709848 0789650665 ... 5435E0
|a|<=1
sin(a)/cos(a)三角関数の計算 >a=sin(1);?a;b=cos(1);?b;c=a*a+b*b;?c
a = 0.8414709848 0789650665 ... 5435E0
b = 0.5403023058 6813971740 ... 4357E0
c = 0.1E1
与える引数はラジアン(radian)。度(degree)ではありません。
引数の値はなるべく小さくする必要があります(引数 a が3.14... より大きい場合、a=a-3.14.. 等と調節すること)。
exp(a)ネイピア数(自然対数の底 ea)のべき乗を計算します。 >a=exp(1);?a
a = 0.2718281828 4590452353 ... 4E1
ln(a)ネイピア数 e を底とするの自然対数の計算 >a=ln(0.5);?a;b=exp(a);?b
a = -0.6931471805 5994530941 723... 42E0
b = 0.5E0
0 < a <= 2
pi()円周率(π)の計算 >a=pi();?a
a = 0.3141592653 5897932384 ...068 E1
() が無いとエラー
sqrt(a)平方根の計算
a=b1/2
>a=sqrt(5);?a
a = 0.2236067977 4997896964 ...275 E1
a >= 0
iterations() 直前の繰返し計算の回数 >a=sqrt(2);b=iterations();?a;?b
a = 0.1414213562 3730950488 0168872420 ...7E1
b = 0.2E2
iterations() <= $max_iterations
注:
関数名説明使用例制限
abs(a) 絶対値の計算 >a=-1;b=abs(a);?b
b = 0.1E1
power(a,n)べき乗の計算
b=power(a,n) => b=an
>b=power(2,-2);?b
b = 0.25E0
n は正または負の整数でなければならない。
b = power(2,0.5) はエラー。
int(a)整数部分の取り出し >a=(1/3)*100;b=int(a);?b
b = 0.33E2
frac(a) 少数部分の取り出し >a=(1/3)*100;b=frac(a);?b
b = 0.3333333333 3333333333 ... 33 E0
digits(a)有効桁数 >a=(1/3)*2;?a;b=digits(a);?b
a = 0.6666666666 6666666666 ... 666 6667E0
b = 0.104E3
exponent(a)指数部分の取得
a=0.xxxx*10n の n
>a=power(10,3);?a;b=exponent(a);?b
a = 0.1E4
b = 0.4E1

丸め操作

丸め操作(初期設定は四捨五入)は計算結果を最終的に変数に代入する際に、計算結果が変数の保持できる数字の最大桁数($precision)より長い時に内部的に実行されます。それ以外に、以下の2つの関数を用いて丸め位置を指定して実行することが出来ます。 どちらでも丸め操作は $round の指定に従った方法で実行されます。
設定名説明使用例
trim(a,n)trim(a,n) は a の左端から数えて n+1 桁目を $round の指定に従って丸めて、全体を最大 n 桁の数値とします。 >$format=F;a=1234.5678;b=trim(a,4);c=round(a,1);d=round(a,-1);e=round(a,0);?a;?b;?c;?d;?e # 結果は下段の通り
round(a,i) round(a,i) は a の小数点からの相対位置で丸め操作を実行します。 もし i>=0、なら小数点の位置から右の (i+1)番目の数字が $round の指定に従って丸められます。 従って、小数点から右の数字は最大で i 個となります。 もし i<0 なら、小数点位置から左の i 番目の数字が $round の指定に従って丸められます。結果として、小数点の左に最小でも i 個のゼロが並ぶことになります。 a = 1234.5678
b = 1235
c = 1234.6
d = 1230
e = 1235
丸め操作の種類:
$round に設定(代入)できる値の一覧。
丸め操作の値意味使用例
upゼロから離れる方向に切り上げる。 >$round=up;a=-1/3;b=round(a,0);?b
b = -0.1E1
downゼロに近づく方向に切り捨てる。 >$round=down;a=-1/3;b=round(a,0);?b
b = -0.0
half_upゼロから離れる方向に四捨五入。(初期設定). >a=-2/3;b=round(a,3);?b
b = -0.667E0
half_downゼロから離れる方向に五捨六入。 >$round=half_down;a=round(5.5555,3);?a
a = 0.5555E1
ceil正の無限大方向に切り上げ。 >$round=ceil;a=trim(1.2345,3);?a;b=trim(-1.2345,3);?b
a = 0.124E1
b = -0.123E1
floor負の無限大方向に切り下げ。 >$round=floor;a=trim(1.2345,3);?a;b=trim(-1.2345,3);?b
a = 0.123E1
b = -0.124E1
half_even"Banker's rounding" と呼ばれる丸め方法で、切り上げ・切り下げの結果として上位末尾の数字が偶数になるように丸められます。 >$round=half_even
>a=trim(2.125,3);?a
a = 0.212E1
>a=trim(2.135,3);?a
a = 0.214E1

繰返し計算(入力)・条件文

繰返し計算(入力)・条件文説明使用例
repeat n;repeat 以降・行末までの(複数)実行文を n 回繰り返し実行します。n は整数値でのみ指定可。 10の階乗の計算(10!)
>n=0;s=1;repeat 10;n=n+1;s=s*n
>?s
s = 0.36288E7
while a op b;while の次の条件式 a op b が成立すれば(成立している間)以降の行末までを繰り返し実行します。 a または b は変数か数値(関数や数式は指定できません)です。ただ、a と b 共に数値を指定することはできません。 op は以下のどれかです。
  • a > b ..... a が b より大きい場合
  • a < b ..... a が b より小さい場合
  • a >= b ... a が b より大きいか等しい場合
  • a <= b .... a が b より小さいか等しい場合
  • a == b ... a と b が等しい場合
  • a != b .... a と b が異なる場合
10の階乗の計算(10!)
>n=10;s=1;while n>0;s=s*n;n=n-1
>?s
s = 0.36288E7
if a op b;条件式 a op b が成立していれば以降(行末まで)のステートメントを実行します。 if の後ろに 'break' を置くことで、繰返し計算を条件によって終了させることができます。 break は以後のステートメントの実行を(繰り返しも含めて)中止します。 10の階乗の計算(10!)
>n=0;s=1;repeat 100;n=n+1;s=s*n;if n>=10;break
>?s
s = 0.36288E7
load 'file' 変数1 変数2 ...変数n指定されたファイル 'file' をオープンし、 一行を読み込んで (VPCが数値と見なせる部分の)数値を変数1から順に(変数nまで)代入した後で、load 以降の行末までのステートメントを実行します。
上記処理を行単位にファイルの最後まで実行します。
各行は最低でも指定された変数分(n個)の数値が記述されている必要があります。一行でn個以上の数値は無視されます。
data.txt の内容
1 a2 b 2 ;;3 4 5 6
'-11' ( 12) - 13;;
21,, 22 ,23

実行結果
>load data.txt a b c;?a;?b;?c
a = 0.1E1
b = 0.2E1
c = 0.3E1
a = -0.11E2
b = 0.12E2
c = -0.13E2
a = 0.21E2
b = 0.22E2
c = 0.23E2

動作環境設定

設定名説明使用例
$format 数値の出力形式を指定します。初期値は以下の通り
>?$format
$format = '10*E q' # 初期値
  • '10':任意の数値。長い数値列を指定した数で区切ります。
  • '*' :'*'、'+'、または '-' を指定します。符号等、先頭表示を制御します。意味は以下の通りです。
    • '*' ... 正の数値は先頭にスペース ' ' が付きます(初期値)。負の値の数値は '-' が付きます。
    • '-' ... 正の数値はスペースは無しで数字が出力されます(符号無し)。負の値の数値は '-' が付きます。
    • '+' ... 正の数値は常に先頭に '+' が付きます。負の値の数値は '-' が付きます。

  • 'E' :'E' または 'F'。数値の出力形式の指定。'E'を指定すると 0.123...E3 のような形になります E3 は 103 を意味します。
  • ' ' :' ' または ','。長い数値列を区切る文字で空白かカンマを指定します。
  • 'q' :'q' または 'Q'。'Q' なら数値を ' で囲みます。'q' なら囲みません。
  • 指定は左から順に処理されます。同じ指定が複数回あったときは後半の指定が有効になります。
初期値: '10*E q'


実行例:
>a=(1/3)*1000;?a
a = 0.3333333333 3333333333 ... 333 333E3
>$format='QF,';?a
a = '333.3333333333,33333...333,3333333333'

$max_iterations繰返し計算の最大繰返し数。 初期値: 10000
$precision 変数 a,b,...z の最大桁数を指定します。例えば a=b*c+d のような計算は、b*c+d の桁数は誤差が出ないように(1/3のような割り算は特別)最大限の計算桁数が確保されます。そして、最終的に左辺変数に計算結果が代入されるときに右辺の桁数が $precision より大きい時には、以下の $round 指定に従って $precision桁に丸められます。 初期値: 100
$round丸め操作の指定をします。 初期値: half_up(四捨五入)
$title任意の文字列を設定できます。初期値: ""
$a,$b,...$y,$z こちらも任意の文字列を指定できます。各変数に関連付けたコメントを記入すれば便利かもしれません。 初期値: ""

入出力

I/O関係説明
read 'ファイルパス'実行ステートメントを指定されたファイルから読み込み実行します。とくに、 write コマンドで出力されたファイルを読み込めば、write コマンド実行時の状態になります。
write 'ファイルパス'現状の環境設定と全ての変数の値を指定されたファイルにテキスト形式の代入文で書き込みます。後に read コマンドに同じファイルを指定すれば状態を復元することができます。

vpc.ini ファイル

VPC 起動時にカレントディレクトリ(通常は vpc.exe が存在する場所)に vpc.ini というファイルがあると、そのファイルを読み込んで実行することが出来ます。 $format や $precision 等の設定を記述しておけば便利です。

特殊表記

特殊表記(以下の Infinity や NaN)はゼロの割り算等で表現できない結果が生じた場合に用いられます。 上記のような計算を実行すると a には特殊な表記(値)が設定されます。 この計算自体エラーとなりますが、以後の計算にそのまま a を使用する場合は全てエラー扱いとなります。 NaN は自分自身を含めて全ての比較に対して不一致となります。
Shigeo Kobayashi 2024-3-15