AW: Was heißt unterbricht
17.01.2012 15:04:52
Harald
Hallo Ludwig,
leider kenne ich nicht die Werte der Übergabeparameter.
Zunächst fällt auf, dass der Rückgabetyp der Funktion nicht definiert ist. Normalerweise müsste das prinzipiell so aussehen:
Function x() As Typ
End Function
Wobei "Typ" der Typ des Funktionsergebnisses ist, also bei Dir das, was in der Zeile
redFlaechentraegheit = (Z_118 - Zwert) / 1000000000000#
berechnet wird (single oder double?).
Zum Testen habe ich die Funktion mal als Subroutine umgeschrieben:
Sub test()
Dim Da As Single, _
Di As Single, _
Dlk As Single, _
Db As Single, _
nB As Single
Const Pi = 3.14
Dim Zwert, Z_118, Z_119, Z_121 As Single
Dim Zaehler As Integer
Dim redFlaechentraegheit As Double
nB = 254
Zwert = 0
Z_118 = Pi / 64 * (Da ^ 4 - Di ^ 4)
Z_119 = Pi / 64 * Db ^ 4
For Zaehler = 1 To nB Step 1
Z_121 = Z_119 + (Pi / 4 * Db ^ 2 * (Abs(Cos(Zaehler * 360 / nB * Pi / 180) * Dlk / 2)) ^ 2)
Zwert = Zwert + Z_121
Debug.Print "redFlaechentraegheit =" & (Z_118 - Zwert) / 1000000000000#
Debug.Print "Zähler =" & Zaehler
Next Zaehler
redFlaechentraegheit = (Z_118 - Zwert) / 1000000000000#
End Sub
Dabei hält bei mir der Debugger in der Zeile
Z_121 = Z_119 + (Pi / 4 * Db ^ 2 * (Abs(Cos(Zaehler * 360 / nB * Pi / 180) * Dlk / 2)) ^ 2)
mit einem Laufzeitfehler 6 (Überlauf) an. Der Zaehler ist in diesem Moment =92 !
Probier mal "Zähler" als Long zu deklarieren (statt Integer). Bei mir läuft die Subroutine dann über 92 weiter. Ob das Ergebnis stimmt, kann ich nicht verifizieren.
Übrigens täte es der Genauigkeit auch gut, wenn Du statt Single grundsätzlich Double verwenden
würdest. Der Fehler, der durch das Aufaddieren innerhalb der Schleife bei begrenzter Genauigkeit entsteht, ist dadurch nicht so groß.
Gruß
Harald