feclearexcept
From cppreference.net
|
Défini dans l'en-tête
<fenv.h>
|
||
|
int
feclearexcept
(
int
excepts
)
;
|
(depuis C99) | |
Tente d'effacer les exceptions à virgule flottante qui sont listées dans l'argument masque de bits
excepts
, qui est un OU binaire des
macros d'exception à virgule flottante
.
Table des matières |
Paramètres
| excepts | - | masque de bits listant les indicateurs d'exception à effacer |
Valeur de retour
0
si toutes les exceptions indiquées ont été effacées avec succès ou si
excepts
est zéro. Retourne une valeur non nulle en cas d'erreur.
Exemple
Exécuter ce code
#include <fenv.h> #include <stdio.h> #include <math.h> #include <float.h> /* * Une implémentation possible de hypot qui utilise de nombreuses * fonctionnalités avancées des nombres à virgule flottante. */ double hypot_demo(double a, double b) { const int range_problem = FE_OVERFLOW | FE_UNDERFLOW; feclearexcept(range_problem); // essayer un algorithme rapide double result = sqrt(a * a + b * b); if (!fetestexcept(range_problem)) // pas de dépassement ou de sous-dépassement return result; // retourner le résultat rapide // effectuer un calcul plus complexe pour éviter le dépassement ou le sous-dépassement int a_exponent,b_exponent; frexp(a, &a_exponent); frexp(b, &b_exponent); if (a_exponent - b_exponent > DBL_MAX_EXP) return fabs(a) + fabs(b); // on peut ignorer la plus petite valeur // mettre à l'échelle pour que fabs(a) soit proche de 1 double a_scaled = scalbn(a, -a_exponent); double b_scaled = scalbn(b, -a_exponent); // le dépassement et le sous-dépassement sont maintenant impossibles result = sqrt(a_scaled * a_scaled + b_scaled * b_scaled); // annuler la mise à l'échelle return scalbn(result, a_exponent); } int main(void) { // Cas normal prend le chemin rapide printf("hypot(%f, %f) = %f\n", 3.0, 4.0, hypot_demo(3.0, 4.0)); // Cas extrême prend le chemin lent mais plus précis printf("hypot(%e, %e) = %e\n", DBL_MAX / 2.0, DBL_MAX / 2.0, hypot_demo(DBL_MAX / 2.0, DBL_MAX / 2.0)); return 0; }
Sortie :
hypot(3.000000, 4.000000) = 5.000000 hypot(8.988466e+307, 8.988466e+307) = 1.271161e+308
Références
- Norme C11 (ISO/CEI 9899:2011) :
-
- 7.6.2.1 La fonction feclearexcept (p: 209)
- Norme C99 (ISO/CEI 9899:1999) :
-
- 7.6.2.1 La fonction feclearexcept (p: 190)
Voir aussi
|
(C99)
|
détermine quels indicateurs d'état en virgule flottante spécifiés sont définis
(fonction) |
|
Documentation C++
pour
feclearexcept
|
|