アプリ版:「スタンプのみでお礼する」機能のリリースについて

プログラムで、
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となるのです!!
なぜか理由が分かりません。
桁落ち・・理由がさっぱりわからないので、分かる方教えて下さい。

A 回答 (6件)

とりあえずプログラムを全部見せて.

この回答への補足

こんな感じです。
お願いします。いつも、ご意見有難う御座います。
不必要な部分は消しています。(プログラム内容に支障はでませんので、以下で考えてください。)
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

補足日時:2008/10/29 19:38
    • good
    • 0

Eもreal*8なんですよね?


可能性としては、下記のどちらかです。
その1:E=1.0d0+a*(-1.0d0) で、Eが 0.0d0 となったと思ったのが勘違い
その2:E=1.0d0+a*(-1.0d0) で、このとき実はaが0d0じゃなくて1d0になっている

この回答への補足

どちらでもないです。
確認済みです。
他に考えありませんか?

補足日時:2008/10/29 19:32
    • good
    • 0

そのサブルーチンを


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文回避して、難を逃れていますが、疑問点なので、目潰ししたいと思っています。
皆様の知恵をお貸し下さい!!

補足日時:2008/10/29 23:40
    • good
    • 0

言語がなんなのかわからない(fortran?)ので、一般論ですが、


そういった場合は、とにかく症状が出る最小限のコードを見つけることです。
ごく単純なコードで症状が出ないのなら、そのコードにない部分に問題があるといえるわけで、それをつきつめていけば、いつかは原因が判明すると思います。
    • good
    • 0

>Eに関するコード部分でなくても、Eに影響及ぼすことってあるのでしょうか??



それはあり得ませんよね。
ただ、「Eに関するコード部分でないとあなたが思っているが実はEに関するコード部分」というのはEに影響を及ぼします。

いずれにせよ、可能性は#2に書いた2つ(ないしその変形)です。

現象のでないコードをいくら呈示されても原因の検討の付けようがないので、現象の出るコードを呈示してください。
    • good
    • 0

そもそも #1 の補足に書かれた部分って, E も cos も 1回も出てこないから検証のしようがないのでは?


だから「プログラムを全部見せて」って言ったのに....

この回答への補足

影響がないと思っていた部分で影響がありました。
ありがとうございました。
条件を絞っていって、問題を含む箇所の抽出をしていたら、わかりました♪

補足日時:2008/11/05 16:20
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!