Makrofehler wegen Rechenungenauigkeit
Moderator: Moderatoren
Makrofehler wegen Rechenungenauigkeit
Hallo Leutz,
bei meinen Makroversuchen bin ich auf ein Problem gestoßen
ich habe eine Variable x1 Wert 255 und eine Variabel x2 die Werte von 1-25 enthalten kann
x1 durch x2 dividiert wird zu x3
dann wird eine Schleife x mal durchlaufen und auf x4 = 0 wird x3 addiert
dh nach x2 Durchläufen der Schleife müsste X4 = 255 sein, darauf prüfe ich mit if X4 = 255 um die Schleife zu verlassen
das führt bei x2 = 7, 9, 11, usw zu einem Fehler weil 255 nicht mehr erreicht wird ( zB 255/7 hat unendliche Nachkommastellen) und die if = 255 abfrage greift nicht
wie kann ich da mehr Toleranz erreichen ?
bei meinen Makroversuchen bin ich auf ein Problem gestoßen
ich habe eine Variable x1 Wert 255 und eine Variabel x2 die Werte von 1-25 enthalten kann
x1 durch x2 dividiert wird zu x3
dann wird eine Schleife x mal durchlaufen und auf x4 = 0 wird x3 addiert
dh nach x2 Durchläufen der Schleife müsste X4 = 255 sein, darauf prüfe ich mit if X4 = 255 um die Schleife zu verlassen
das führt bei x2 = 7, 9, 11, usw zu einem Fehler weil 255 nicht mehr erreicht wird ( zB 255/7 hat unendliche Nachkommastellen) und die if = 255 abfrage greift nicht
wie kann ich da mehr Toleranz erreichen ?
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: Makrofehler wegen Rechenungenauigkeit
Aloha
Ohne auch nur ansatzweise nachvollziehen zu können, was Du da überhaupt treibst, empfiehlt sich der Datentyp Double
Ohne auch nur ansatzweise nachvollziehen zu können, was Du da überhaupt treibst, empfiehlt sich der Datentyp Double
Code: Alles auswählen
Dim x1 as Integer : x1 = 255
Dim x2 as Integer : x2 = 7
Dim x3 as Double : x3 = x1 / x2
Dim x4 as Double : x4 = 0
For i = 1 To x2
x4 = x4 + x3
Next i
Re: Makrofehler wegen Rechenungenauigkeit
Hallo Dpunch
Danke für die schnelle Antwort
aber entweder habe ich deine Hilfe nicht richtig verstanden oder es wirkt nicht
ich hänge die Datei mal an
du wirst auf Tabelle3 sehen was schief geht am besten bei nur 50% Größe
wenn du unter den Zahlen einen Bereich nach unten markierst soll der mit Farbreihen gefüllt werden
je Farbe soviel Stufen wie drüber steht
das funktioniert soweit auch bis auf diese "Rechenfehler"
vielleich schlägst du auch die Hände über dem Kopf zusammen
und sagst oh Mann das geht doch so oder so viel einfacher
Danke für die schnelle Antwort
aber entweder habe ich deine Hilfe nicht richtig verstanden oder es wirkt nicht

ich hänge die Datei mal an
du wirst auf Tabelle3 sehen was schief geht am besten bei nur 50% Größe
wenn du unter den Zahlen einen Bereich nach unten markierst soll der mit Farbreihen gefüllt werden
je Farbe soviel Stufen wie drüber steht
das funktioniert soweit auch bis auf diese "Rechenfehler"
vielleich schlägst du auch die Hände über dem Kopf zusammen
und sagst oh Mann das geht doch so oder so viel einfacher

- Dateianhänge
-
- farbtest_2a.ods
- (53.65 KiB) 22-mal heruntergeladen
LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Re: Makrofehler wegen Rechenungenauigkeit
Hi Clag,
und wie sieht es damit aus:
?
Jürgen
und wie sieht es damit aus:
Code: Alles auswählen
Sub Main
Dim x1, x2 as integer
x1 = 255
x2 = 7 'Variable 1-25
x3 = 0
x4 = 0
for i = 1 to x2
x3 = x1/x2
x4 = x4 + x3
print CLng(x4)
next i
End Sub
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Re: Makrofehler wegen Rechenungenauigkeit
Aloha
abgeändert in ein
oder auch
Dein Problem lösen.
(Entsprechend natürlich bei allen Abfragen).
Der addierte Wert von 255 in einer Double-Variablen wird offensichtlich nicht als gleich dem Wert 255 in einer Integer-Variablen erkannt.
Habe ich so noch nirgendwo erlebt, aber seis drum.
Ohne in der Verfassung zu sein, genauer auf das Thema an sich eingehen zu können, sollte einclag hat geschrieben:aber entweder habe ich deine Hilfe nicht richtig verstanden oder es wirkt nicht
Code: Alles auswählen
if grgb = 255 then
Code: Alles auswählen
if FIX(grgb) = 255 then
Code: Alles auswählen
if CInt(grgb) = 255 then
(Entsprechend natürlich bei allen Abfragen).
Der addierte Wert von 255 in einer Double-Variablen wird offensichtlich nicht als gleich dem Wert 255 in einer Integer-Variablen erkannt.
Habe ich so noch nirgendwo erlebt, aber seis drum.
Re: Makrofehler wegen Rechenungenauigkeit
Moin DPunch
allerbesten Dank für deine späte/frühe Hilfestellung
mit dem Fix() gibt es noch bei der Berechnung 255/18 einen Fehler
das erscheint mir bald noch unlogischer wie die Fehler vorher, dann müsste es auch bei 9 klemmen ?
ich werde gleich den zweiten Vorschlag noch testen !
ahh ok damit Cint() ist das 255/18 Problem auch gelöst
(kannst du vielleicht noch kurz erklären was diese beiden Funktionen bewirken)
da taucht bei mir nun die Frage auf ob es unter diesen Umständen nicht sinnvoller wäre
einen zusätzlichen ganzzahligen Zähler einzusetzen um den Austiegspunkt aus der For Schleife zu ermitteln,
oder vielleicht noch besser man fixiert die Schleifendurchläufe gleich auf die gewünschte Anzahl
nunja da muss ich noch ganz viel probieren,
ist praktisch mein erster Versuch mehr wie einen Basic-Zweizeiler zusammen zu setzen
und das war bestimmt nicht die letzte Hürde für mich und damit letzte Frage an Euch
allerbesten Dank für deine späte/frühe Hilfestellung
mit dem Fix() gibt es noch bei der Berechnung 255/18 einen Fehler
das erscheint mir bald noch unlogischer wie die Fehler vorher, dann müsste es auch bei 9 klemmen ?
ich werde gleich den zweiten Vorschlag noch testen !
ahh ok damit Cint() ist das 255/18 Problem auch gelöst

(kannst du vielleicht noch kurz erklären was diese beiden Funktionen bewirken)
da taucht bei mir nun die Frage auf ob es unter diesen Umständen nicht sinnvoller wäre
einen zusätzlichen ganzzahligen Zähler einzusetzen um den Austiegspunkt aus der For Schleife zu ermitteln,
oder vielleicht noch besser man fixiert die Schleifendurchläufe gleich auf die gewünschte Anzahl
nunja da muss ich noch ganz viel probieren,
ist praktisch mein erster Versuch mehr wie einen Basic-Zweizeiler zusammen zu setzen
und das war bestimmt nicht die letzte Hürde für mich und damit letzte Frage an Euch

LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
- komma4
- ********
- Beiträge: 5332
- Registriert: Mi, 03.05.2006 23:29
- Wohnort: Chon Buri Thailand Asia
- Kontaktdaten:
Re: Makrofehler wegen Rechenungenauigkeit
F1 Online Hilfe, OpenOffice.org Basic>Suchenclag hat geschrieben:(kannst du vielleicht noch kurz erklären was diese beiden Funktionen bewirken)
gibt Dir die Erklätung der beiden Laufzeit-Funktionen.
Reicht das?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Re: Makrofehler wegen Rechenungenauigkeit
Hallo Turtel47
entschuldige bitte, dass ich nicht auf deinen Vorschlag eingegangen bin,
gestern Abend sind bei mir ziemlich früh (kurz nach der 1. Nachfrage) die Lichter ausgegangen
und heute Morgen habe ich von unten beginnend abgearbeitet und dabei deine Antwort übersehen.
Das war also keine Ignoranz, nur ein übersehen, denn ich weiß deine immer konstruktive Hilfe sehr wohl zu schätzen,
also auch dir besten Dank dafür !
Hallo Komma
wenn ich ohne dieses aktuelle Thema diese Beschreibung gelesen hätte wäre ich wohl nicht so schnell auf die Idee gekommen
diese beiden Funktionen einzusetzen.
Ich hatte eher an etwas toleranteres gedacht zB in der Art das die Letzte Zahl der Nachkommastellen ignoriert wird,
bzw Abweichungen um diesen Wert toleriert werden.
Aber dank eurer praktischen Hilfe wird man auf solch Funktionen gestupst
doch das Beispiel in (Calc Genauigkeit)
255/9 = 28,33333333333330
255/18 =14,16666666666670
also
28,33333333333330 * 9 = 254,99999999999990
14,16666666666670 * 18 =255,00000000000010
zeigt das das auch nicht so einfach wäre
ABER interessant dabei ist, führt man die Berechnung in der Tabelle durch gibt es keinen Fehler
ich bin einigermaßen
!
entschuldige bitte, dass ich nicht auf deinen Vorschlag eingegangen bin,
gestern Abend sind bei mir ziemlich früh (kurz nach der 1. Nachfrage) die Lichter ausgegangen
und heute Morgen habe ich von unten beginnend abgearbeitet und dabei deine Antwort übersehen.
Das war also keine Ignoranz, nur ein übersehen, denn ich weiß deine immer konstruktive Hilfe sehr wohl zu schätzen,
also auch dir besten Dank dafür !
Hallo Komma
wenn ich ohne dieses aktuelle Thema diese Beschreibung gelesen hätte wäre ich wohl nicht so schnell auf die Idee gekommen
diese beiden Funktionen einzusetzen.
Ich hatte eher an etwas toleranteres gedacht zB in der Art das die Letzte Zahl der Nachkommastellen ignoriert wird,
bzw Abweichungen um diesen Wert toleriert werden.
Aber dank eurer praktischen Hilfe wird man auf solch Funktionen gestupst
doch das Beispiel in (Calc Genauigkeit)
255/9 = 28,33333333333330
255/18 =14,16666666666670
also
28,33333333333330 * 9 = 254,99999999999990
14,16666666666670 * 18 =255,00000000000010
zeigt das das auch nicht so einfach wäre
ABER interessant dabei ist, führt man die Berechnung in der Tabelle durch gibt es keinen Fehler
ich bin einigermaßen

LG
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
clag
nutzt: WinXP SP3 / AOO 4.1.10 / Firefox