2016-12-05 2 views
0

Ich erhalte in diesem Teil des Codes einen Gleitkommaüberlauffehler. Kann jemand von euch mir helfen, den Grund herauszufinden?Gleitkommaüberlauf

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

Einige IMPLICIT NONE und ein aktuelles Programm kann helfen. Ich beginne mit einem Zwischenprodukt der Sachen rechts von der Summe = Summe +. Dann, wenn/wenn k groß wird, möchten Sie vielleicht, dass die Summe ein Double (* 8) des Produkts ist ein Float (* 4). Da SUM ein intrinsischer Wert ist, würde ich die 'Summe' in MySum umbenennen oder eine Array-Dimension (0: 1000) haben und SUM (MySum) verwenden. Warum würden Sie das Array bei 0 starten? 1001 Punkte scheinen merkwürdig. Die (n * pi * pi) und die (2 * n * pi) und (n * pi) könnten A, B und C oder Parameter vorberechnet werden und dann ist es schneller und sieht sauberer aus. – Holmz

+1

Willkommen bei Stack Overflow. Sie sollten ein komplettes Programm zeigen und beschreiben, wie Sie es kompilieren und die tatsächliche Ausgabe zeigen, die Sie erhalten. Vergessen Sie nicht die Eingabedaten. Lesen Sie unbedingt die Hilfeseiten http://stackoverflow.com/tour http://stackoverflow.com/help/how-to-ask –

+1

Bitte nehmen Sie sich auch etwas Mühe, um Ihren Beitrag und Ihren Code richtig zu formatieren. Ich habe Ihrem Code einige grundlegende Einrückungen hinzugefügt. –

Antwort

4

Das Problem ist die mittelfristige dsinh(2*n*pi). Betrachten Sie k=1000. Dann n=2001 also müssen wir dsinh(2001*pi) auswerten, was ungefähr 0.5*exp(6286) oder über ist! Dies ist viel höher als jede Zahl, die mit doppelter Genauigkeit dargestellt werden kann. Sie müssen die Art, wie Sie die Summe berechnen, neu bewerten. Der Begriff dsinh(n*pi*x(i)) ist auch problematisch.

Meine Vermutung ist, dass für die robuste Auswertung des Quotienten dsinh(n*pi*x(i))/dsinh(2*n*pi) eine Art von aymptotischer Expansion erforderlich ist. Für 0<x(i)<2 sollte sich dieser Begriff wie exp(n*pi*(x(i)-2)) verhalten, da n groß wird. Dies wird sich gut benehmen.