|
|
Falsches Aufrunden mit "ceil" |
|
Nes Han |

Forum-Newbie
|
 |
Beiträge: 2
|
 |
|
 |
Anmeldedatum: 25.06.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.06.2013, 14:32
Titel: Falsches Aufrunden mit "ceil"
|
 |
Hallo,
habe folgendes Problem: Beim Verwenden von ceil rundet er 10* (0.4 - 0.1) auf 4.
Dabei ist
10* (0.4 - 0.1) = 3
Gibt Matlab euch die gleiche Ausgabe für die Eingabe?
Für Hilfe wäre ich sehr dankbar!
Grüße
Nes
Das sind meine Ein- / und Ausgaben.
Für die ersten zwei stimmt es, doch beim dritten ist es falsch.
|
|
|
|
|
derbeshot89 |

Forum-Anfänger
|
 |
Beiträge: 28
|
 |
|
 |
Anmeldedatum: 14.05.13
|
 |
|
 |
Wohnort: Hamburg
|
 |
|
 |
Version: 7.5.0 (R2007b)
|
 |
|
|
 |
|
Verfasst am: 25.06.2013, 16:09
Titel:
|
 |
Ich runde normalerweise mit "round".
Dann klappts.
Bei "ceil" habe ich das selbe Problem.
Für ceil(x) gilt:
Kleinste Integer-Zahl, die größer oder gleich (x) ist. Schon bei ceil(3.0000000000001) wird auf 4 aufgerundet, weil es eben nicht gleich x ist. Ich vermute mal, dass MATLAB hier etwas ungenau rechnet mit 0.4-0.1 (xte Nachkommastelle??). Falls ich falsch liege, könnt ihr mich gerne verbessern.
Gruß Fatih
|
|
|
Nes Han |
Themenstarter

Forum-Newbie
|
 |
Beiträge: 2
|
 |
|
 |
Anmeldedatum: 25.06.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.06.2013, 16:17
Titel:
|
 |
Dank für die Antwort.
Ich muss aber aufrunden. Aus 3.1 soll 4 werden aber aus 3 soll eben nur 3 werden und nicht 4.
Ich finde es merkwürdig, dass Matlab mir dort etwas falsches ausgibt.
Gruß!
|
|
|
Nras |

Forum-Meister
|
 |
Beiträge: 608
|
 |
|
 |
Anmeldedatum: 21.02.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: 7.12.0.635 (R2011a)
|
 |
|
|
 |
|
Verfasst am: 25.06.2013, 17:00
Titel:
|
 |
Hallo,
exakte Gleichheit von (Fließkomma-)Zahlen)ist für den Computer leider ein Problem, da nicht jede Zahl exakt binär dargestellt werden kann.
So liefert 0.4-0.1 == 0.3 schon false.
Viele Grüße,
Nras.
|
|
|
jurtsche |

Forum-Century
|
 |
Beiträge: 123
|
 |
|
 |
Anmeldedatum: 26.03.13
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 26.06.2013, 11:38
Titel:
|
 |
Musst halt vorher auf z.b. 2 oder 3 Nachkommastellen runden und dann das Ergebnis aufrunden.
Dann wird auf 3,00000000000000001 eben 3,000 und aufgerundet ergibt es 3.
z.b.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.06.2013, 13:09
Titel: Re: Falsches Aufrunden mit "ceil"
|
 |
|
 |
|
Hallo Nes Han,
Das ist ein absoluter Evergreen unter den häufig gestellten Fragen. Deswegen erscheint dies natürlich auch in den FAQ, die man übrigens unbedingt durchgelsen haben sollte: Nichts ist effizienter, als die Fehler zu nutzen, die ander bereits fertig implementiert haben!
http://matlab.wikia.com/wiki/FAQ#Wh.....r.29_not_equal_to_zero.3F
Die Lösung ist im Allgemeinen nicht einfach zu runden, sondern erst gar keine Programme zu schreiben, die von winzigen Rundungs-Fehlern abhängen. Beim Runden muss man nämlich willkürlich entscheiden, ab welches Grenze gerundet wird. Dabei hat die Floating-Point-Arithmetik eine solche Grenze bereits eingebaut, nämlich nach etwa 16 Stellen. Auch wenn man auf 3 Stellen nach dem Komma rundet, gibt es neue Ausnahmen wie z.B. 0.30049999999999999. Man müsste also eigentlich erstmal auf 4 Stellen runden, bevor man auf 3 Stellen rundet. Usw.
Genauso wenig, wie 0.3-0.2-0.1 nicht exakt 0 ergibt, trifft dies auch für reale physikalische Vorgänge zu: Zwei Unterlegscheiben der Dicke 0.2 und 0.1 mm werden niemals genau einen Spalt von 0.3 mm schließen. Wann immer ein Programm also von einem exakten Werte einer Floating-Point-Zahl abhängt, hat man unsauber programmiert.
Nun verleitet gerade Matlab dazu, weil viele Integer-Operationen wie FOR-Schleifen gerade für DOUBLEs optimiert wurden. Für ganze Zahlen bis 2^52-1 klappt das auch zuverlässig. Aber für Zahlen mit Nachkommastellen gelten andere Regeln.
Gruß, Jan
|
|
|
Gast136548 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.09.2013, 12:09
Titel:
|
 |
Hin und wieder lässt es sich leider nicht vermeiden, aus Floats exakte Ints für Arrayindizes zu bekommen. (Was genaue Rundungen benötigt.)
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 24.09.2013, 14:25
Titel:
|
 |
Hallo Gast136548,
Wenn es sich wirklich nciht verhindern läßt, muss man die Rundungsfehler berücksichtigen. ROUND muss dabei nicht unbedingt zielführend sein:
Hier ist nun "index" nicht 3, sondern 0 und das Runden bringt gar nichts.
Gruß, Jan
|
|
|
|
|
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 - 2025
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.
|
|