[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題13] 円周率の近似計算 ]

[課題13] 円周率の近似計算

課題

以下に示すAdamchik-Wagonの公式を利用して,円周率の近似値を計算するプログラムを作成して提出してください.

Adamchik-Wagonの公式

円周率πについて次の公式が知られています.

Adamchik-Wagon formula

無限級数の近似計算

無限級数の値を求めるために無限に項の和を計算し続けるわけにはいきません. そこで先頭から項を順に加えていって,項の大きさが十分小さくなるところで計算を打ちきって,無限級数の近似値を求めることにします. 具体的には,項の大きさがε未満になる最初の項まで計算して,初項からその項までの部分和で無限級数の値を近似することにします. 今回は十分小さい値ε=10-16とすることにします.

近似値の計算についての注意

課題では,上でも説明したとおり,無限級数に基づいてπの近似値を「項の大きさ」を利用して計算します. Rubyではπの近似値として「Math::PI」が定義されていますが,この課題では使いません. 正解を知らないものとして,近似値を計算するわけです(正解を知っているなら,わざわざ計算する必要はないですよね).

Tips

プログラムの構成

今回のプログラムは,おおよそ次の通りの構成になるでしょう. まずε(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

[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2025) >  [課題13] 円周率の近似計算 ]