WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Falsches Aufrunden mit "ceil"

 

Nes Han
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2013, 14:32     Titel: Falsches Aufrunden mit "ceil"
  Antworten mit Zitat      
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.
Code:
>> ceil(3)

ans =

     3

>> ceil(10 * 0.3)

ans =

     3

>> ceil(10 * (0.4 - 0.1) )

ans =

     4
Private Nachricht senden Benutzer-Profile anzeigen


derbeshot89
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 14.05.13
Wohnort: Hamburg
Version: 7.5.0 (R2007b)
     Beitrag Verfasst am: 25.06.2013, 16:09     Titel:
  Antworten mit Zitat      
Ich runde normalerweise mit "round".

Code:

round(10 * (0.4 - 0.1) )
 


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
Private Nachricht senden Benutzer-Profile anzeigen
 
Nes Han
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 25.06.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.06.2013, 16:17     Titel:
  Antworten mit Zitat      
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ß!
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 25.06.2013, 17:00     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2013, 11:38     Titel:
  Antworten mit Zitat      
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.

Code:
ceil(round((10 * (0.4 - 0.1))*1000)/1000)
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 26.06.2013, 13:09     Titel: Re: Falsches Aufrunden mit "ceil"
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast136548

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2013, 12:09     Titel:
  Antworten mit Zitat      
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

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.09.2013, 14:25     Titel:
  Antworten mit Zitat      
Hallo Gast136548,

Wenn es sich wirklich nciht verhindern läßt, muss man die Rundungsfehler berücksichtigen. ROUND muss dabei nicht unbedingt zielführend sein:
Code:
x = 1e18 + 1 + 2 - 1e18;
index = round(x);

Hier ist nun "index" nicht 3, sondern 0 und das Runden bringt gar nichts.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.