2017-08-31 5 views
0

Quel est le plus petit flotteur à simple et double précision de sorte que son inverse n'est pas égal à l'infini sous IEEE 754?Le plus petit flotteur X s.t. 1/X n'est pas l'infini

Edit: Je demande parce que je veux juste comprendre comment cela fonctionne

+2

Brute le forcer. –

+0

La question est théorique à propos de C virgule flottante – dkrikun

Répondre

1

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 double1.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.