2016-09-08 2 views
2

In Matlab gibt es eine Funktion namens int16, die z. doppelte Werte auf die nächste ganze Zahl. Gibt es dafür ein einfaches Äquivalent in C?Matlab int16() C entspricht?

Speziell für das Runden von negativen Zahlen, z.B. -1,65 bis -2 und 1,33 bis -1.

+1

Mögliches Duplikat von [Gibt es eine Funktion zum Runden eines Floats in C oder muss ich meine eigene schreiben?] (Http://stackoverflow.com/questions/497018/is-there-a-function-to-) Round-a-float-in-c-oder-do-ich-brauche-schreibe-mein-eigene) – samgak

+0

Ich weiß nicht, wie es das Duplikat von diesem sein kann. Die andere Frage besteht darin, die Zeichenfolgendarstellung zu runden, und nicht einen Gleitkommawert in Ganzzahl umzuwandeln und ihn zu runden (ceil oder floor). – LoPiTaL

+1

@LoPiTaL: Die Frage fragt nach dem Runden des Gleitkommawertes; Die ausgewählte Antwort befasst sich mit dem Drucken, aber andere Antworten sprechen von Rundung. –

Antwort

4

Die Funktion int16 rundet und klemmt die Werte. So würde ein Äquivalent wie folgt aussehen

int16_t int16(double d) 
{ 
    return isnan(d) ? 0 : (d > 32767.0) ? 
    32767 : 
    (d <-32768.0) ? -32768 : (int16_t)round(d)) ; 
} 

EDIT: int16 gibt auch 0 für NAN-Eingang, so dass diese auch handhaben.

Beachten Sie auch, dass der Code wirklich die Fallunterscheidungen benötigt, da die Umwandlung von double in int16_t in C für NAN und Werte außerhalb des Bereichs der Zielganzzahl nicht definiert ist.