Seite 1 von 1

Rundungsfehler? durch Makro?

Verfasst: Do, 19.04.2007 18:54
von Simon23
Hi,

liegt es an meinem PC, oder verechnet sich OpenOffice, oder habe ich einen Fehler im Programm?
Ich bin absoluter Neuling und habe das Makro von Thomas zum probieren etwas verändert:

Code: Alles auswählen

REM Das Makro

sub Beispiel_makro
  oDoc = thisComponent  'Zugiff auf das Dokument
  oSheet = oDoc.sheets(0)  'Erstes Tabellenblatt
  oZelleA = oSheet.getCellRangeByName("A1")   'Zelle A1
  oZelleB = oSheet.getCellRangeByName("B1")   'Zelle B1
  oZelleC = oSheet.getCellRangeByName("C3")   'Zelle C3
  iWertA = oZelleA.value   
  iWertB = oZelleB.value   
  REM Jetzt die Schleife
  for i = 0 to 200   '20 Durchgänge
      if oZelleA.string  = "G" then   'gerade Zahl
          oZelleC.value = oZelleC.value + 1
      end if
      oZelleB.value = oZelleB.value + 0.1
  next
end sub
Im Dokument steht auf

A1 =WENN(REST(B1;2)=0;"G";"U")
A2 =0

Auf der Zelle A1 wird bestimmt, ob A2 gerade, oder ungerade ist.
C3 zählt, wie oft auf A1 Gerade angezeigt wird.
Lässt man das Makro zweimal laufen, ist auf A2 der Wert

40,2000000000003

Wie kommt das?

Gruß

Simon

Verfasst: Do, 19.04.2007 23:51
von Stephan
liegt es an meinem PC, oder verechnet sich OpenOffice, oder habe ich einen Fehler im Programm?
Nein, ich denke Du machst nichts falsch, kann Dir aber nicht sagen was die genaue Erklärung für die Abweichung ist. Formal ist es meiner Meinung nach ein Genauigkeitsproblem, wenn Du Dir die Zwischenwerte ausgeben lässt siehst Du das eine ganze Menge Werte abweichen.
Wie kommt das?
Ich kann Dir leider keine genaue Erklärung geben, selbst wenn ich die Zahlen im Code auf Variablen lege und bei denen explizit den Typ deklariere kriege ich zwar ggf. andere Abweichungen, aber wie es dazu kommt kann ich Dir derzeitig nicht genau erklären - keine Ahnung ob mir noch was einfällt.

Zu Lösen ist das Ganze jedoch indem Du die Zeile:

Code: Alles auswählen

oZelleB.value = oZelleB.value + 0.1
so änderst das die Summanden ganzzahlig sind:

Code: Alles auswählen

oZelleB.value = (oZelleB.value*10 + 1 )/10

(auch mit Strings zu rechnen, würde zum Ziel führen)




Gruß
Stephan

Verfasst: Fr, 20.04.2007 09:06
von Toxitom
Hallo Simon,
Lässt man das Makro zweimal laufen, ist auf A2 der Wert

40,2000000000003

Wie kommt das?
Das ist korrekt und die Rechenungenauigkeit eines Computers beim Rechnen mit Fliesskommazahlen. Hier bist du als Programmierer gefrgt, solche Fehler abzufangen und zu vermeiden. Stefan hat ein paar Tipps gegeben.
Grundsätzlich: PCs können nicht genau rechnen, intern wird nur mit einer bestimmten Anzahl Stellen gerechnet - der Rest wird unterschlagen. Da kommen dann solche Fehler schnell zustande.
Generell ist es immer besser, mit Ganzzahlen zu rechnen (und entsprechende Variablen zu verwenden - also integer oder long) - da treten dann keine Rundungsfehler auf.

Viele Grüße
Thomas