|
calcy |
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.12.2009, 17:46
Titel: Rechengenauigkeit???
|
|
Hi,
bin Anfänger und verstehe absolut nicht mit welcher Genauigkeit matlab rechnet.
-0.59+10.06+4.06 = 13.53
-0.42+11.29+2.66 = 13.53
ABER
(-0.59+10.06+4.06)-(-0.42+11.29+2.66) = 1.7764e-15
WARUM rechnet matlab nicht Null als Ergebnis aus????????????????????????
Vielen Dank.
Gruss,
calcy
|
|
|
|
|
Tim |
Forum-Century
|
|
Beiträge: 140
|
|
|
|
Anmeldedatum: 03.11.07
|
|
|
|
Wohnort: Stuttgart
|
|
|
|
Version: 2011b+aktuellstes Release
|
|
|
|
|
|
Verfasst am: 27.12.2009, 18:11
Titel:
|
|
Matlab rechnet standardmäßig mit 64Bit Fließkommazahlen (Basis 2) nach IEEE754. In dieser Darstellung können bereits deine Zahlen nicht mehr exakt dargestellt werden und du verlierst Genauigkeit. Das würdest du auch schon bei den ersten Berechnungen sehen, aber dort fällt es entweder einfach durch die begrenzte Anzeige nicht auf, oder die Fehler heben sich vielleicht wieder auf (z.B. durch intern durchgeführte Rundungen).
http://de.wikipedia.org/wiki/IEEE_754
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.12.2009, 18:25
Titel:
|
|
Hallo Tim,
vielen Dank für dieschnelle Antwort!
Was muss ich tun damit matlab so rechnet, dass die obige Rechnung tatsächlich null ergibt?
Den null ist nach Adam Riese ja die richtige Antwort.
Finde diese Genauigkeit ehrlich gesagt ziemlich störend.
Es hat leider ungeheuer viel Zeit gekostet herauszufinden, dass ich nicht falsch programmiere sondern matlab "falsch" rechnet.
Ich darf meine Daten wohl nicht mit dem Zahlenformat "f" im Rahmen von textscan einlesen sondern muss ein anderes Format wählen. Hab schon "f32" und "n" versucht. Leider ohne Erfolg. Welches ist das richtige Format für mich?
Viele Grüsse,
Calcy
Zuletzt bearbeitet von calcy am 27.12.2009, 18:36, insgesamt einmal bearbeitet
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 27.12.2009, 18:27
Titel:
|
|
Hallo,
probiers mal mit
Da siehst du, dass du eben nicht genau 13.53 herausbekommst. Solche Ungenauigkeiten sind i.d.R. nicht relevant. Am ehesten sorgen sie bei Vergleichen auf Gleichheit Probleme. Da hilft statt
auf kleine Abweichung zu testen
Edit: calcy's Antwort war noch nicht da. Es wird nicht 0 ergeben. Weder in MATLAB noch in den meisten anderen Programmiersprachen.
Abhilfe bietet da eigentlich nur symbolisches Rechnen, in MATLAB mit der Symbolic Math Toolbox möglich. Da kommt dann auch genau 0 heraus.
Grüße,
Harald
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.12.2009, 18:40
Titel:
|
|
Hallo Harald,
genau solche Vergleiche:
sind für meine Rechnungen zentral.
Wenn ich in Excel rechne kommt bei obiger Rechnung aber null heraus.
Gibt es keine Möglichkeit Matlab zu zwingen ebenso wie Excel zu rechnen?
Gruss,
Calcy
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 27.12.2009, 19:26
Titel:
|
|
Hallo,
auch in Excel kommt nicht 0 heraus. Versuch:
in A1: =-0,59+10,06+4,06
in A2: =-0,42+11,29+2,66
in A3: =(A1-A2)*1000000000000
in A4: =(A1=A2)
Ergo: auch in Excel kommt nicht 0 heraus (hätte mich auch sehr überrascht). Was meiner Ansicht nach noch schlimmer ist: Excel spiegelt vor, dass 0 herauskommt, und es trifft nicht zu! (siehe A3). Und die Krönung: es spiegelt dem Anwender vor, dass 2 Werte, die intern offensichtlich voneinander verschieden sind, gleich wären!!
Wenn es dir um Vergleiche geht, empfehle ich den von mir zuvor beschriebenen Weg.
Grüße,
Harald
P.S.: Viele ehemalige Excel-Anwender nutzen MATLAB, weil es eben NICHT so rechnet wie Excel. Die meines Erachtens naheliegendere Frage wäre: kann man Excel nicht zwingen, so zu rechnen wie MATLAB?
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.12.2009, 20:03
Titel:
|
|
also mich verwirrt das alles ziemlich.
Habe dein Beispiel in open office calc angewendet. Bei mir kommt exakt null heraus! AUf ein Bildschirmfoto hab ich verzichtet. Warum sollte auch etwas anderes als null heraus kommen????
Würde gern verstehen warum matlab so rechnet.
Auch wenn man das hier vielleicht nicht sagen darf aber open office calc liefert ein Ergebnis das mathematisch korrekt ist nämlich null, schließlich sind beide Summen identisch!
Matlab macht das nicht. Es mag gute Gründe dafür geben, die ich unbedingt verstehen sollte. Sonst ierscheint mir das Arbeiten mit Matlab ziemlich "anstrengend". Man muss sich doch darauf verlassen können, dass zwei gleich große Summen auch als gleich groß behandelt werden? Wie gesagt ich verstehe das leider "noch" nicht. Wäre dir sehr dankbar wenn du mir das erklären würdest.
Gruss,
Calcy
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 27.12.2009, 20:29
Titel:
|
|
|
|
|
Hallo,
ich verwende Office 2007, und da kommt eindeutig nicht 0 heraus. Das Beispiel sollte reichen, und auch ich verzichte auf Screenshot. Es wird nur (eigentlich fälschlicherweise) als 0 angezeigt.
Zitat: |
Warum sollte auch etwas anderes als null heraus kommen???? |
Weil Computer mit Binärzahlen arbeiten (0 und 1), und deine Zahlen sind binär nicht exakt darstellbar. Dadurch ergeben sich Rundungsfehler.
Zitat: |
Auch wenn man das hier vielleicht nicht sagen darf aber open office calc liefert ein Ergebnis das mathematisch korrekt ist nämlich null, schließlich sind beide Summen identisch! |
Was bei Excel offenbar passiert ist, dass zwei Ergebnisse, die sehr ähnlich zueinander sind, als gleich angesehen werden, auch wenn sie es nicht sind. im Klartext: auch in Excel sind die beiden Summen nicht identisch (siehe Zelle A3 im vorherigen Beispiel; 0 * x sollte ja 0 sein). Excel betrachtet diese Zahlen aber aufgrund des geringen Unterschieds als gleich (!). Excel macht also nach einem Fehler noch einen Fehler in der Hoffnung, den ersten aufzuheben. Das mag bequem sein, ist aber IMHO unsinnig.
Aus numerischer Sicht ist es schlicht nicht empfehlenswert, zwei Zahlen auf Gleichheit zu testen. Immer besser testen, ob die Abweichung unterhalb einer bestimmten Toleranz liegt.
Grüße,
Harald
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 27.12.2009, 21:17
Titel:
|
|
vielen Dank Harald. Das war eine wichtige Lektion.
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.12.2009, 09:43
Titel:
|
|
Hallo Harald (oder jeder andere Matlab-Guru ),
gibt es vielleicht eine globale Anweisung, die ich an den Anfang meines codes setzen könnte, welche besagt, dass Matlab im Folgenden sämtliche Differenzen zwischen zwei Werten die kleiner als 1e-10 ist als gleich interpretieren soll?
Solch eine Anweisung wäre sehr praktisch für mich.
Vielen Dank.
Gruss,
Calcy
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.12.2009, 10:13
Titel:
|
|
Hallo,
hier eine kleine Funktion dazu:
Das einzige, was dadurch nicht bzw. nicht wie erwartet geht, ist der Aufruf a == b. Da aber hinter diesem auch nur der Aufruf einer Funktion eq(a, b) steckt, ist das IMHO so eine gute Lösung.
Statt a == b also dann immer gleich(a,b) schreiben.
Grüße,
Harald
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.12.2009, 10:43
Titel:
|
|
Danke Harald, nur funktioniert die Funktion in meinem m.file nicht. Es erscheint folgende Fehlermeldung
Function definitions are not permitted at the prompt or in scripts.
Habe im Forum gelesen, dass ich mein m.file erst mit einer weiteren Function beginnen lassen muss. Was könnte das für eine Function sein?
Das verstehe ich leider auch nicht.
Gruss,
Calcy
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.12.2009, 10:59
Titel:
|
|
Hallo,
du solltest den Code in einem separaten m-File abspeichern, damit er auch anderen Skripten/Funktionen zur Verfügung steht. Ansonsten sagt die Fehlermeldung eigtl schon alles.
Ein Skript kann leicht in eine Funktion umgewandelt werden. Gib in der Hilfe mal function ein.
Grüße,
Harald
Zuletzt bearbeitet von Harald am 28.12.2009, 11:04, insgesamt einmal bearbeitet
|
|
|
calcy |
Themenstarter
Forum-Anfänger
|
|
Beiträge: 26
|
|
|
|
Anmeldedatum: 11.11.09
|
|
|
|
Wohnort: ---
|
|
|
|
Version: ---
|
|
|
|
|
|
Verfasst am: 28.12.2009, 11:01
Titel:
|
|
Hallo Harald,
mein Problem ist folgendes:
Ich habe eine 468 mal 25 Matrix.
Matlab soll nun Zeilenweise bei Differenzen kleiner als 1e-10 zwischen zwei Elementen diese beiden Elemente gleich setzen.
Also angenommen
sieht so aus
Das zweite und das 25. Element sind gemäß Anzeige am Bildschirm identisch. Aber tatsächlich intern in Matlab verschieden. Dann sollen diese beiden Elemente gleich gesetzt werden. Dabei ist es egal ob das 2. = dem 25. gesetzt wird oder umgekehrt.
Matlab soll also jede mögliche Paarung innerhalb jeder Zeile der Matrix prüfen.
Kannst du mir sagen wie so etwas umzusetzen ist?
Vielen Dank im Voraus.
Viele Grüsse,
clacy
|
|
|
Harald |
Forum-Meister
|
|
Beiträge: 24.495
|
|
|
|
Anmeldedatum: 26.03.09
|
|
|
|
Wohnort: Nähe München
|
|
|
|
Version: ab 2017b
|
|
|
|
|
|
Verfasst am: 28.12.2009, 11:54
Titel:
|
|
Hallo,
zunächst die Frage: wozu das ganze?
Eine Möglichkeit, das umzusetzen, wäre z.B., alle Werte auf 9 Stellen zu runden:
Grüße,
Harald
|
|
|
|
Gehe zu Seite 1, 2 Weiter
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2024
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|