2016-12-05 6 views
0

이 코드 부분에서 부동 소수점 오버플로 오류가 발생합니다. 당신들 중 누구라도 그 이유를 찾도록 도와 줄 수 있습니까?부동 소수점 오버플로

do j=1,ny-1 
    do i=1,nx-1 

    sum = 0.0d0 

    do k=0,1000 
     n=2.0d0*dfloat(k)+ 1.0d0 
     sum = sum + ((dsinh(n*pi*x(i))*dcos(n*pi*y(j)))/((n*n*pi*pi)*dsinh(2*n*pi))) 
    end do 

    ue(i,j)= (x(i)/(4.0d0))- 4.0d0*sum 

    end do 
end do 
+2

일부 IMPLICIT NONE 및 실제 프로그램이 도움이 될 수 있습니다. 저는 sum = sum +의 오른쪽에있는 물건의 중간 생성물을 가지고 dstart를 겁니다. 그런 다음 k가 커지면 합계를 float (* 4)로 곱하면됩니다 (* 8). SUM이 내장이므로 'sum 'to MySum의 이름을 바꾸거나 배열 차원 (0 : 1000)을 사용하고 SUM (MySum)을 사용합니다. 왜 0에서 배열을 시작하겠습니까? 1001 점이 이상하게 보입니다. (n * pi * pi)와 (2 * n * pi) 및 (n * pi)는 사전 계산 된 A, B 및 C 또는 매개 변수 일 수 있으며 더 빠르며 더 깨끗 해집니다. – Holmz

+1

스택 오버플로에 오신 것을 환영합니다. 전체 프로그램을 보여주고 컴파일하는 방법을 설명하고 실제 출력을 보여줘야합니다. 입력 된 데이터를 잊지 마십시오. 도움말 페이지 http://stackoverflow.com/tour http://stackoverflow.com/help/how-to-ask –

+1

게시물과 코드의 형식을 올바르게 지정하기 위해 노력하십시오. 나는 당신의 코드에 약간의 들여 쓰기를 적용했다. –

답변

4

문제는 중간 용어 dsinh(2*n*pi)입니다. k=1000을 고려하십시오. 그런 다음 n=2001이므로 dsinh(2001*pi)이 약 0.5*exp(6286) 이상이거나 10^2700 이상이어야합니다. 이것은 배정도로 표현할 수있는 어떤 숫자보다 훨씬 큽니다. 합계를 계산하는 방식을 재평가해야합니다. 용어 dsinh(n*pi*x(i))도 문제가 있습니다.

내 생각에 어떤 종류의 의사 장애 확장은 몫 dsinh(n*pi*x(i))/dsinh(2*n*pi)의 강력한 평가에 필요합니다. 0<x(i)<2의 경우이 단어는 exp(n*pi*(x(i)-2))으로 동작해야 n이 커집니다. 이것은 잘 행동 할 것입니다.