2 votes

Comment arrondir un flottant à la valeur la plus proche qui peut être divisée par deux sans reste ?

Par exemple, j'ai un flottant 55.2f et je veux l'arrondir à l'unité inférieure de sorte que le résultat puisse être divisé par deux sans reste.

Ainsi, 55,2 deviendrait 54, car c'est le plus petit "pas" le plus proche qui peut être divisé par deux. Existe-t-il une fonction pour cela ou dois-je écrire mon propre algorithme ?

9voto

Matteo Italia Points 53117

Si votre résultat doit rester un float que vous pouvez faire :

float f=55.2f;
f=floorf(f/2.f)*2.f;

3voto

Graham Borland Points 27556

Convertissez d'abord en un type intégral, tel que int o long et ensuite effacer le bit le plus bas.

float f = 55.2f;
int   i = (int)f & ~1;

Explication

~ signifie l'inverse au niveau du bit, c'est-à-dire que toutes les valeurs de 0 Les bits deviennent 1 et vice versa.

Donc, si 1 a la configuration binaire

0...0001

entonces ~1 es

1...1110

(Ici, j'utilise ... pour représenter tous les bits intermédiaires, selon la taille d'un entier sur votre plateforme).

Quand vous & (bitwise AND) votre entier avec 1...1110 vous préservez la valeur de chaque bit, à l'exception du bit le plus bas, qui est forcé à 0 . Voir cette description de l'opérateur ET binaire si vous ne comprenez toujours pas.

En forçant le bit le plus bas à être 0 vous arrondissez le nombre au nombre pair le plus proche.

2voto

md5 Points 14957

Vous pouvez écrire votre propre algorithme, par exemple avec des opérateurs binaires.

Le code suivant fonctionne pour effacer le dernier bit de votre numéro. Un nombre pair a en effet le dernier bit non activé.

int 
f(float x) 
{ 
    return (int)x & ~1; 
}

1voto

Kerrek SB Points 194696

Qu'en est-il long int f = lrintf(x / 2); donde x est votre flotteur ?

Vous pouvez aussi dire simplement int f = x / 2; mais certaines personnes ont fait valoir que c'était plus coûteux, car la norme C impose un mode d'arrondi spécifique qui peut ou non être natif du processeur. Le site lrintf d'autre part, utilise le mode d'arrondi natif du CPU. Vous devez #include <math.h> .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X