![]() |
---|
Ich habe einen Kopfrechentest erstellt. Wer kann mir erklären, warum Excel in den ersten 2 Rechnungen die Differenz nicht akzeptiert. Sonst funktionniert die formel ganz ordentlich. Danke im Voraus Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
![]() |
![]() |
Beim Arbeiten am Rechner mit Dezimalzahlen kommt es oft zu Rundungsfehlern - allein schon wegen der Konvertierung vom Dezimalsystem ins Binärsystem und retour. Wie du im Screenshot in Zelle siehst, ist für Excel nicht genau . Daher soll man nie zwei float-Zahlen auf Gleichheit abfragen sondern stattdessen prüfen, ob der Betrag der Differenz kleiner als eine passend gewählte kleine Konstante ist . Siehe Screenshot. Du prüfst also quasi, ob die beiden Zahlen fast (innerhalb einer Toleranz) gleich sind. Diese (oder im screenshot sind es kannst du auch in einer Zelle eintragen und diese immer referenzieren, dann kannst du die Toleranz für das gesamte Blatt mit einem einzigen Eintrag ändern. |
![]() |
Hi Roman Du bist genial, wie immer! Herzlichen Dank |
![]() |
Hallo Roman, sehr interessant! Wie bekommt man denn die genaue Angabe, die du in deiner Zelle hast? |
![]() |
Zum Beispiel so mit Stellen formatieren |
![]() |
@ willyengland Wie bekommt man denn die genaue Angabe, die du in deiner Zelle hast? Einfach "=A2-C2" reinschreiben und mehr Nachkommastellen anzeigen lassen screenshot). Du kannst dir auch in einer Zelle die Differenz anzeigen lassen und siehst, dass sie im Bereich von liegt. Das ist dann eben die Genauigkeitsgrenze von IEEE Zahlen. @ Femat Genial ist da nix, aber das Problem ist vom Programmieren her altbekannt. in deinem Fall ist als alternative Lösung auch der RUNDEN Befehl denkbar: =WENN(RUNDEN(A4-C4;2)=E4;"richtig";"falsch") |
![]() |
Aha, danke! Schon etwas seltsam, dass das heute immer noch ein Problem ist. |
![]() |
Solange intern das Binärsystem genutzt wird und solange eine zahl nicht unendlich viel Speicherplatz belegen darf wird das wohl auch ein Problem bleiben. Die harmlose Dezimalzahl ist im Binärsystem eine periodische Zahl, lässt sich also im Rechner nicht exakt speichern, denn irgendwann müssen wir abschneiden. Wenn mit dieser Zahl nun weiter gerechnet wird und das Ergebnis dann für die Anzeige wieder ins Dezimalsystem zurückgewandelt wird, stellen sich zwangsläufig Rundungsfehler ein, Wollte man das vermeiden, müsste man jede rationale Zahl intern als Quotient zweier ganzer zahlen abbilden und irrationale Zahlen nur symbolhaft . Dann muss man für diese spezielle Zahlendarstellung alle Rechenoperationen neu definieren und implementieren. Theoretisch lassen sich so beliebig große zahlen darstellen und Ergebnisse beliebig genau ermitteln - die Grenze ist der zur Verfügung stehende Hauptspeicher. Das ist ziemlich aufwändig und nur ein paar wenige spezielle Mathe-Programme gehen so vor. Ein Programm wie eine Tabellenkalkulation verwendet schlicht die vorgefertigte Zahlendarstellung und -arithmetik, die vom verwendeten Compiler angeboten wird und das wird in aller Regel das IEEE-Gleitkomma-Zahlenformat sein. de.wikipedia.org/wiki/IEEE_754 http//www.iti.fh-flensburg.de/lang/informatik/ieee-format.htm de.wikipedia.org/wiki/Gleitkommazahl#IEEE_754_und_andere_Normen Das heute üblicherweise verwendete doppelt genaue Format mit Bit Mantisse und Bit Exponent liefert eine Genauigkeit von ca. Dezimalstellen und wie wir gesehen haben liegt der Fehler in Excels Ergebnis bei der simplen Subtraktion bereits genau in dieser Größenordnung. |
![]() |
Danke für die Aufklärung! Also ist bei den beiden obigen "falschen" Rechenoperationen zufällig eine der Zahlen im Binärcode ungenau? |
![]() |
Das ist vermutlich die Ursache. |