Makrofehler wegen Rechenungenauigkeit

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Makrofehler wegen Rechenungenauigkeit

Beitrag von clag »

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 ?
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von DPunch »

Aloha

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
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von clag »

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 :lol:
Dateianhänge
farbtest_2a.ods
(53.65 KiB) 22-mal heruntergeladen
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von turtle47 »

Hi Clag,

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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von DPunch »

Aloha
clag hat geschrieben:aber entweder habe ich deine Hilfe nicht richtig verstanden oder es wirkt nicht :?
Ohne in der Verfassung zu sein, genauer auf das Thema an sich eingehen zu können, sollte ein

Code: Alles auswählen

if grgb = 255 then
abgeändert in ein

Code: Alles auswählen

if FIX(grgb) = 255 then
oder auch

Code: Alles auswählen

if CInt(grgb) = 255 then
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.
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von clag »

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 :D
(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 :lol:
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von komma4 »

clag hat geschrieben:(kannst du vielleicht noch kurz erklären was diese beiden Funktionen bewirken)
F1 Online Hilfe, OpenOffice.org Basic>Suchen

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)
clag
********
Beiträge: 3570
Registriert: Di, 27.01.2009 15:30

Re: Makrofehler wegen Rechenungenauigkeit

Beitrag von clag »

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 :? !
LG
clag

nutzt: WinXP SP3 / AOO 4.1.10 / Firefox
Antworten