- 締切済み
0*(-1)=-1になる理由とは!?
プログラムで、 real*8 :: a=0.0d0 real*8 :: theta E=1.0d0+a*cos(theta) で、thetaが-piの時、cos(theta)=-1.0d0と表示されます。 そして、次が問題です。 E=1.0d0+a*(-1.0d0)=0.0d0となるのです!! なぜか理由が分かりません。 桁落ち・・理由がさっぱりわからないので、分かる方教えて下さい。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
そもそも #1 の補足に書かれた部分って, E も cos も 1回も出てこないから検証のしようがないのでは? だから「プログラムを全部見せて」って言ったのに....
- notnot
- ベストアンサー率47% (4901/10362)
>Eに関するコード部分でなくても、Eに影響及ぼすことってあるのでしょうか?? それはあり得ませんよね。 ただ、「Eに関するコード部分でないとあなたが思っているが実はEに関するコード部分」というのはEに影響を及ぼします。 いずれにせよ、可能性は#2に書いた2つ(ないしその変形)です。 現象のでないコードをいくら呈示されても原因の検討の付けようがないので、現象の出るコードを呈示してください。
- titokani
- ベストアンサー率19% (341/1726)
言語がなんなのかわからない(fortran?)ので、一般論ですが、 そういった場合は、とにかく症状が出る最小限のコードを見つけることです。 ごく単純なコードで症状が出ないのなら、そのコードにない部分に問題があるといえるわけで、それをつきつめていけば、いつかは原因が判明すると思います。
- notnot
- ベストアンサー率47% (4901/10362)
そのサブルーチンを real*8 :: a call func_eta2(a, a, a, 23,0) end で呼ぶと、 23 0 val4gusaival_eta -1.00000000000000000 0.0000000000000000 1.00000000000000000 と、問題ありません。書いてないところに問題があるようです。
補足
書いてないところに問題があるようです。 >Eに関するコード部分でなくても、Eに影響及ぼすことってあるのでしょうか?? 仮にあるとしたら、なぜ、それは影響するのでしょうか?? 質問返しで申し訳ありませんが、他の部分に違いがあるとは思えないし(Eに関連したコードでないから)、既述したコードに間違いがあるとも思えません。なので、不思議なのです。 暫定的にif文回避して、難を逃れていますが、疑問点なので、目潰ししたいと思っています。 皆様の知恵をお貸し下さい!!
- notnot
- ベストアンサー率47% (4901/10362)
Eもreal*8なんですよね? 可能性としては、下記のどちらかです。 その1:E=1.0d0+a*(-1.0d0) で、Eが 0.0d0 となったと思ったのが勘違い その2:E=1.0d0+a*(-1.0d0) で、このとき実はaが0d0じゃなくて1d0になっている
補足
どちらでもないです。 確認済みです。 他に考えありませんか?
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえずプログラムを全部見せて.
補足
こんな感じです。 お願いします。いつも、ご意見有難う御座います。 不必要な部分は消しています。(プログラム内容に支障はでませんので、以下で考えてください。) subroutine func_eta2(theta,val_eta,val_Deta,ix,iy) implicit none * INTEGER :: ix,iy !デバッグ作業のためのix,iy real*8 :: val_eta,val_Deta real*8 :: theta,the,theta1,theta2,c,s,pi,theta0 real*8 :: val,theta_m real*8,PARAMETER :: gusai =0.0d0 real*8,PARAMETER :: k =2.0d0 real*8 :: val1,val2,val3,val4,val5,val6,val7,val8,val9 pi=4.0d0*datan(1.0d0) val4=-1 val_eta=1.0d0+gusai*val4 * check if( 23 .le. ix .and. ix .le. 30) then if( 0 .le. iy .and. iy .le. 5) then write(6,*) ix,iy write(6,*) 'val4','gusai','val_eta' write(6,*) val4,gusai,val_eta end if end if if( 2 .le. ix .and. ix .le. 3) then if( 0 .le. iy .and. iy .le. 35) then write(6,*) ix,iy write(6,*) 'val4','gusai','val_eta' write(6,*) val4,gusai,val_eta end if end if * return end
補足
影響がないと思っていた部分で影響がありました。 ありがとうございました。 条件を絞っていって、問題を含む箇所の抽出をしていたら、わかりました♪