2016-09-08 4 views
2

Dans Matlab, il existe une fonction appelée int16, qui arrondit par ex. double valeurs à l'entier suivant. Y a-t-il un équivalent simple en C à cela?Matlab int16() C équivalent?

Spécialement pour l'arrondissement de nombres négatifs, par ex. -1,65 à -2 et 1,33 à -1.

+1

Copie possible de [Existe-t-il une fonction pour arrondir un flottant en C ou dois-je écrire le mien?] (Http://stackoverflow.com/questions/497018/is-there-a-function-to- round-a-float-in-c-or-do-i-need-to-write-my-own) – samgak

+0

Je ne sais pas comment il peut être dupliqué de celui-là. L'autre question concerne l'arrondi de la représentation sous forme de chaîne, pas la conversion d'un flottant en entier et son arrondi (ceil ou floor). – LoPiTaL

+1

@LoPiTaL: La question porte sur l'arrondi de la valeur float; la réponse sélectionnée traite de l'impression, mais d'autres réponses parlent d'arrondi. –

Répondre

4

La fonction int16 arrondit et bloque les valeurs. Donc, un équivalent ressemblerait à ceci

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

EDIT: int16 retourne aussi 0 pour l'entrée NAN, donc gérer cela aussi. Notez également que le code a vraiment besoin des différenciations de cas, car la conversion de double en int16_t dans C est indéfinie pour NAN et les valeurs hors de la plage de l'entier cible.