コンピュータ上での円周率πの与え方
2011年 06月 24日
コンピュータ上での円周率πの与え方…といってもMicrosoft Excelにおいて「 PI() 」と入力する、っていう話ではありません(笑)
・ 4.0 * arctan(1.0) = 3.141592…
・ 6.0 * arcsin(0.5) = 3.141592…
・ arccos(-1.0) = 3.141592…
というように、いくつかの表し方があります。
私は最初に覚えたのが arccos だったこともあり通常は arccos 使っていますが、パフォーマンスの違いはあるのでしょうか? arctan(1.0)でπ/4を求める方法は級数(Leibnizの公式)の収束が遅いとか聞いたこともありますが、倍精度程度の通常の使用に関して今の計算機能力では差がないというのが私の印象です。何百万桁以上も求める人にとっては有為な差があるのかもしれませんが。
例えば、Fortran90で
program pi
implicit none
real(8) :: pi1, pi2, pi3
real(8) :: t0, t1, t2, t3
call cpu_time( t0 )
pi1 = 4.0d0*datan(1.0d0)
call cpu_time( t1 )
pi2 = 6.0d0*dasin(0.5d0)
call cpu_time( t2 )
pi3 = dacos(-1.0d0)
call cpu_time( t3 )
write(6,*) 'atan: ', pi1, ', ', t1-t0, 'sec.'
write(6,*) 'asin: ', pi2, ', ', t2-t1, 'sec.'
write(6,*) 'acos: ', pi3, ', ', t3-t2, 'sec.'
stop
end program pi
のような非常にプリミティブなコードを書いて実行すると、実行する度にタイミングが変わると思います。また、演算の順序を入れ替えても変わると思います。コンパイラや実行環境にも寄るのでしょうが、私がMacBook Air (Late2010, Core2Duo 1.86GHz) + gfortran で試した場合はそうでした。
・ 4.0 * arctan(1.0) = 3.141592…
・ 6.0 * arcsin(0.5) = 3.141592…
・ arccos(-1.0) = 3.141592…
というように、いくつかの表し方があります。
私は最初に覚えたのが arccos だったこともあり通常は arccos 使っていますが、パフォーマンスの違いはあるのでしょうか? arctan(1.0)でπ/4を求める方法は級数(Leibnizの公式)の収束が遅いとか聞いたこともありますが、倍精度程度の通常の使用に関して今の計算機能力では差がないというのが私の印象です。何百万桁以上も求める人にとっては有為な差があるのかもしれませんが。
例えば、Fortran90で
program pi
implicit none
real(8) :: pi1, pi2, pi3
real(8) :: t0, t1, t2, t3
call cpu_time( t0 )
pi1 = 4.0d0*datan(1.0d0)
call cpu_time( t1 )
pi2 = 6.0d0*dasin(0.5d0)
call cpu_time( t2 )
pi3 = dacos(-1.0d0)
call cpu_time( t3 )
write(6,*) 'atan: ', pi1, ', ', t1-t0, 'sec.'
write(6,*) 'asin: ', pi2, ', ', t2-t1, 'sec.'
write(6,*) 'acos: ', pi3, ', ', t3-t2, 'sec.'
stop
end program pi
のような非常にプリミティブなコードを書いて実行すると、実行する度にタイミングが変わると思います。また、演算の順序を入れ替えても変わると思います。コンパイラや実行環境にも寄るのでしょうが、私がMacBook Air (Late2010, Core2Duo 1.86GHz) + gfortran で試した場合はそうでした。
by kingrabbit
| 2011-06-24 20:13
| Fortran関連