2009-06-26 5 views
8

Ich bin ein MATLAB Anfänger. Hier ist das Problem:MATLAB - floor Frage

>> a = floor(7/2.5) 

a = 

     2.00 

>> b = rem(7,2.5) 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     0 

c sollte 1 sein, richtig? Warum ist es 0 ???

Es ist anders, wenn b = 2 direkt eingegeben wird, wie folgt:

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

Antwort

11

In zwei Worten: Rundungsfehler.

Sie haben Recht, c sollte 1,0 in genauen Arithmetik sein. Da Sie jedoch in den Argumenten von rem einen Float verwendet haben, erhalten Sie die Antwort als Float. Anscheinend ist b nicht genau 2, sondern 2.0, was bedeutet, dass es ein Double sehr nahe bei 2 ist. Daher wird b/2 die doppelte 1.0, anscheinend in diesem Fall ist sein Wert etwas kleiner als eins, was eine 0 als ergibt der ganzzahlige Wert Wenn Sie dies verhindern möchten, verwenden Sie sowohl Boden als auch Decke und vergleichen Sie die Werte.

Wenn Sie die Antwort in Ganzzahl umwandeln möchten, verwenden Sie nur Runde statt Boden.

+0

Vielen Dank. Ich habe das Ergebnis der rem-Funktion in single umgewandelt. Dann ist zumindest mein Problem gelöst. –

+0

konvertieren Sie das Ergebnis von rem zu einem int. Es wird immer sein (genauso wie floor, ceil und round immer ganze Zahlen sind) – KitsuneYMG

+2

Vorsicht bei der Terminologie "In Ganzzahl konvertieren": Runde konvertiert nicht in einen Integer-Typ, sondern gibt den nächsten Integer-Wert immer noch als Double zurück. Das ist normalerweise das, was du willst. Die tatsächlichen Integer-Typen von Matlab wie int32 haben eine höhere Priorität als double und bewirken, dass alle nachfolgenden Operationen mit Ganzzahlarithmetik ausgeführt werden. –

6

Wenn Sie die Zeile

d = b-a 

zu Ihrem Beispiel hinzufügen, werden Sie sehen das Ergebnis

d = 

-4.4409e-016 

Bedeutung Matlab eine Zahl nahe berechnet, aber nicht genau, 2 für b. Das kommt bei der Arbeit mit Gleitkommazahlen ziemlich oft vor. Versuchen Sie

help eps 

für weitere Informationen.

+0

Vielen Dank für den Tipp. –

2

Numerische Fragen dieser Art sind auch mit in den MATLAB FAQ behandelt

0

Ja, das ein numerisches Problem. Sie sollten solche Dinge mit Vorsicht verwenden. Wenn Sie genau arithmetisch arbeiten wollen, sollten Sie 'sym' für Ihre Nummer z.

b=rem(sym(7),sym(2.5)) 

Dann werden Sie keine solchen Fehler, aber Ihre Berechnungen werden viel langsamer sein.