Kann VB nicht rechnen oder ich nicht?

Hallo Programmierer,
habe so meine Probleme mit VB:
Mit dem Datentyp Single habe ich eine Funktion geschrieben, die mir den Durchschnitt und die Standardabweichung von mehreren 100 Single Werten ausrechnen soll. Diese Werte stehen in einer Tabelle, die ich dann wieder auslese.
Nun habe ich festgestellt, daß bei größeren Zahlen (so um die 100.1234567) ein Fehler auftritt und VB nicht richtig rechnet, der Durchschnitt kommt immer falsch heraus. Beachtet habe ich, durch die richtige Anzahl zu teilen und Datentyp Double habe ich ebenfalls schon versucht.)
Bei Zahlen bis ca. 50 kommt das richtige Ergebnis raus, ab ca. 100 wirds falsch.
(Benutze VB6.0 Einsteiger Version)
Kann VB nicht rechnen oder ich nicht?
–> Falls Vb nicht richtig rechnen kann - hat jemand eine Adresse für einen Patch?

Vielen Dank im Voraus für Antworten.
Gruß Helmut

Hallo Helmut,
ich denke, VB wird seine Hausaufgaben gemacht haben :smile:

Ich würde auf folgende mögliche Fehlerursachen prüfen:

  • generell: Fehler, den Du durch ein „on error resume next“ nicht mitbekommst ?
  • Variablenüberlauf ?
  • Schreibst Du irgendwo eine Gleitkommazahl in einen int oder long ? Dadurch Rundungsfehler ?

Gruß
Matthias

Hallo Helmut,

Mit dem Datentyp Single habe ich eine Funktion geschrieben,
die mir den Durchschnitt und die Standardabweichung von
mehreren 100 Single Werten ausrechnen soll. Diese Werte stehen
in einer Tabelle, die ich dann wieder auslese.
Nun habe ich festgestellt, daß bei größeren Zahlen (so um die
100.1234567) ein Fehler auftritt und VB nicht richtig rechnet,
der Durchschnitt kommt immer falsch heraus. Beachtet habe ich,
durch die richtige Anzahl zu teilen und Datentyp Double habe
ich ebenfalls schon versucht.)
Bei Zahlen bis ca. 50 kommt das richtige Ergebnis raus, ab ca.
100 wirds falsch.

Was bedeutet „Richtig“ und was ist „Falsch“ ???

Single haben eine Genaugkeit von 6-7 Stellen, Double ca 14 auch wenn mehr Stellen angezeigt werden.
Da gehen halt bei mehreren Multiplikationen schon einige Stellen
an Genauigkei verloren.
Wurzeln werden meistens über Logarithmieren gezogen, gibt auch kleine Fehler, da die Logarithmen über NäherungsverFahren bestimmt werden.

MfG Peter(TOO)

Vielen Dank für Eure Anregungen,
ich habe nachgesehen,
* der On Error Goto wird von mir verwendet, allerdings würde eine Fehlermeldung bei Überlauf erscheinen,
* Variablenüberlauf scheidet somit ebenfalls aus.
* ich verwende Datentyp Double,
der PC vertut sich bei dem Addieren und anschließenden Teilen um bis zu 1.2 (!)

Was ich unabhängig von der Stelle benerkt habe, war dass VB sich bei sin und cos Rechnungen sich um bis zu 1,8 Werte „vertut“: ich habe ein Programm, in einer Schleife 10 mal hintereinander die Summe von einer Schwingung ausrechnen soll (cos(omega*A) (Umrechnung Radiant erfolgt; ebenso die Initialisierung aller Variablen)
Den gleichen Code habe ich in Turbo Pascal 6.0 eingegeben (gleicher Datentyp; gleicher Code bis aufs Semikolon)
Ergebnis: VB bringt 10 unterschiedliche Werte raus, TP 10 mal das gleiche…

Würde mich freuen, ob es einem anderen auch so geht?
Schlimm, am eigenen Verstand zu zweifeln, bis man SO etwas entdeckt.
Liegt das an der VB 6.0 Einsteiger Version? Verwendet die noch jemand?

Gruß - und vielen Dank für die Antworten -
Helmut

Gruß,

Liegt das an der VB 6.0 Einsteiger Version? Verwendet die noch
jemand?

In der Tat.
Denn die Einsteiger-Version rechnet nur im Zahlenbereich bis 50 korrekt. Danach brauch man die Professional…
Neein, quatsch!

Also, ich denke, es wäre hilfreich bei unserer Hilfe, wenn du infach mal die Funktion posten würdest, die den Rechen-Fehler verursacht, dann könnten wir das eher nachvollziehen bzw ausprobieren…

Gruß,
Tom

Hallo Leute,
erst nochmals vielen Dank für die Anregungen.
Hier nun der Quelltext - ich wollte ihn zuerst nicht posten, da das ein Programm ist, das in einer Firma verwendet wird.
Der absolute Ausschnitt ist jedoch zum Posten OK.

Das was ich benutze ist das MSFlexGrid.OCX, in dem Zahlenkolonnen stehen. In der Spalte Null ist eine Numerierung von 1-n. Die restlichen Spalten enthalten Zahlen mit 3 Nachkommastellen und Werten je nach Spalte von durchschnittlich 5 bis durchschn. 100.
Was ich bemerke ist: kleine Zahlen werden richtig im Durchschn. & Standardabweichung berechnet, große nicht.
==> Ab Werten > 50 doch die Professional Version? :wink:) ?
*lach*
Vielleicht - wenns hilft…

Hier der Quellcode:

Private Sub ErgebnisRechnung()
Dim i As Long
Dim AnzahlWerte As Long
Dim j As Byte
Dim Wert As Double
On Error GoTo Fehler

'alle Werte 0 setzen
For j = 0 To 7
MW_Arr(j) = 0 'Datentyp Double, Definition global
SA_Arr(j) = 0
Next j

Messen.MousePointer = vbHourglass ’ Sanduhr auf Formular
AnzahlWerte = 0
For i = 1 To Wandlergrid.Rows - 1 ’ MITTELWERT SUMMATION
Wandlergrid.Row = i
Wandlergrid.Col = 0 'Check ob wirklich noch Spalte mit Eintrag (verhindert das Dividieren durch falschen Nenner)
If Wandlergrid.Text Like „[0-9]“ Then
AnzahlWerte = AnzahlWerte + 1
For j = 1 To 7 ’ Flexgrid zaehlt ab 0
Wandlergrid.Row = i ’ gehe in aktuelle Zeile
Wandlergrid.Col = j ’ gehe in aktuelle Spalte
Wert = CDbl(PunktInKomma(Wandlergrid.Text))
MW_Arr(j) = MW_Arr(j) + Wert
Next j
End If
Next i

If (AnzahlWerte 0) Then ’ Division durch 0 verhindern
For j = 1 To 7
MW_Arr(j) = MW_Arr(j) / (AnzahlWerte) 'Mittelwert berechnen
Next j
End If

For i = 1 To AnzahlWerte 'STANDARDABWEICHUNG
For j = 1 To 7
Wandlergrid.Row = i ’ gehe in aktuelle Zeile
Wandlergrid.Col = j 'Rauschwert
Wert = CDbl(PunktInKomma(Wandlergrid.Text))
SA_Arr(j) = SA_Arr(j) + (Wert - MW_Arr(j)) ^ 2
Next j
Next i

If (AnzahlWerte 0) And (AnzahlWerte 1) And (AnzahlWerte 2) Then ’ Division durch 0 verhindern
For j = 1 To 7
SA_Arr(j) = ((1 / (AnzahlWerte - 1)) * SA_Arr(j)) ^ 0.5
Next j
End If

ZeilenZaehler = ZeilenZaehler + 1
Wandlergrid.Rows = Wandlergrid.Rows + 5
Wandlergrid.Row = ZeilenZaehler

'Mittelwert
Wandlergrid.Col = 0
Wandlergrid.Text = „MW“
For j = 1 To 7
Wandlergrid.Col = j
Wandlergrid.Text = KommaInPunkt(MW_Arr(j), 2)
Next j

'Standardabweichung
Wandlergrid.Rows = Wandlergrid.Rows + 2 ’ weiter nach unten
Wandlergrid.Row = ZeilenZaehler + 2
Wandlergrid.Col = 0
Wandlergrid.Text = „SA“
For j = 1 To 7
Wandlergrid.Col = j
Wandlergrid.Text = KommaInPunkt(SA_Arr(j), 2)
Next j

Messen.MousePointer = vbDefault
GoTo Weiter
Fehler:
MsgBox "Ein Fehler ist aufgetreten: " & Error(Err), vbOKOnly + vbCritical
Weiter:
Ende:
End Sub

Soweit der Quelltext.
Über neue Anregungen freue ich mich.
Gruß Helmut