La façon la plus rapide pour la fixation d'un réel (fixe et virgule flottante) de la valeur?

Est-il un moyen plus efficace pour la fixation de nombres réels que l'aide si les déclarations ou ternaire opérateurs?
Je veux le faire à la fois pour les doubles et un 32 bits fixpoint de mise en œuvre (16.16). Je suis pas demander de code qui peut gérer les deux cas, ils seront traités dans des fonctions séparées.

Évidemment, je peux faire quelque chose comme:

double clampedA;
double a = calculate();
clampedA = a > MY_MAX ? MY_MAX : a;
clampedA = a < MY_MIN ? MY_MIN : a;

ou

double a = calculate();
double clampedA = a;
if(clampedA > MY_MAX)
    clampedA = MY_MAX;
else if(clampedA < MY_MIN)
    clampedA = MY_MIN;

La fixpoint version utiliser les fonctions/macros pour les comparaisons.

Cela est fait dans un critiques des performances de la partie du code, donc je suis à la recherche d'un moyen efficace de le faire que possible (ce qui je pense serait d'impliquer la manipulation de bits)

EDIT: Il doit être standard/C portable, une plate-forme spécifique fonctionnalité n'est d'aucun intérêt ici. Aussi, MY_MIN et MY_MAX sont du même type que la valeur que je veux serré (doubles dans les exemples ci-dessus).

  • Je pense que vous pouvez utiliser SSE3 ou une technologie semblable pour cela, mais ne savez pas exactement quelles commandes/comment... Vous pouvez prendre un coup d'oeil sur: Saturation de l'arithmétique
  • Désolé, la question n'était pas claire au sujet de la plate-forme d'exigences. J'ai édité la question d'être un peu effacé.
  • Je sais qu'il a été deux ans et demi, depuis que vous avez posé cette question, mais j'espère que vous vérifier ma réponse - 3x amélioration est significative.
  • Un détail n'est pas spécifié est ce que la précision (relative ou absolue) êtes-vous prêt à échanger pour la vitesse si tout. Si le code exige une gamme a être retourné exactement comme a, puis beaucoup de réponses ne répondent pas à cet obstacle. Si la précision est d'aucun intérêt , puis revenant toujours (MY_MAX + MY_MIN)/2 sera certainement un rapide à faible précision de la réponse, et certainement stupide. Recommander à tolérer pas plus que 1 ULP d'erreur.
  • Comment voulez-vous faire sur SSE4 variable (__m128)?
  • connexes plus-efficace-élégant-moyen-pour-clip-un-nombre

InformationsquelleAutor Niklas | 2009-01-09