Servons-nous IEEE 754 double précision par exemple. Nous supposons qu'il est mappé à double
dans notre plate-forme de compilation C. C99 hexadecimal notation est pratique donc nous allons en profiter. Supposons également que long double
ait au moins un bit de précision supplémentaire par rapport à double
, par exemple, long double
est le "double étendu" de 80 bits d'Intel.
L'opération double
1.0/x
tours à +inf
si et seulement si le résultat mathématique de la division est au-dessus du nombre 1.fffffffffffff8p1023L
. Ce nombre n'est pas représentable comme double
, mais il est exactement le point milieu entre DBL_MAX
et quelle serait la prochaine valeur double
après DBL_MAX
si l'exposant double
avait une plus grande portée. C'est ainsi que IEEE 754 définit si les opérations de base telles que /
doivent arrondir à l'infini.
Par conséquent, la valeur la plus élevée double
valeur à arrondir +inf
quand un mouvement alternatif peut être calculé avec les étapes suivantes:
- définir le mode d'arrondi à
FE_DOWNWARD
- Compute
1.0L/1.fffffffffffff8p1023L
- (tout en restant dans ronde -downwards mode) arrondit le résultat à
double
.
La plus petite valeur pour ne pas arrondir à l'infini est celle juste après celle-ci. Il peut être calculé avec nextafter
, comme standardisé par ex. in POSIX.
La traduction de ces quatre étapes en C devrait être simple (n'oubliez pas #pragma STDC FENV_ACCESS ON
). Ou, comme Thomas Weller l'a recommandé, force brute. Une recherche par dichotomie prendrait moins de 64 étapes.
REMARQUE: il est possible de calculer la plus petite valeur à un résultat un mouvement alternatif fini en utilisant le mode d'arrondi FE_UPWARD
et seulement trois étapes, mais cela repose sur la propriété supplémentaire que 1.0L/1.fffffffffffff8p1023L
ne peut pas être une opération exacte. La méthode en quatre étapes est conceptuellement plus propre.
Brute le forcer. –
La question est théorique à propos de C virgule flottante – dkrikun