2016-05-09 10 views
0

Ich habe eine eher unorthodoxe Hausaufgabe, wo ich eine einfache Funktion schreiben soll, wo ein double Wert auf eine ganze Zahl mit nur einer while Schleife gerundet wird.Wie float Nummer mit While-Schleife in MATLAB Runde?

Das Hauptziel ist, etwas zu schreiben, das der runden Funktion ähnlich ist. ich einige Fortschritte gemacht, wo ich sollte einen sehr kleinen double Wert addieren oder subtrahieren und ich treffen würde schließlich eine Zahl, die eine ganze Zahl sein wird:

while(~isinteger(inumberup)) 
    inumberup=inumberup+realmin('double'); 
end 

Dies führt jedoch in einer Endlosschleife. Gibt es eine Möglichkeit, diese Aufgabe zu erfüllen?

darf ich nicht round, ceil, floor, for, rem oder mod für diese Frage verwenden.

+0

'Isinteger' prüft auf Werttyp - Standard MATLAB Typ ist doppelt. 'isinteger (5)' gibt '0' zurück. Ist ['fix'] (http://uk.mathworks.com/help/matlab/ref/fix.html) gesperrt? –

+0

Ich denke ja, da steht geschrieben, dass ich while loop dafür benutzen muss: D Meine Power liegt weit über diesem Level: D –

+0

'fix' ist ähnlich wie' floor' aber es läuft auf Null ab. 'floor' läuft auf minus unendlich ... also ja ich würde denken, dass' fix' auch verboten ist. – rayryeng

Antwort

0

Sie können es ohne Schleife tun: Sie num2str können Sie die Zahl in einen String konvertieren, dann die Position des . im String finden und die Zeichenfolge extrahieren fron seine in die Position des . beginnend nach oben; dann wandeln Sie es zurück in eine Zahl mit str2num

Um es zu runden, müssen Sie den Wert des ersten Char (in eine Zahl umgewandelt) nach der . überprüfen.

r=rand*100 
s=num2str(r) 
idx=strfind(num2str(r),'.') 
v=str2num(s(idx+1)) 
if(v <= 5) 
    rounded_val=str2num(s(1:idx-1)) 
else 
    rounded_val=str2num(s(1:idx-1))+1 
end 

Hoffe, das hilft.

Qapla‘

+0

Ich hatte auch diese Idee, aber es ist streng geschrieben in der Übung, while-Schleife zu verwenden:/ –

3

Annahme:if Aussagen und die abs Funktion als die Liste der verbotenen Funktionen erlauben dies nicht enthalten.


Hier ist eine Lösung. Was Sie tun können, ist, den Eingabewert um 1 zu subtrahieren, bis Sie zu einem Punkt kommen, an dem es kleiner als 1 wird. Die nach diesem Punkt erzeugte Zahl ist die Bruchzahl der Zahl (dh wenn unsere Zahl 3,4 war, die Bruchzahl Komponente ist 0,4). Sie würden dann überprüfen, ob die Bruchkomponente, die wir f nennen, weniger als 0,5 ist. Wenn dies der Fall ist, bedeutet dies, dass Sie abrunden müssen und die Eingabezahl mit f subtrahieren soll. Wenn die Zahl größer als 0,5 oder gleich 0,5 ist, würden Sie die Eingangsnummer von (1 - f) hinzufügen, um die nächsthöhere Nummer zu erreichen. Dies gilt jedoch nur für positive Werte. Für negative Werte, round in MATLAB rundet auf negative Unendlichkeit, so was wir tun sollten, ist die absolute Wert der Eingangsnummer und tun diese Subtraktion, um den Bruchteil zu finden.

Sobald wir dies tun, überprüfen wir dann, was der Bruchteil ist gleich, und dann abhängig von dem Vorzeichen der Zahl, entweder wir addieren oder subtrahieren entsprechend. Wenn der Bruchteil kleiner als 0,5 ist und wenn die Zahl positiv ist, müssen wir um f subtrahieren, sonst müssen wir durch f hinzufügen. Wenn der Bruchteil größer oder gleich 0 ist.5, wenn die Zahl positiv ist, müssen wir von (1 - f) hinzufügen, sonst ziehen wir durch (1 - f)

daher davon aus, dass num die Eingangszahl von Interesse ist, würden Sie tun:

function out = round_hack(num) 

%// Repeatedly subtract until we get a value that less than 1 
%// i.e. the fractional part 
%// Also make sure to take the absolute value 
f = abs(num); 
while f > 1 
    f = f - 1; 
end 

%// Case where we need to round down 
if f < 0.5 
    if num > 0 
     out = num - f; 
    else 
     out = num + f; 
    end 
%// Case where we need to round up 
else 
    if num > 0   
     out = num + (1 - f); 
    else 
     out = num - (1 - f); 
    end 
end 

Beachten Sie, dass diese wird für größere Werte von num langsam sein. Ich habe dies auch in eine Funktion zum leichteren Debuggen eingepackt. Hier sind ein paar Beispiel läuft:

>> round_hack(29.1) 

ans = 

    29 

>> round_hack(29.6) 

ans = 

    30 

>> round_hack(3.4) 

ans = 

    3 

>> round_hack(3.5) 

ans = 

    4 

>> round_hack(-0.4) 

ans = 

    0 

>> round_hack(-0.6) 

ans = 

    -1 

>> round_hack(-29.7) 

ans = 

    -30 

können Sie prüfen, ob diese mit round Funktion des MATLAB für die oben genannten Testfällen übereinstimmt.

+0

Sie könnten auch nur implementieren die [Modulo-Serie-Erweiterung] (https://en.wikipedia.org/wiki/Floor_and_ceiling_functions#Series_expansions) – excaza

+0

@excaza Hm ... die Reihenentwicklung ist für eine Eingabe, die eigentlich eine Ganzzahl ist, undefiniert. – rayryeng

+0

Das Testen auf Ganzzahlen ist nicht verboten – excaza