Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1944to1948
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Hilfe bei Verständnis von Gleitkomma-Fehler

Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 14:57:51
Taraniel
Hallo zusammen,
ich lese schon eine Weile im Forum mit, habe auch schon einiges in VBA programmiert, aber irgendwie platzt bei mir gerade nicht der Knoten für mein Problem.
Ich hoffe ihr könnt mir helfen :)

Hier der Teil meines Codes, der partout nicht will bzw. bei dem hin und wieder der gefürchtete Gleitkommafehler auftritt.



test_double = overall_worktime
test_double = standard_time_array((((day_column - 2) / 5) + 1), 3)
test_double = overall_worktime - standard_time_array((((day_column - 2) / 5) + 1), 3)


Wie ihr vielleicht schon an den Namen der Variablen erkennt, muss ich mit Zeiten rechnen.
Da Zeiten ja so eine Sache sind, habe ich sie "umgerechnet" indem ich die Zeiten mit 24 multipliziere, daraus ergeben sich vorwiegend Dezimalzahlen (7.5, 8.5, 9, etc.)
Da ich nicht davon ausgehen kann, dass immer schöne glatte Zahlen rauskommen sind die Variable als Double deklariert.
In meinem "Problemfall" sind sie allerdings glatt aber es kommt eine sehr unschöne Zahl als Ergebnis der Subtraktion heraus.

overall_worktime ist eine glatte 5, steht auch genau so im Locals-Fenster während der Code läuft.
Das gleich gilt für den Wert im Array.
Nun will ich die beiden Subtrahieren -> Erwartungshaltung: 5 - 5 = 0
Ich vermute es liegt am Gleitkommafehler, das hier bei Excel = -8,88178419700125E-16 rauskommt.

Trage ich nun die Zeiten in Excel Zellen ein, kommt der Fehler nicht...
A1 Startzeit: 9:00
B1 Endzeit: 14:00
C1 = A1*24
D1= B1*24
E1 = D1 -C1 = 5

A2 Soll_Startzeit: 9:00
B2 Soll_Endzeit: 14:00
C2 = A2*24
D2= B2*24
E2 = D2-C1 = 5

F1 = E2 - E1 = 0
Um Das "Anzeigeproblem" auszuschließen, habe ich mir 6 Nachkommastellen anzeigen lassen -> alles ganz normale (runde) Zahlen...
Bei den Uhrzeiten 07:30 bis 16:00 mit Abzug der 30Min Pause, kommt eine saubere 0 raus...

Mappe und kompletten Code kann/darf ich leider nicht zur Verfügung stellen und ich weiß, dass es damit viel schwerer ist den Fehler zu finden, hoffe ihr könnt trotzdem helfen...

LG
Taraniel

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 15:05:08
Taraniel
Nachtrag, wenn ich die Zellen kopiere und einfüge (der selbe Code wird dann getriggert), kommt die erwartete und korrekte 0 heraus...
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 15:20:05
GerdL
Hallo Taraniel,

wahrscheinlich liegst du richtig und musst die Nachkommastellen runden; z.B. =RUNDEN((-8,88178419700125E-16);11)

Gruß Gerd
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 15:11:42
daniel
Hi
ja richtig erkannt, Gleitkommafehler.
Zeiten sind besonders anfällig, weil die 3 noch als Basis drinsteckt, was weder zum Dezimal- noch zum Dualsystem passt.

einfach das Ergebnis mit hoher NK-stellenzahl runden:
in der Zelle: =Runden(...;12)
oder als VBA =Round(...;12)

das Zahlenformat hilft nur für die Anzeige, ändert aber nicht den tatsächlichen Wert (außer man hat in den Optionen "Genauigkeit wie angezeigt" aktiviert, was aber nicht zu empfehlen ist, weil es auf alles wirkt und nicht immer erwünscht ist)

Gruß Daniel
Anzeige
Wie kommst Du auf 24?
28.09.2023 15:36:40
lupo1
1440 (weil Du Minuten hast) oder 86400 (falls Du Sekunden hast) wäre richtig, und danach die Rundung ganzer Zahl.

Oder halt die angesprochenen tiefen Dezimalstellenrundungen.
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 18:01:55
Yal
Moin,

eine andere Alternative zum Runden wäre mit Sekunden zu rechnen. Also ohne Nachkommastellen in der Basis.
Natürlich ein "/3" wird welche erzeugen, aber die Ungenauigkeit fängt wiet hinter der Komma.

Du brauchst nur 2 Funktionen: Konversion von Zeit (Typ Time) in Sekunden (Long): Sekunden = Zeit * 86400
und umgekehrt: Zeit = Sekunden / 86400

VG
Yal
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 19:50:12
Taraniel
Hallo zusammen,

Ich probiere das jetzt einmal mit den 1440 von lupo1 aus, vielleicht waren die 24 (für die Stunden) nicht genau genug 😅.
Und wenn das nicht hilft, dann werde ich wohl runden müssen.
Das hatte ich zwar schon versucht, aber nur auf die 6. Stelle und nicht die 12. Stelle.
Vielen Dank für eure Hilfe und die Tipps.

Schönen Abend noch ☺️

P.S: Ich berichte noch, was für die Kollegen ausreichend genau war am Ende 👍🏼
Anzeige
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 20:17:03
onur
Wenn du 1440 nimmst, brauchst du nicht nach der 6ten oder 12ten Stelle zu runden, EINE Stelle reicht.
Guckst du hier:
https://www.herber.de/bbs/user/163157.xlsx
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 15:23:58
Taraniel
Also gibt es da wirklich nur den Workaround mit dem Runden?
Den wollte ich absichtlich vermeiden, da, au was für Gründen auch immer, das mal "geholfen" hat und mal nicht...

LG Taraniel
AW: Hilfe bei Verständnis von Gleitkomma-Fehler
28.09.2023 15:33:28
daniel
ich wüsste jetzt keine andere Abhilfe
Gruß Daniel

Links zu Excel-Dialogen

Anzeige

Infobox zum Thema

EXCEL - Hilfe bei Verständnis von Gleitkomma-Fehler


Inhaltsverzeichnis


Die Fragestellung


Du möchtest verstehen, was ein Gleitkomma-Fehler ist und wie er sich in Programmen wie Excel auswirken kann.


Erläuterung des Problems {#erläuterung-des-problems}


Ein Gleitkomma-Fehler tritt auf, wenn eine Zahl in einem Computerprogramm nicht genau dargestellt oder berechnet werden kann, weil das zugrunde liegende Zahlensystem nicht in der Lage ist, die Zahl exakt zu repräsentieren. Dies ist besonders bei Zahlen der Fall, die sehr groß oder sehr klein sind oder eine lange Dezimalstelle haben.

In Excel und anderen Programmen, die das IEEE 754-Standardformat für Gleitkommazahlen verwenden, kann dies zu unerwarteten Ergebnissen führen, wie z.B. dass zwei scheinbar identische Zahlen nicht als gleich angesehen werden.


Lösung des Problems {#lösung-des-problems}


Um Gleitkomma-Fehler zu vermeiden oder zu minimieren, kannst du folgende Ansätze verwenden:

  1. Runden: Verwende die Rundungsfunktionen in Excel, um Zahlen auf eine bestimmte Anzahl von Dezimalstellen zu runden.

    • Beispiel: =RUNDEN(Zahl; Dezimalstellen)
  2. Datentypen beachten: Wenn du mit VBA arbeitest, wähle Datentypen, die eine höhere Präzision erlauben, wie Double statt Single.

  3. Vergleichstoleranz: Wenn du Zahlen vergleichst, füge eine kleine Toleranz hinzu, um die Ungenauigkeit zu berücksichtigen.

    • Beispiel: =ABS(Zahl1 - Zahl2) < Toleranz
  4. Verständnis für Gleitkommazahlen entwickeln: Lerne, wie Gleitkommazahlen im Computer gespeichert werden, um besser zu verstehen, woher die Fehler kommen.


Anwendungsbeispiele aus der Praxis


  • Finanzberechnungen: Runden von Währungsbeträgen, um Ungenauigkeiten bei der Berechnung von Zinsen oder Steuern zu vermeiden.
  • Wissenschaftliche Daten: Verwendung von Toleranzbereichen bei der Datenanalyse, um die Auswirkungen von Gleitkommafehlern zu minimieren.

Tipps


  • Vermeide es, Zahlen mit vielen Dezimalstellen unnötig in Formeln zu verwenden, wenn es nicht erforderlich ist.
  • Sei dir bewusst, dass die Verwendung von Rundungsfunktionen das Ergebnis beeinflussen kann, insbesondere wenn viele Berechnungen durchgeführt werden.

Verwandte Themenbereiche


  • Numerische Analyse
  • Computerarithmetik
  • Softwareentwicklung

Zusammenfassung


Gleitkomma-Fehler sind ein inhärentes Problem bei der Arbeit mit Fließkommazahlen in digitalen Systemen. In Excel können diese Fehler zu unerwarteten Ergebnissen führen, die durch Rundung, die Verwendung von Datentypen mit höherer Präzision und das Hinzufügen von Vergleichstoleranzen minimiert werden können. Ein grundlegendes Verständnis der Computerarithmetik kann helfen, diese Fehler zu verstehen und zu vermeiden.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige