課題
Adamchik-Wagonの公式
円周率πについて次の公式が知られています.
無限級数の近似計算
無限級数の値を求めるために無限に項の和を計算し続けるわけにはいきません. そこで先頭から項を順に加えていって,項の大きさが十分小さくなるところで計算を打ちきって,無限級数の近似値を求めることにします. 具体的には,項の大きさがε未満になる最初の項まで計算して,初項からその項までの部分和で無限級数の値を近似することにします. 今回は十分小さい値ε=10-16とすることにします.
近似値の計算についての注意
課題では,上でも説明したとおり,無限級数に基づいてπの近似値を「項の大きさ」を利用して計算します. Rubyではπの近似値として「Math::PI」が定義されていますが,この課題では使いません. 正解を知らないものとして,近似値を計算するわけです(正解を知っているなら,わざわざ計算する必要はないですよね).
Tips
- べき乗(**)
xのn乗は次のように計算できます.x = 2.0 n = 3 y = x**n # y == 8.0なお今回のプログラムはこの演算子を使わなくても実現できます(もちろん利用して構いません). - 整数から小数への変換(to_f)
to_fメソッドで数値を整数から小数に変換できます.x = 2 y = x.to_f # y == 2.0なお上ではxの値(整数)を小数に変換するために「to_f」を使っています. - 整数/整数
Rubyでは整数同士の演算「/」は商を計算することに注意してください. 変数を使って整数と整数との間で除算を行いたい場合は上の「to_f」メソッドを利用します. なお整数リテラル(具体的な整数値)を含む場合は,その整数の表記に「.0」を付加して小数形式で記述すれば「to_f」を使う必要はありません.x = 5 y = x/2 # y == 2 z = x/2.0 # z == 2.5
- 絶対値(abs)
absメソッドで数値の絶対値が得られます.x = -2.5 y = x.abs # y == 2.5 - εの定義
数値は次のような形式で指定することもできます. 絶対値が大きな数値や小さな数値を指定するのに便利です.EPS = 1.0e-16 # EPS=10-16
プログラムの構成
今回のプログラムは,おおよそ次の通りの構成になるでしょう. まずε(EPS)を定義した後,それを使って円周率πの近似値を計算する処理を記述して,最後にその結果を表示するようにします. なおプログラムでメソッドを定義して活用することも考えられます. その場合は先にメソッドを定義してから,そのメソッドを呼び出すようにする必要があります.
=begin 所属: 氏名: 学生番号: 難易度(5段階評価): 感想など(任意) =end # εの定義(定数) EPS = 1.0e-16 # πの近似値の計算 # 計算する近似値をpiとする # ここではまずpiの値を0に初期化しておく pi = 0 : : # 結果の表示 puts "πの近似値=#{pi}"
[参考] 近似の精度
今回のプログラムで得られる円周率の近似値は,コンピュータ内部での一般的な数値データの表現から,ごく限られた精度でしか得られません.
専門の分野では円周率は小数点以下数兆桁まで計算されています. そのような計算は今回のプログラムのように単純に一つの数値データを使って行うわけではありません.
Rubyでは「BigDecimal」というライブラリによって長い桁数の計算がサポートされています. 課題で試してみてみるとよいかもしれません.
require 'bigdecimal'
N=100
EPS=BigDecimal("1.0e-#{N}") # BigDecimalは文字列で値を設定します.
# 値を決めてBigDecimalの変数を設定
x = BigDecimal('-4') # x = -4
y = BigDecimal('2') # y = 2
# 計算精度N桁の四則演算
z = x.add(y,N) # z = x + y
z = x.sub(y,N) # z = x - y
z = x.mult(y,N) # z = x * y
z = x.div(y,N) # z = x / y
# 大小比較は通常の数値と同様
x < y # ==> true
x > y # ==> false
# 絶対値
z = x.abs # z = 4
# zの値を文字列として取り出す(指数形式になる).
a = z.to_s
日置尋久(HIOKI Hirohisa)
Last modified: Sun Nov 02 15:50:23 JST 2025