2016-12-05 9 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 и действительная программа могут помочь. Я получил dstart с промежуточным продуктом материала справа от суммы = sum +. Тогда, если /, когда k становится большим, вы можете захотеть, чтобы сумма была двойной (* 8) продукта - float (* 4). Поскольку СУМ является неотъемлемой частью, я бы переименовал «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 становится большим. Это будет хорошо себя вести.

Смежные вопросы