• 締切済み

fortran πについて

算術計算をするために、πを pi=4.0d0*datan(1.0d0) で、定数として置こうとしましたが、 エラーで『datanはThis intrinsic function is invalid in constant expressions.』と出てきました。 型はreal*8 で行いました。 どうしたら、定数として置けるのでしょうか??

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

少なくとも Fortran2003 の Final Committee Draft を見る限り, parameter 文/parameter 属性のどちらにおいても*ある種の*計算は可能です>#3. 例えば REAL, PARAMETER :: ONE = 1.0, Y = 4.1 / 3.0 とか PARAMETER (MODULUS = MOD (28, 3), NUMBER_OF_SENATORS = 100) という文が例として挙げられています. どちらも = のあとは initialization-expr で, しかも困ったことにこの initialization-expr の例に 4.0 * atan(1.0) が挙げられてます. まあ, 質問者の fortran というのがどの規格に対応しているかわかりませんから, Fortran2003 FCD の記述があてはまるかどうかわかりませんが.

  • fifaile
  • ベストアンサー率25% (622/2403)
回答No.3

parameterで宣言してるのかな? parameter文って数値指定だけで計算をすることはできなかったような。 OK parameter bai = 1000 NG parameter bai = 10**3

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

あ, すみません, とっても嘘つきました. ごめんなさい. Fortran 2003 の FCD を見てみたら 4.0 * atan(1.0) が初期化式として使えるって書いてありました. う~ん, ちょっとわからんけど datan がダメなだけなら総称名 atan を使って 4.0d * atan(1.0d) でいけそうな気もする.... 根拠は全くなし.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

その計算をしても Fortran的には (FORTRAN的にも) 定数じゃないからなぁ.... あきらめて, おとなしく pi = 3.141592653589793238d0 とか書くんでしょう.

BOY12345
質問者

補足

pi = 3.141592653589793238d0 だったら誤差気にならなくなりますかね~。 少数9桁まで、最終的に表示するので・・・ まぁ、気にはならなそうですね。 piをdatanで定義するのは無理ですかね? implicit real*8 (a-h,o-z)の定義でしてたときは、 特にことわり入れなくても、すんなりと受け入れてくれたのに☆ implicit noneは勉強になります。あやふやが通じないから。

関連するQ&A

  • Fortranの倍精度実数について

    こんにちは。 現在、Fortran 90でプログラムを作成しています。 その中で、整数の倍精度実数への型変換についての疑問がわきましたので、質問させていただきます。 以下の2つのプログラムで、計算がより速く、より精度よくできるのはAとBどちらなのでしょうか。 実際は下記のプログラムが、ループの中に入っているので少しでも計算時間を短くしたいのです。 よろしくお願いいたします。 program A(毎回dxを足す) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 j=1 do i=1, 1000 x(i)=x(j)+dx j=i write(*,*)x(i) end do ----------------------------- program B(毎回dx*ループ回数を計算する) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 do i=1, 1000 x(i)=dx*dble(i) write(*,*)x(i) end do -----------------------------

  • fortranでコンパイルできません。

    fortranの数値計算プログラムなんですが、コンパイルすると”GENERIC”という単語でエラーがでてしまいコンパイルできません。エラー内容はこれです『Unimplemented or invalid form of statement at (^) (this is a catchall diagnostic that currently applies to a wide variety of errors, including things like invalid ordering of statements and invalid reference to intrinsic procedure)』 どうすればいいのでしょうか・・・

  • fortran モンテカルロ法

    モンテカルロ法により円周率πを計算するプログラムを作ったのですが、以下のプログラムでモンテカルロ法から推定された円周率piの値が実行すると大きな数字になってしまって、うまく計算できてない見たです。式に問題があるのでしょうか?教えて下さい。 rogram list1_9 implicit none real(8) x, y, pi, pi0 integer :: n, i, im = 2**20 pi0 = 2.0d0*acos(0.0d0) n = 0 do i = i, im call random_number(x) call random_number(y) if(x ** 2 + y ** 2 <= 1.0d0) n = n + 1 enddo pi = 4.0d0*dble(n)/dble(im) write(*,*) ' pi, pi0, er = ', pi, pi0, pi-pi0 end program list1_9

  • Fortran77 (intel fortran)

    Fortran77のプログラムをIntel Fortran (ifort v14.0.1)でコンパイルした時、以下のワーニングがでます。 remark #8291: Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W>=D+7'. 100 FORMAT(12E9.3) --------------------------^ 100の書式はREAL*8で宣言された変数を書き出す時に使っています。 これは具体的にはどういう問題について警告しているのでしょうか? 環境はCentOS6.5 32bitにて実行しています。 よろしくお願いいたします。

  • fortranの整数と実数

    fortranに関する質問です. 型宣言を下のように行った上で,計算を行うと dが110ではなく,109と出力されるのですが,なぜでしょうか. dも実数で宣言しておくと110.0000と表示されます. こうなる理由と解決策をぜひお教えください. real a,b,c integer d a=33.0 b=3.0 c=0.1 d = (a/b)/c write(*,*) d

  • エラーがとれません 助けてください

    エラーがとれません 助けてください http://cs.fit.edu/~mmahoney/dist/eval4.cpp をコンパイルすると eval4.cpp: In member function ‘bool Attack::read(FILE*)’: eval4.cpp:105: error: ‘strlen’ was not declared in this scope eval4.cpp:114: error: ‘strchr’ was not declared in this scope eval4.cpp: In function ‘int main(int, char**)’: eval4.cpp:132: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:133: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:134: warning: deprecated conversion from string constant to ‘char*’ eval4.cpp:183: error: ‘strlen’ was not declared in this scope のようなエラーがでてしまいます。 Ubuntuのg++でコンパイルしています。 なにがまずいのでしょうか?

  • fortranでx=1としても0.9..が入る

    fortranで以下のようなプログラムにてxに1.0^-6を代入し、 その中身を表示しました。 --------------------------------- program test real(8) :: x = 1.0d-6 write(*,*) x write(*,*) x * 1.0d6 write(*,*) int(x * 1.0d6) end program test --------------------------------- しかし、結果は以下のようになり、 0.999999999999999955^-6となってしまいます。 さらに、やっかいなことに10^6倍して 整数型に変換しても0と認識されてしまうのです。 ---------------------------------- $ ./a.exe 9.99999999999999955E-007 1.00000000000000000 0 ---------------------------------- 変数の型も倍精度で宣言し、定数も倍精度(d付き)で 代入しているはずなのですが、なぜこのような現象が 起きるのでしょうか。 ご存知の方いましたら教えて頂けると助かります。 なお、コンパイルはgfortranで行っています。

  • fortran グラムシュミットの直行化

    グラムシュミットの直行化を行うプログラムを書いたのですが、実行結果の答えで2列目1行目の答えがマイナスになるはずなのになっていません。自分の計算ではマイナスになったのですが、プログラムに問題があるのでしょうか?教えて下さい。よろしくお願いします。 module subprogs implicit none contains function normal_vec2(v,n) result(nv) integer, intent(in) :: n real(8), intent(in) :: v(n) real(8) nv(n), vl vl = sqrt(dot_product(v,v)) if (vl == 0.0d0) then nv(:) = 0.0d0 else nv(:) = v(:) / vl endif end function normal_vec2 end module subprogs module subprogs2 use subprogs implicit none contains function gs(a,n) result(e) integer, intent(in) :: n real(8), intent(in) :: a(n,n) real(8) e(n,n), dotp integer k, j e(1:n,1) = normal_vec2(a(1:n,1:1),n) do k = 2, n e(1:n,k) = a(1:n,k) do j = 1, k-1 dotp = dot_product(a(1:n,k),e(1:n,j)) e(1:n,k) = e(1:n,k)-dotp*e(1:n,j) enddo e(1:n,k) = normal_vec2(a(1:n,k:k),n) enddo end function gs end module subprogs2 program main use subprogs use subprogs2 implicit none real(8), allocatable :: q(:,:) integer :: n = 2 allocate(q(n,n)) q(1,1:2) = (/2.0d0,1.0d0/) q(2,1:2) = (/1.0d0,2.0d0/) write(*,*) gs(q,n) end program main 実行結果 0.8944271909999159 0.4472135954999579 0.4472135954999579 0.8944271909999159                   ↑                             実計算では-(マイナス)がつく

  • fortran sqrtコンパイルエラー

    プログラムを書き直していて以下の様なエラーが出てしまいます。 以前sqrt関数を書いたときは以下の様なエラーは出てこなかったのですが、最近やたらFunctionのエラーがよく出ます。コンパイルに問題があるのでしょうか?自分のコンパイルを調べるにはどうしたらわかるのでしょうか?よろしくお願いします。 In file init.f90:52 rf = sqrt((nx-5)**2+(ny-5)**2+(nz-5)**2) 1 Error: Type of argument 'x' in call to 'sqrt' at (1) should be REAL(4), not INTEGER(4) In file init.f90:52 rf = sqrt((nx-5)**2+(ny-5)**2+(nz-5)**2) 1 Error: Function 'sqrt' at (1) has no implicit type

  • There is nothing in this

    There is nothing in this world constant, but inconstancy. これを和訳してください。

専門家に質問してみよう