program caused arithmetic error

게시판 IDL Q&A program caused arithmetic error

4 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #1788 Reply
      inmyta27
      회원

      % Program caused arithmetic error: Floating illegal operand 등 에러가 나며

      가령 M2=0.408557
      M4=0.0367701
      M6=0.00330931 일때

      eta=M4^2/(M2*M6) 을 계산하면 0.99999888…… 이지만 print를 하면 1로 인식을 합니다.

      그래서 이 뒤에 mu=2*(eta-1)
      aa=eta/mu
      라고 계산하게되면 aa는 -inf 로 뜨게 됩니다.

      mu에서 eta-1이 0이 되서 에러가 나는거 같은데
      혹시 eta를 1이 아닌 0.999처럼 원래 값이 찍히게 할수는 없는지 하여 글 올립니다.

    • #1789 Reply
      Sangwoo
      회원

      제가 IDL 8.3 버전에서 위의 내용과 같은 방법으로 테스트해본 바로는 aa의 값이 무한대가 아닌 제대로 된 값이 나옵니다. 혹시 어떤 버전의 IDL을 사용중이신가요? 아니면 임시 방편으로 M2, M4, M6 등의 변수값들을 일반 실수가 아닌 2배 정밀도 실수로 변환해서 계산해보는 것도 하나의 방법이 되지 않을까 합니다. 즉 eta 계산을 다음과 같이 해보는겁니다.

      eta=DOUBLE(M4)^2/(DOUBLE(M2)*DOUBLE(M6))

    • #1790 Reply
      inmyta27
      회원

      idl 8.3버전을 사용하고 있으며, 위에서 쉽게 설명하기위해 M2, M4,M6값을 지정해서 계산하는 방식으로 설명하였지만 실제로는 아래와 같이 M2, M4, M6가 계산됩니다.

      delta_d=0.2 ; [mm]

      M_2=fltarr(orb, ncount)
      M2=fltarr(orb)
      M_4=fltarr(orb, ncount)
      M4=fltarr(orb)
      M_6=fltarr(orb, ncount)
      M6=fltarr(orb)

      for aa=0, orb-1 do begin
      for i=0, ncount-1 do begin
      M_2[aa,i]=(d[aa,i]^2)*nd[aa,i]*delta_d
      M2[aa]=M2[aa]+M_2[aa,i]

      M_4[aa,i]=(d[aa,i]^4)*nd[aa,i]*delta_d
      M4[aa]=M4[aa]+M_4[aa,i]

      M_6[aa,i]=(d[aa,i]^6)*nd[aa,i]*delta_d
      M6[aa]=M6[aa]+M_6[aa,i]

      endfor ; for i
      endfor ; for aa

      위에서 계산된 M2,M4,M6 를 가지고 아래 eta, mu 계산에서 문제가 발생하여 알려주신대로 double을 썼을때와
      쓰지 않았을때의 값을 print 하였을때

      ;=== M246 moments ===

      ; eta=M4^2/(M2*M6)
      ; mu=((7-11*eta)-(eta^2+14*eta+1)^0.5)/(2*(eta-1))
      ; lamda=[(M2/M4)*(mu+3)*(mu+4)]^0.5
      ; No=(M2*lamda^(mu+3))/gamma(mu+3)

      eta=(M4^2)/(M2*M6) => 기존포맷
      eta=double(M4)^2/(double(M2)*double(M6)) => 알려주신 포맷

      두 각각의 포맷을 print 하였을때 둘다 1값을 프린트하며

      mu=((7-11*eta)-(eta^2+14*eta+1)^0.5)/(2*(eta-1))

      mu 값에서는 두 값이 서로 미세하지만 차이를 보였습니다.
      두 값모두 이론적으로 계산하였을때의 값과 차이를 보여 1)알려주신 방법을 사용하는 것이 맞는것인지 아님
      또다른 방법이 있는지 해서 다시 질문드립니다.
      2) 또한 위에서 구해진 mu를 통해 lamda, No가 계산되어지는데 아래 부분에서도 double을 써서 계산해야하는것이
      맞는지 궁금하니다. 알려주신 double을 쓰면 ‘program caused….’와 같은 에러명령어는 사라지고
      잘 수행되는데 값에 대한 신뢰성에 대해 판단이 잘 들지 않아서요 ㅠㅠ

      lamda=((M2/M4)*(mu+3)*(mu+4))^0.5
      No=(M2*lamda^(mu+3))/gamma(mu+3)

    • #1792 Reply
      Sangwoo
      회원

      그러면 애초에 배열들을 아예 double형으로 선언해서 계산해보는 것은 어떨까 합니다.

      M_2=dblarr(orb, ncount)
      M2=dblarr(orb)
      ~~~~~~~~~

    • #1794 Reply
      sando
      회원

      저도 처음부터 double 사용하실 것을 추천합니다~

4 답변 글타래를 보이고 있습니다
'program caused arithmetic error'에 답변달기
글쓴이 정보: