数値計算講義 第1 2 回 多倍長演算・ 精度保証計算
カ ーネン コ
金 子
ア レ ク セイ晃
kanenko@mbk.nifty.com alexei.kanenko@docomo.ne.jp
http://www.kanenko.com/
多倍長演算
1通常のプロ グラ ミ ン グ言語でサポート さ れて いる 変数の桁数以上の 精度で計算する こ と
.無限精度演算と か任意精度演算と も いう
.原理: ソ ロ バン を 繋げれば
(部屋に納ま る 限り
)いく ら でも 大き な桁数で 計算でき る
.i.e.
変数を 繋げれば
(メ モリ ーの許す限り
)いく ら でも 大き な桁数で 計算でき る
.KETA(1) KETA(2) KETA(3) KETA(4) KETA(5)
任意精度浮動小数の最も 簡単なフ ォ ーマッ ト
正規化さ れた浮動小数の仮数部を 十進4 桁ずつ整数配列に格納する . 小数点の位置を 冪指数と し て 記憶する
.こ の他に
,全体の符号と 仮数部の桁数を 記憶する 必要がある ので
結局
,多倍長浮動小数
Aと は次のよ う な内容の整数配列
(long)と なる :
A(1) · · ·全体の符号
(±1)A(2) · · ·
指数部
(十進
,符号付き
)A(3) · · ·
仮数部の現在の長さ
(使用し て いる ユニッ ト 数
)A(4) · · ·
仮数部の最初の4 桁
(十進
0〜
9999) ...※
C言語の場合は
,適当な構造体を 定義すれば
,も っ と プロ グラ ムし 易く なる
.多倍長浮動小数の演算
2加法 小数点の位置を 大き い方の数に合わせて 加え る 例:
0.1234×102 + 0.4323×101のと き
,= 0.1234×102 + 0.04323×102
桁揃え 立場によ り 二つに分かれる :
(1)
小数点以下4 桁に精度を 固定し て いる と き
,こ のと き は
,第2 の数を 丸めて 加え る :
= 0.1234×102 + 0.0432×102 = 0.1666×102 (2)
精度はも う 少し と っ て あり
,二つの数は正確
(i.e.
上記の部分の後ろ に
0が精度の分だけ続いて いる
)こ のと き は
,仮数部の長さ を 1 増やし て 続け る :
= 0.1234×102+ 0.04323×102= 0.16663000×102
A(5)
には
3000を 入れる のが正し い
.間違え て
3を 入れる と
, 0.16660003×102ができ て し ま う
.繰り 上がり 処理 加法の結果ある ユニッ ト で5 桁になっ たら 必要と なる . 繰り 上がり は次々 波及する かも し れな いので, 汎用に書く のは結構大変.
cf.
全加算器の設計.
最上位のユニッ ト で繰り 上がり が起こ る と , 指数の調整が必要と なる . 例:
0.1234×104+ 0.9876×104 = 1.1110×104 = 0.1111×1054 桁ずつの格納法だと , こ の変更は大変
(
すべて のユニッ ト で1 桁のずら し が必要と な る
).なので, 冪は
4の倍数と し
= 0.00011110×108
でアレ ン ジさ れたも のと し て し ま う のが簡単.
(
ただし こ の種の処理が続く と 有効桁数が損な われる と いう 欠点がある
.)減法 同様だが, 引けない場合は上から 借り て 来る 必要が有る .
3便法と し て , 負になっ て も よ いから 対応する 部位から 引いて し ま い,
後で一括アレ ン ジする と いう 流儀も 有る .
加減算だけが続く と き は
,こ の方が高速
,かつ1 万回程度の演算数なら
,各ユニッ ト にも 途中結果を 格納する 余裕がある
.実際の計算では
,データ は符号付き なので
,加法・ 減法のど ち ら を 実行する かは
,第2 オペラ ン ド の符号と 合わせて 決ま る
.答の符号は最上位ユニッ ト が正規化後にも 正になら ないと き 反転する
.こ の場合は正規化を やり 直さ ねばなら ない
.乗法 指数部は単なる 和
.仮数部は基本的に整数の乗算と 同様 例:
0.1234×104 *0.5678×108 =0.1234* 0.5678 ×1012右の計算よ り
,仮数部は
0.07006652と なる
.簡易アレ ン ジ法の下では
,(1)
精度が4 桁に指定さ れて いる と き は
,答
0.0701×1012 (2)精度が8 桁以上のと き は
,答
0.07006652×1012と なる
.1234 x 5678 ---
6170 7404
8638 9872 ---
7006652
一般に
, C=A×Bと し
,Aの仮数の第
kユニッ ト を
Akと 記せば
Ck=
k
X
j=1
(Aj×Bk−j+1
の上位4 桁
+Aj×Bk−jの下位4 桁
)と なる
(ただし
,右辺で添字が範囲外と なっ た因子は
0と みなす
.)特に, 中央付近のユニッ ト では総ユニッ ト 数程度の加算が生ずる
.よ っ て 乗算結果は一回毎にアレ ン ジする のがよ い
.oooo oooo oooo oooo oooo oooo oooo oooo oooo oooo +
oooo oooo 0.
0.
0. oooo oooo
oooo oooo
除法 指数部は引き 算
. 4仮数部の除法は仮商を 立て る 小学生の筆算式にやればでき る が
,低速
.反復法
,特に
Newton法の援用など
,種々 の工夫が行われて いる が
,いずれにし て も 他の演算に比し て 非常に時間がかかる
.組み込み函数の実装 単精度や倍精度で
sqrt,exp,sin,cos,logなど の 組み込み函数がど のよ う に実装さ れて いる かを 調べ
,真似を する
.チュ ーニン グが進みすぎて いる も のは真似ができ な いので
,基本に帰る
.例:
sqrt(x) Newton
法を 適用し た通常のラ イ ブラ リ 函数の実装法が そのま ま 使え る
.し かも
,割り 算を 避けた工夫が多倍長では非常に有効
.exp(x)
概算で
exp(y)×10n,−3< y <0の形にする :
n=⌈ xlog 10⌉, y=x−nlog 10, exp(y)
は
Taylor展開で求める
.通常の倍精度浮動小数用ラ イ ブラ リ では
,同様に
2冪を 括り 出し た後
, exp(y)の計算には
,倍精度が保証さ れた複雑な係数の近似多項式な ど が 使われる が
,それは倍精度を 越え たら 使え な い:
o
Qo
数値計算の中には
,函数近似法と いう ト ピッ ク がある
.C++
によ る 多倍長演算の実装
5多倍長浮動小数のク ラ ス
infprecを 定義し
,その上の演算を 実装する と 演算子を オーバーロ ード でき る
.多倍長数に対する 組み込み函数も 定義し て 追加でき る
.等の
C++の特徴が使え る
.こ の結果
,倍精度浮動小数に対する のと ほと んど 同じ 表記で 多倍長数での計算が可能と なる :
infprec A, B, C;
...
C=A*B-3*A+2*B/A;
....
高速に実装する には
,多倍長浮動小数型の引数のコ ピーが 頻発し ないよ う に
,サブルーチン 間のデータ の受渡し の書き 方を 工夫する 必要がある
.ただの配列
Aなら
,普通に引数に書けば
, Aのアド レ スが渡る
(参照渡し
).し かし
,Aが
infprec構造体宣言さ れて いる と
,デフ ォ ールト では
Aの内容が コ ピーさ れて サブルーチン に渡さ れる
.こ れを 防ぐ には
,void sub(infprec &A){
...
のよ う な書き 方で
,参照渡し を 宣言する と よ い
.(
ポイ ン タ ーではないので
,指すアド レ スは変化せず
,安全
.)更に
,Aの内容を
subの中で変更さ れたく 無い場合は
,void sub(const infprec &A){
...
と する と
,アド レ ス参照なのに
subの中で
Aの要素の値が修正不可能と なる
.o
Qo C
言語流に
infprec宣言を ポイ ン タ で行う こ と も 可能
.こ のと き は
,生成・ 破壊演算子でメ モリ を 確保
,開放する よ う に書く
.ま た
,構造体の内部を
privateにし て
C++のセキュ リ ティ 機能を 使う べき である .
既存の多倍長演算シ ステム
6UBASIC
老舗だが
, X86 (特に昔の
NEC PC)のアセン ブラ で 書かれて おり
,著者に
Windowsへの移植の意志が無かっ たので
,今は使われない
.PARI
ボルド ー大で開発さ れ
C言語で書かれた
,主に整数論の計算用 ツ ールだが
,初等函数の多倍長浮動小数演算も サポート
.libpari.a
の形でラ イ ブラ リ と し て も 提供さ れて おり
,こ の中の函数を 自分のプロ グラ ムにリ ン ク し て 使え る 他
,ソ ースが公開さ れて いる ので
,必要な部分を 取っ て 来て 自分のプロ グラ ム に取り 込んだり も でき る
. (Risa/Asirも 多倍長演算にこ れを 利用し て いる
.)GMP GNU MultiPrecision library. gcc
用のラ イ ブラ リ と し て
, 2000年頃から 出て いる
.今後はフ リ ーの多倍長演算ラ イ ブラ リ の主流になる と 思われる
そ の他個人の作品 小生を 含めて 多く の人が作っ て 個人的に使っ て いる
.最近のお勧め:
exflibhttp://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/exflib/
数式処理ソ フ ト に組み込ま れた多倍長演算機能 主な数式処理ソ フ ト
Mathematica, Maple, Macsyma (Maxima), Matlabなど は
,いずれも その中で精度を 任意に指定し た多倍長浮動小数の演算が可能
.し かし
,こ れら を
,自分で書いた
Cのプロ グラ ムと リ ン ク する のは困難
.GMP
の使用例
– C言語編
(gmptest.c) 7#include<stdio.h>
#include<stdlib.h>
#include<gmp.h> /*
ヘッ ダフ ァ イ ルの挿入
*/int main(void) {
int i;
mpf_t s,t; /*
型宣言
*/mpf_set_default_prec(1000);
mpf_init(s); /*
変数を 0 で初期化
*/mpf_init_set_str(t,"1e0",10); /*
変数を 1 で初期化
(10は
radix)*/for (i=1;i<=10000;i++){
mpf_add(s,s,t); /* s <- s+t */
mpf_div_ui(t,t,i); /* t <- t*i */
}
mpf_out_str(stdout,10,1000,s); /*
結果の出力
(10は
radix) */mpf_clear(t); /*
必須
*/mpf_clear(s);
return 0;
}
コ ン パイ ルは5 階に
GMPが標準でイ ン スト ールさ れたので次のよ う にする :
gcc gmptest.c -lgmp -o gmptestラ イ ブラ リ
libgmp.aは
C言語用で
,C++用は
libgmpxx.aこ のラ イ ブラ リ では, 他に
,整数型
mpz_t,有理数型
mpq_tを サポート
.指令の詳細はディ レ ク ト リ 内のマ ニュ アル
gmp-man-4.3.0.pdfを 参照せよ
.8 π
の計算
古代エジプト
3, 4 34
=·· 3.16 Archimedes 223
71 < π < 22
7 (
内接正
96角形の辺長
)劉徽
(3世紀)
227 = 3.1428571· · ·, 157
50 = 3.14, 3927
1250 = 3.1416
祖沖之(
5世紀) 約率
227 ,
密率
355113 = 3.14159292· · ·, 3.1415926< π <3.1415927 Aryabhat.a (¯
イ ン ド , 5 世紀
) 3.1416Adriaan Anthoniszoon (1527–1607
)
1585年に
355 Fran¸cois Vi`ete (Vieta) (フ ラ ン ス
, 1540–1603)代数学の父
113 .公式
2 π =∞
Y
n=2
cos π 2n =
r1 2
s 1 2 +1
2 r1
2 v u u t1
2 +1 2
s 1 2 +1
2 r1
2· · ·
を 用いて
1593年に
πを 小数点以下
9桁計算
.Ludolph van Ceulen (
オラ ン ダ,
1540–1610)正
262角形の周長を 用いて 小数点以下
35桁計算
.関孝和 小数点以下
14桁
9正
215, 216, 217角形の周長を
15桁ほど 計算し
,補外によ り
, 14桁を 正し く 求めた
.単位円に内接する 正
2n角形の半周長は
Ln= 2nsin π2n, L22 = 2√ 2.
半角公式よ り
sin π2n−1 = 2 sin π 2ncos π
2n
∴
Ln= Ln−1cos π 2n
=· · ·= L22 n
Y
k=3
cos π 2k
= 2√ 2
n
Y
k=2
cos π 2k
√1 2
= 2
n
Y
k=2
cos π 2k
n→∞
−→ π.
cos π
2n
は半角公式で漸化式が作れる :
cos π2n = r1
2 +1
2cos π
2n−1, cos π 22 = 1
√2
正
215角形の半辺長:
3.14159264877698566948· · · 10正
216角形の半辺長:
3.14159265238659134580· · ·正
217角形の半辺長:
3.14159265328899276527· · ·今
,正
N角形の半辺長が
c0+ c1N + c2
N2 +· · ·
と いう 漸近展開を 持つと 仮定し
,c0=π
が半円周の長さ と すれば
, 3.14159264877698566948· · ·=c0+ c1215+ c2
230 +· · · 3.14159265238659134580· · ·=c0+ c1
216+ c2
232 +· · · 3.14159265328899276527· · ·=c0+ c1
217+ c2
234 +· · ·
こ の三式から
c1,c2を 消去する と
,6c0+ c1
215 +· · ·= 8×3.14159265328899276527· · ·
−2×3.14159265238659134580· · · , 3c0+ c1
215 +· · ·= 4×3.14159265238659134580· · ·
−3.14159264877698566948· · ·,
∴
c0+· · ·= 83 ×3.14159265328899276527· · ·
−2×3.14159265238659134580· · · +13 ×3.14159264877698566948· · ·
= 3.14159265358979323894· · ·
左辺の
· · ·は
1245
のオーダー
.cf:
正
231角形の半辺長:
3.14159265358979323734· · ·正
235角形の半辺長:
3.14159265358979323845· · ·A. Sharp (1653-1742) 1699
下記公式によ り 小数点以下
71桁:
11π
6 = Arctan√1 3 = √1
3
1− 31·3 +51
·32 −+· · ·
J. Machin (1680–1751) 1706
下記公式を 導き
100桁計算:
π
4 = 4Arctan15 −Arctan 1 239
= 4 1
5 − 1
3·53 + 1
5·55 −+· · ·
− 1
239 − 1
3·2393 + 1
5·2395 −+· · ·
※
Arctanx=x−x33 +x55 −+· · · (−1< x≤1)松永良弼
1739小数点以下
49桁
.下記公式を 導き 利用:
π = 3
1 +41·26 +4·162··83·210+4·61·82··1032··1252·14+· · ·
W.Shanks 1873 Machin
の公式によ り 小数点以下
707桁計算
こ の計算があま り に圧巻だっ たので
,以後電子計算機の発明
ま で誰も 挑戦し よ う と する 者は居なかっ た
.Ludolph
の計算について
,正
262角形の半辺長:
123.14159265358979323846264338327950288395418471219027 cf. π
の真値:
3.14159265358979323846264338327950288419716939937510
ち ょ う ど
35桁ま で真値なので
,ど のよ う に答え たか興味深い!
松永の計算について
,松永の級数の値:
70
項ま での和:
3.141592653589793238462643383279502884197169398014488669322 78
項ま での和:
3.141592653589793238462643383279502884197169399375088142023 79
項ま での和:
3.141592653589793238462643383279502884197169399375101484119 80
項ま での和:
3.141592653589793238462643383279502884197169399375104756842
松永は
· · ·3751微強 と 記し て いる ので
,実際には
50桁計算し たと みて よ いであろ う
.本当に
80項計算し たのか
,それと も
関孝和の補外法のよ う な加速法を 援用し たのか ?
コ ン ビュ ータ によ る
πの計算
131949
世界最初
(?)の電子計算機
ENIAC (1946)で
2037桁
(70時間
).
Shanksの値の
528桁以降が誤っ て いる のを 発見
1961 D.Shanks-J.W.wrench
IBM 7090
によ り
10万桁
(約9 時間
) 1967 Guilloud-DichamptCDC 6600
によ り
50万桁
(約
28時間)
1973 Guilloud-Bouyer
CDC 7600
によ り
100万桁
(約
23時間)
1981
三好
-金田
FACOM M-200によ り
200万桁
(約
137時間)
1983
後
-金田
HITAC S-810/20で
1000万桁( 約
24時間)
1985 Gosper
Symbolics 3670
によ り
1752万桁
(約
28時間? )
1986 BaileyCRAY-2
によ り
2936万桁
(約
28時間)
1988
金田
-田村
HITAC S-820/80で2 億桁( 約
35時間)
1989 G.V.Chudnovsky
IBM-3090
で
10億桁( 2 ヶ 月? )
1991 G.V.Chudnovsky自家製計算機で
22億桁( ? )
1995
高橋
-金田
HITAC S-3800/480で
64億桁( 約
117時間)
1996 G.V.Chudnovsky
自家製計算機で
80億桁( 一週間? )
1997高橋
-金田
HITAC SR2201で
515億桁( 約
29時間)
1999
高橋
-金田
HITAC SR8000で
2000億桁( 約
37時間)
2002.12.6
金田
&日立チーム
SR8000/MPPで
1兆
2411億桁
(約
600時間
) ENIACの計算は
Machinの項式を 用いて いたが
,現在では
,算術幾何平均の改良型を 用いる :
2)a0 =a= 1, b0 =b= 1/√2
を 初項と する 二つの数列を
an= an−1+bn−12 , bn=p
an−1bn−1
で定める と き
, π= limn→∞
2anbn 1−
n
X
j=0
2j(a2j−b2j)
精度保証計算
14精度保証計算と は
,実数
xを 有限浮動小数で近似する と き
,x0< x < x1
と 上下から 挟むこ と によ り
,最終的な答の誤差の大き さ を 保証付き で与え る も の
.昔は区間演算と 呼んだ
.実現する には
,非常に計算量がかかり
,非実用的だっ た
.粗い計算だと
,演算の度に区間がど んど ん大き く な り
,すぐ に挟んでも 意味の無いよ う な 大き さ に区間が広がっ て し ま う
.最近の
CPUは切り 捨て
,切り 上げのモード 変更ができ る ので
,それぞれのモード で1 回ずつ同じ 計算を する だけで
, i.e.普通の計算の2 倍の計算量で精度保証が可能と なる
.う ま く 使う と
,数学の定理の実用的証明の道具と な る
CPUの丸めモード :
通常
, CPUは正し い計算値を 維持する ため
,少し 多めの桁で計算し
,結果を 返すと き に対応する 変数のフ ォ ーマ ッ ト に合わせて 丸める
.デフ ォ ールト は四捨五入
Near, i.e.指定のフ ォ ーマ ッ ト で表現可能な最も 近い値に丸める
.こ の他に
,切り 上げ
Up,切り 捨て
Down,0 に最も 近い値
Tozero,の 計4 種が選択可能
.こ れら は実数の集合
Rから 表現可能な浮動小数の集合
Fへの写像と し て
, IEEE754でき ち んと 規定さ れて いる
.Near(-x)=-Near(x), 15
Up(-x)=-Down(x),Down(-x)=-Up(x), x
が表現可能浮動小数なら
任意の丸め方
Marumeについて
Marume(x)=x,演算
?∈{+, -, *, /}の全て について
Marume(x?y)=Marume(x)?Marume(y)0
Down UpNear Tozero Down Up
Tozero Near
1 2
−1
sqrt
ま では
IEEE754に規定がある が,
exp,
sinなど , 他の組み込み函数について は規定が無いので,
CPU
の丸めモード を
UPや
DOWNに変え ただけでは,
上下から 挟める かど う かは現状では期待でき な い.
=⇒
自分で書く か
, Matlabなど のソ フ ト に組み込ま れたも のを 利用する し かない
.例: 計算機では
0.1を
10回足し て も
1になら ない
(cf.藤代先生の基礎講義
),と いう のを 種々 のモード で実験し て みる
.最近接丸め
(四捨五入
)方式
(標準
)のと き
s=1.000000000000000e-01 = 9A 99 99 99 99 99 B9 3F P10
i=1s=9.999999999999999e-01 = FF FF FF FF FF FF EF 3F
上への丸め
(切り 上げ
)方式を 指定し たと き
s=1.000000000000000e-01 = 9A 99 99 99 99 99 B9 3F P10
i=1s=1.000000000000001e+00 = 03 00 00 00 00 00 F0 3F
下への丸め
(切り 捨て
)方式を 指定し たと き
s=9.999999999999999e-02 = 99 99 99 99 99 99 B9 3F P10
i=1s=9.999999999999998e-01 = FE FF FF FF FF FF EF 3F
ケプラ ーの問題
—数値計算を 証明に用いた最初の例
16球を 空間にでき る だけ密に詰める 方法は
,果物屋さ んがオレ ン ジを 積んでいる やり かただろ う
. (Kepler 1611)不思議なこ と に
,最下層の一段の並べ方が図
aでも 図
bでも
,その後に無駄無く 積み上げて でき た結果は3 次元的には同じ にな る ! 図
cは
William Barlow (1845–1934)によ る その説明図
.図
a図
b図
cこ れよ り 詰めら れないこ と を
, Keplerが予想し て 以来約
400年振り に
Thomas C. Hales (1998)が精度保証付き 数値計算によ り 証明し た
. (F. T´othが有限個のパラ メ ータ の最小問題に変換し て いた
.その最小解は
, Kepler問題の解の空間充填率を 主要項と する 漸近式を 持つ
. Halesはその誤差項を 改良し
,それを 厳密に評価する こ と によ り
,理論的最小解と
Kepler予想の解が一致する こ と を 示し た
. )現実の
CPUでの精度保証計算
17INTEL x86
の場合:
(プロ グラ ム見本
roundx86.c)CPU
のモード を 保持する レ ジスタ ー
(CWで表さ れる
)の第
10,11ビッ ト が 丸めのモード を 制御し て いる .
(第
8,9ビッ ト は精度を 制御.
)下記の函数
(イ ン ラ イ ン アセン ブラ
)は
__fldcw,__fnstcwの名前で
fenv.hに定義さ れて いる ので, こ れを イ ン ク ルード する だけでも よ い.
void setround(int mode){
__asm __volatile ("fldcw %0" : : "m"(mode)) }
int getround(int *mode)
__asm("fnstcw %0" : "=m" (*(mode))) return *mode;
}
#define FE_TONEAREST 0x0000
#define FE_DOWNWARD 0x0400
#define FE_UPWARD 0x0800
#define FE_TOWARDZERO 0x0c00
AMD64
互換の
64ビッ ト マ シン では, 上のデータ は共通だが,
10
バイ ト 長の
long doubleで実験し ないと 差が見え ない.
PowerPC
の場合:
(プロ グラ ム見本
roundppc.c) C言語用のラ イ ブラ リ 函数が用意さ れて いる .
typedef unsigned long fenv_t;void fesetenv(const fenv_t *); /*
丸めモード 設定
*/void fegetenv(fenv_t *); /*
丸めモード 問い合わせ
*/#define FE_TONEAREST 0x00000000
#define FE_TOWARDZERO 0x00000001
#define FE_UPWARD 0x00000002
#define FE_DOWNWARD 0x00000003
roundppc.c
は現在のイ ン テルマ ッ ク では, コ ン パイ ルし て も 正常に 動かない. 昔の
Power Macでコ ン パイ ルさ れたバイ ナリ
roundppcが,
エミ ュ レ ーショ ン で正し く 動く ので, こ れで
PowerPCを 味わっ て く ださ い.
本日の講義内容の自習課題
181 Kerosoft
社の多倍長演算ラ イ ブラ リ を 使っ て みる .
inflib.f,infdec.f
がラ イ ブラ リ で
, exp.f,log.f,tri.fなど が それを 利用し たプロ グラ ムである
.コ ン パイ ル例:
g77 -c infdec.f inflib.f
g77 log.f inflib.o infdec.o -o log ./log
2 GMP
を 使っ た
Cプロ グラ ム例を 実行し て みる
.コ ン パイ ルの仕方は
gcc gmptest.c -lgmp -o gmptest ./gmptest
3 CPU
の丸めモード を 変更する 実験を し て みる
. roundx64.cは
, gccで普通にコ ン パイ ルでき る
.roundppc.c
の方はコ ン パイ ルでき ないので,
roundppcを 実行する だ けにせよ .
PowerMac
を 持っ て いる 人は
roundppc.cを 持ち 帰っ て コ ン パイ ル・ 実行し て みよ
.同様に,
32ビッ ト の
Intel CPU用の
roundx86.cは5 階ではコ ン パイ ルはでき る が
実行し て も 何も 変わら ない. こ れは,
CPUが丸めを
80ビッ ト でやっ て いる ため,
64
ビッ ト に落と し たと き に, みな同じ 値になっ て し ま う ためのよ う で ある .
32
ビッ ト
Windows機を 持っ て いる 人は
roundx86.cを 持ち 帰っ て
コ ン パイ ル・ 実行し て みよ
.本日の範囲のプロ グラ ム練習問題
19問題
12.1 Kerosoft社の多倍長演算ラ イ ブラ リ を 使っ て
x−cosx= 0の解を
100桁近似計算せよ .
問題
12.2 C言語で次の
Machinの級数を 実装し
, πを
1000桁計算せよ :
π= 1615− 1
3·53 +· · ·+ (−1)n
(2n+ 1)·52n+1 +· · ·
−4 1 239 −1
3 1
2393 +· · ·+ (−1)n 2n+ 1
1
2392n+1 +· · · .
[ こ れは次問の多倍長演算ラ イ ブラ リ を 構築し なく て も 単独で解ける
.] 問題
12.3 GMPを 利用し て 何か興味を 持っ た数を
100桁計算し て みよ .
(
例え ば
,第5 回の課題に有っ た
sinx=x2の正の解など
.)問題
12.4多倍長数の加減乗算を 実行でき る ラ イ ブラ リ を
C言語で作れ
.それを 用いて
√2