応用作品

 GMPもMPFRもとても有用なライブラリですが,使い方に関して言うと「ちょっと煩わしい」感じがします.そこで,当ゼミではこれらライブラリをちょっと使いやすくするための一種の「ラッパー」みたいなものをC++言語で記述して使っています.
 
これはC++で高精度演算をするための関数群を提供するヘッダファイル “bignum.h” として実装したもの(下記)です.

作品:bignum.h
 まだまだツッコミどころのあるコードですが,計算が便利になっています.(^^)
 
【bignum.hの使い方】
 bignum.hは高精度演算のための2つのクラス(下記)を提供します.
 
1) BigQ : 計算精度を落とさずに算術演算(加減乗除)を行うためのクラス
2) BigF : 指定した精度(ビット長)で算術演算と各種関数の計算を行うためのクラス
 
基本的な使い方を例を挙げて説明します.

Step-1: オブジェクトの宣言
例: BigF pi(332), c3(332), x(332), y(332);
 これで332ビット(10進数で約100桁)の精度を持つ4つの変数(オブジェクト)pi,c3,x,yが生成されます.
 
Step-2: 値の設定
例: c3 = 3;
 これでc3に3が代入されます.オブジェクトを宣言する時に値を代入することもできます.
 (例えば,BigF c3(3,332); )
 
Step-3: 計算の実行
例: pi.setPi();
 これでpiに円周率が代入されます.
 
Step-4: 値の出力
例: pi.toString(s);
   printf(“pi: %s\n\n”,s);
 これでpiの内容が文字列としsに格納されます.
 
プログラム例: π,cos(π),π/3,cos(π/3)を求めるプログラム

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include	<iostream>
#include	"bignum.h"
 
int main()
{
	char	*s;
	s = (char*)malloc(1048576);
 
	BigF	pi(332), c3(332), x(332), y(332);
 
	c3 = 3;
 
	pi.setPi();
	pi.toString(s);
	printf("pi: %s\n\n",s);
 
	y.setCos(pi);
	y.toString(s);
	printf("y=cos(pi): %s\n\n",s);
 
	x.setDiv(pi,c3);
	x.toString(s);
	printf("pi/3: %s\n\n",s);
 
	y.setCos(x);
	y.toString(s);
	printf("y=cos(pi/3): %s\n",s);
}

実行結果

pi: 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170678
 
y=cos(pi): -1.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
 
pi/3: 1.0471975511965977461542144610931676280657231331250352736583148641026054687620696662093449417807056892
 
y=cos(pi/3): 0.50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011

※ 末の桁の誤差に注意してください.
 
=== 簡易リファレンス ===

【有理数クラス:BigQ】
■ オブジェクトの生成
BigQ x 初期値なし
BigQ x(値) 生成時に初期値(値)を設定する.
■ オブジェクトの廃棄
x.Free() BigQ型のオブジェクトxを廃棄する.
■ C言語の基本的な値の代入
x = 値 BigQ型のオブジェクトxに値を代入する.
■ C言語の変数への変換
x.toInt() BigQ型のオブジェクトxをint型の値に変換したものを返す.
x.toLong() BigQ型のオブジェクトxをlong型の値に変換したものを返す.
x.toDouble() BigQ型のオブジェクトxをdouble型の値に変換したものを返す.
x.toString(s) BigQ型のオブジェクトxを文字列(char *s)に変換する.
■ 演算
x.setAdd(v1,v2) v1+v2(共にBigQ型のオブジェクト)の値をxに代入する.
x.setSub(v1,v2) v1-v2(共にBigQ型のオブジェクト)の値をxに代入する.
x.setMul(v1,v2) v1*v2(共にBigQ型のオブジェクト)の値をxに代入する.
x.setDiv(v1,v2) v1/v2(共にBigQ型のオブジェクト)の値をxに代入する.
x.setAdd(v) BigQ型のオブジェクトxにBigQ型のオブジェクトvの値を加算する.(計算結果はxの値になる)
x.setSub(v) BigQ型のオブジェクトxからBigQ型のオブジェクトvの値を引く.(計算結果はxの値になる)
x.setMul(v) BigQ型のオブジェクトxにBigQ型のオブジェクトvの値を掛ける.(計算結果はxの値になる)
x.setDiv(v) BigQ型のオブジェクトxをBigQ型のオブジェクトvの値で割る.(計算結果はxの値になる)
x.setNeg(v) BigQ型のオブジェクトvの符号を反転した値をxに代入する.
x.setInv(v) BigQ型のオブジェクトvの逆数をxに代入する.
x.setPow(v,p) BigQ型のオブジェクトvのp乗をxに代入する.(unsigned long p)
x.setInc() xの値を1増やす.
x.setDec() xの値を1減らす.
x.setFact(n) nの階乗をxに代入する.(unsigned long n)
■ 述語(比較など)
x == y BigQ型のオブジェクトx,yの値が等しければtrue,それ以外はfalseを返す.
x != y BigQ型のオブジェクトx,yの値が異なればtrue,それ以外はfalseを返す.
x > y BigQ型のオブジェクトx,yの値を比較し,x>yならばtrue,それ以外はfalseを返す.
x < y BigQ型のオブジェクトx,yの値を比較し,x
x >= y BigQ型のオブジェクトx,yの値を比較し,x>=yならばtrue,それ以外はfalseを返す.
x <= y BigQ型のオブジェクトx,yの値を比較し,x<=yならばtrue,それ以外はfalseを返す.

 

【浮動小数点数クラス:BigF】
■ オブジェクトの生成
BigF x デフォルト精度で生成する.
BigF x(精度) 生成時に精度(ビット長)を設定する.
BigF x(値,精度) 生成時に初期値(値)と精度(ビット長)を設定する.
■ オブジェクトの精度の変更
x.setPrec(精度) BigF型オブジェクトxの精度(ビット長)を変更(再設定)する.
■ オブジェクトの廃棄
x.Free() BigF型のオブジェクトxを廃棄する.
■ C言語の基本的な値の代入
x = 値 BigF型のオブジェクトxに値を代入する.
■ C言語の変数への変換
x.toInt() BigF型のオブジェクトxをint型の値に変換したものを返す.
x.toLong() BigF型のオブジェクトxをlong型の値に変換したものを返す.
x.toDouble() BigF型のオブジェクトxをdouble型の値に変換したものを返す.
x.toString(s) BigF型のオブジェクトxを文字列(char *s)に変換する.
■ C言語の基本的な値の代入
x = 値 BigF型のオブジェクトxに値を代入する.
■ 特殊な値の代入
x.setZero(符号) BigF型のオブジェクトxに0を代入する.符号はint型で,正なら+0を,負なら-0を,0なら0を設定する.
x.setInf(符号) BigF型のオブジェクトxに無限大を代入する.符号はint型で,正なら+∞を,負なら-∞を,0なら∞を設定する.
x.setNan() BigF型のオブジェクトxにNan(Not a number)を設定する.
■ 基本的な演算
x.setAdd(v1,v2) v1+v2(共にBigF型のオブジェクト)の値をxに代入する.
x.setSub(v1,v2) v1-v2(共にBigF型のオブジェクト)の値をxに代入する.
x.setMul(v1,v2) v1*v2(共にBigF型のオブジェクト)の値をxに代入する.
x.setDiv(v1,v2) v1/v2(共にBigF型のオブジェクト)の値をxに代入する.
x.setAdd(v) BigF型のオブジェクトxにBigF型のオブジェクトvの値を加算する.(計算結果はxの値になる)
x.setSub(v) BigF型のオブジェクトxからBigF型のオブジェクトvの値を引く.(計算結果はxの値になる)
x.setMul(v) BigF型のオブジェクトxにBigF型のオブジェクトvの値を掛ける.(計算結果はxの値になる)
x.setDiv(v) BigF型のオブジェクトxをBigF型のオブジェクトvの値で割る.(計算結果はxの値になる)
x.setNeg(v) BigF型のオブジェクトvの符号を反転した値をxに代入する.
x.setInv(v) BigF型のオブジェクトvの逆数をxに代入する.
x.setAbs(v) BigF型のオブジェクトvの絶対値をxに代入する.
x.setPow(v,p) BigF型のオブジェクトvのp乗をxに代入する.(unsigned long p)
x.setFact(n) nの階乗をxに代入する.(nはint,long,unsigned long)
■ 関数
x.setSqrt(v) BigF型のオブジェクトvの平方根をxに代入する.
x.setPi() 円周率をxに代入する.
x.setExp(v) e^v(vはBigF型)の値をxに代入する.
x.setExp2(v) 2^v(vはBigF型)の値をxに代入する.
x.setExp10(v) 10^v(vはBigF型)の値をxに代入する.
x.setLog(v) BigF型のオブジェクトvの対数(底e)をxに代入する.
x.setLog2(v) BigF型のオブジェクトvの対数(底2)をxに代入する.
x.setLog10(v) BigF型のオブジェクトvの対数(底10)をxに代入する.
x.setSin(v) 正弦関数sin(v)(vはBigF型)の値をxに代入する.
x.setCos(v) 余弦関数cos(v)(vはBigF型)の値をxに代入する.
x.setTan(v) 正接関数tan(v)(vはBigF型)の値をxに代入する.
x.setSec(v) 正割関数sin(v)(vはBigF型)の値をxに代入する.
x.setCsc(v) 余割関数cos(v)(vはBigF型)の値をxに代入する.
x.setCot(v) 余接関数tan(v)(vはBigF型)の値をxに代入する.
x.setAsin(v) 逆正弦関数asin(v)(vはBigF型)の値をxに代入する.
x.setAcos(v) 逆余弦関数acos(v)(vはBigF型)の値をxに代入する.
x.setAtan(v) 逆正接関数atan(v)(vはBigF型)の値をxに代入する.
x.setSinh(v) 双曲線関数sinh(v)(vはBigF型)の値をxに代入する.
x.setCosh(v) 双曲線関数cosh(v)(vはBigF型)の値をxに代入する.
x.setTanh(v) 双曲線関数tanh(v)(vはBigF型)の値をxに代入する.
x.setSech(v) 双曲線関数sech(v)(vはBigF型)の値をxに代入する.
x.setCsch(v) 双曲線関数csch(v)(vはBigF型)の値をxに代入する.
x.setCoth(v) 双曲線関数coth(v)(vはBigF型)の値をxに代入する.
x.setAsinh(v) 逆双曲線関数sinh(v)(vはBigF型)の値をxに代入する.
x.setAcosh(v) 逆双曲線関数cosh(v)(vはBigF型)の値をxに代入する.
x.setAtanh(v) 逆双曲線関数tanh(v)(vはBigF型)の値をxに代入する.
x.setGamma(v) ガンマ関数Γ(v)(vはBigF型)の値をxに代入する.
x.setZeta(v) ゼータ関数Ζ(v)(vはBigF型)の値をxに代入する.
■ 述語(比較など)
x == y BigF型のオブジェクトx,yの値が等しければtrue,それ以外はfalseを返す.
x != y BigF型のオブジェクトx,yの値が異なればtrue,それ以外はfalseを返す.
x > y BigF型のオブジェクトx,yの値を比較し,x>yならばtrue,それ以外はfalseを返す.
x < y BigF型のオブジェクトx,yの値を比較し,x
x >= y BigF型のオブジェクトx,yの値を比較し,x>=yならばtrue,それ以外はfalseを返す.
x <= y BigF型のオブジェクトx,yの値を比較し,x<=yならばtrue,それ以外はfalseを返す.
x.isZero(符号) BigF型のオブジェクトxがゼロならばtrue,それ以外はfalseを返す.符号はint型で,正ならば+0,負ならば-0,0ならば0であることを判定する.
x.isInf(符号) BigF型のオブジェクトxが無限大ならばtrue,それ以外はfalseを返す.符号はint型で,正ならば+∞,負ならば-∞,0ならば∞であることを判定する.

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)