VPC: Variable Precision Calculator

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

概要

VPC(Variable Precision Calculator)Bigdecimalを利用した任意精度のプログラマブル関数電卓です。 例えば、円周率を200桁(標準は100桁、任意に設定可能です)まで計算する場合、以下のようにできます。
VPC(Variable Precision Calculator V2) of Bigdecimal(V11)
  Copyright (c) 2024 by Shigeo Kobayashi. Allrights reserved.

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

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

>c = a-b
 c =  0.1785191348 6717693352 9061553904 4941776827 4640591871 5188825497 1589729806 1478894440 3553770510 4506961804 E-100

>
詳細は後述するとして、 例えば $precision = 1000 とすれば、1000桁(以上)計算することになります。
同様に、 + - * / 等の四則演算も $precision の設定に応じて、要求された桁数(以上)まで計算されます。
a = b - c といった簡単な計算はもちろん、( や ) 等を使用した複雑な計算式も自由に記述できます

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

インストールについて

Windows:
Windows については実行ファイル(32-bit:vpc.exe と bigdecimal.dll)等、必要なファイルを含む圧縮ファイルがこちらからダウンロードできます。ダウンロードした bigdecimal_win.zip を適当なフォルダ(例えば C:\VPC\ 等)にコピーしてから、エクスプローラー等を使用して、展開してください。展開されたファイル vpc.exe をダブルクリックすれば直ぐに利用できます。
デスクトップにショートカットを設定する場合は、vpc.bmp というファイルをアイコンに設定してください。
その他のOS(LINUX等):
全てのソースプログラム等を GitHub からダウンロードしてください。
ダウンロードしたら、 makefile の内容を参考に実行ファイルをビルドしてからシステムに応じて手動でインストールしてください。

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

基本情報

VPC では

関数一覧

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

丸め操作

丸め操作(初期設定は四捨五入)は計算結果を最終的に変数に代入する際に、計算結果が変数の保持できる数字の最大桁数($precision)より長い時に内部的に実行されます。それ以外に、以下の2つの関数を用いて丸め位置を指定して実行することが出来ます。 どちらでも丸め操作は $round の指定に従った方法で実行されます。
設定名説明使用例
trim(a,n)trim(a,n) は a の左端から数えて n+1 桁目を $round の指定に従って丸めて、全体を最大 n 桁の数値とします。
>?$round
$round          = 'half_up'

>$format=F

>a=1234.5678
 a =  1234.5678
と設定して、各計算結果は下段の通り。
round(a,i) round(a,i) は a の小数点からの相対位置で丸め操作を実行します。 もし i>=0、なら小数点の位置から右の (i+1)番目の数字が $round の指定に従って丸められます。 従って、小数点から右の数字は最大で i 個となります。 もし i<0 なら、小数点位置から左の i 番目の数字が $round の指定に従って丸められます。結果として、小数点の左に最小でも i 個のゼロが並ぶことになります。
>b=trim(a,4);c=round(a,1);d=round(a,-1);e=round(a,0)
 b =  1235
 c =  1234.6
 d =  1230
 e =  1235
丸め操作の種類:
$round に設定(代入)できる値の一覧。
丸め操作の値意味使用例
upゼロから離れる方向に切り上げる。
>$round=up;a=round(-1/3,0)
 a = -0.1E1
downゼロに近づく方向に切り捨てる。
>$round=down;a=round(-1/3,0)
 a = -0.0
half_upゼロから離れる方向に四捨五入。(初期設定).
>a=round(-2/3,3)
 a = -0.667E0
half_downゼロから離れる方向に五捨六入。
>$round=half_down;a=round(5.5555,3)
 a =  0.5555E1
ceil正の無限大方向に切り上げ。
>$round=ceil;a=trim(1.2345,3);b=trim(-1.2345,3)
 a =  0.124E1
 b = -0.123E1
floor負の無限大方向に切り下げ。
>$round=floor;a=trim(1.2345,3);b=trim(-1.2345,3)
 a =  0.123E1
 b = -0.124E1
half_even"Banker's rounding" と呼ばれる丸め方法で、切り上げ・切り下げの結果として末尾の数字が偶数になるように丸められます。
>$round=half_even
>a=trim(2.125,3)
 a =  0.212E1
>a=trim(2.135,3)
 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' なら囲みません。
  • 指定は左から順に処理されます。同じ指定が複数回あったときは後半の指定が有効になります。
    以下のように分割して指定することが出来ます。
    $format = 5F
    $format = q
>?$format
$format         = '10*E q'  # 初期値

>a=123456789012345
 a =  0.1234567890 12345E15

>$format = 5
>?a
 a =  0.12345 67890 12345 E15'

>$format=+
>?a
 a = +0.12345 67890 12345 E15

>$format=,
>?a
 a = +0.12345,67890,12345,E15

>$format=Q
>?a
 a = '+0.12345,67890,12345,E15'

>$format = F;?a
 a = '+12345,67890,12345'

>?$format
$format         = '5+F,Q'

>$format = " "
>?$format
$format         = '5+F Q'

$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 等の設定を記述しておけば便利です。

vpc.ini ファイルは以下のコマンドを使用して、いつでも書き込み・読み込みが可能です。

特殊表記

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

+0 と -0
0(ゼロ)には +0 と -0 があります(実質的に同じです)。以下を参考にしてください。

  a  = -1*0; ?a  # =>  a = -0
  b  =  1*0; ?b  # =>  b =  0
  c  =  a*b; ?c  # =>  c = -0
  $d = "0 == -0"
  if a==b;   ?$d # => "0 == -0"

Shigeo Kobayashi 2024-3-15