Fortran初心者です。少々スクリプトがみにくいかもしれませんがお許しください。
関数chr(p,q)はp=qまたはpとqの差が±3であるときに1、それ以外で0をとる関数です。ただしp,qは整数とします。
例
chr(-1,-1)=1
chr(0,0)=1
chr(1,2)=0
chr(2,3)=0
-1≦p≦3,-1≦q≦3の範囲でpとqを変化させるプログラムをFortranで作ってみました。
Fortran
1program zheevtest 2 implicit none 3 4 interface 5 function chr(p,q) 6 implicit none 7 real :: chr 8 integer :: p,q 9 end function chr 10 11 end interface 12 13 14 write(*,*) chr(-1,-1) 15 write(*,*) chr(-1,0) 16 write(*,*) chr(-1,1) 17 write(*,*) chr(-1,2) 18 write(*,*) chr(-1,3) 19 write(*,*) 20 21 write(*,*) chr(0,-1) 22 write(*,*) chr(0,0) 23 write(*,*) chr(0,1) 24 write(*,*) chr(0,2) 25 write(*,*) chr(0,3) 26 write(*,*) 27 28 write(*,*) chr(1,-1) 29 write(*,*) chr(1,0) 30 write(*,*) chr(1,1) 31 write(*,*) chr(1,2) 32 write(*,*) chr(1,3) 33 write(*,*) 34 35 write(*,*) chr(2,-1) 36 write(*,*) chr(2,0) 37 write(*,*) chr(2,1) 38 write(*,*) chr(2,2) 39 write(*,*) chr(2,3) 40 write(*,*) 41 42 write(*,*) chr(3,-1) 43 write(*,*) chr(3,0) 44 write(*,*) chr(3,1) 45 write(*,*) chr(3,2) 46 write(*,*) chr(3,3) 47 write(*,*) 48 49 end program zheevtest 50 51 52function chr(p,q) 53 implicit none 54 integer :: chr 55 integer,intent(in) :: p,q 56 integer :: d 57 58 d=3 59 60 if(p==q .or. p==q-3 .or. p==q+3 .or. q==p+3 .or. q==p-3) then 61 chr=1 62 else 63 chr=0 64 end if 65 66return 67end function chr
すると、出力は次のようになります。
0.0000000E+00
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
ほとんどは意図した結果になっているのですが、納得がいかないところが1点あります。それはchr(-1,-1)が1ではなくて0であるとなっている点です。そこでこのソースコードをよく見なおしてみると、関数chr内のif条件文
Fortran
1p==q .or. p==q-3 .or. p==q+3 .or. q==p+3 .or. q==p-3
は
Fortran
1p==q .or. p==q-3 .or. p==q+3
と同値であるから、この部分を直してもう一度プログラムを実行すると、無事に
** 1.000000 **
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
0.0000000E+00
0.0000000E+00
1.000000
とchr(-1,-1)が1であると出力されます。これはいったいどういうことなのでしょうか。
###質問
A1,A2,…,Anを命題とします。
A1またはA2またはA3または…Anというのは、「A1,A2,…,Anの1つ以上が真」であれば真であると思います。そのため、ifの条件文に同値な命題があっても実行される内容は同じだと思うのですが、上のようなことはなぜ起きてしまったのでしょうか・・・。またこういったことは他のプログラミング言語でも生じますか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/02 00:28 編集
2016/11/02 10:24
2016/11/03 00:00