2009-11-29 1 views
2

Pour autant que je sais valeurs à virgule flottante sont de la forme n * 2^e, avecOù le standard C++ définit-il la plage de valeurs des types float?

  • être Plage de flotteur n = - (2^23-1) - (2^23-1), et e = -126 à 127,
  • étant le double de la plage n = - (2^52-1) - (2^52-1), et e = -1 022 - 1023

Je regardais par la C++ standard, mais n'a pas réussi à trouver l'endroit où la norme le spécifie, ou impose l'association des types double flottant, double et long avec des plages définies dans d'autres normes (IEEE). La seule chose que j'ai trouvée en 3.9.1.8 est:

Il existe trois types de virgule flottante: float, double et long double. Le type double fournit au moins autant de précision que float, et le type long double fournit au moins autant de précision que le double. L'ensemble des valeurs du type float est un sous-ensemble de l'ensemble des valeurs du type double; l'ensemble des valeurs du type double est un sous-ensemble de l'ensemble des valeurs du type long double. La représentation de la valeur des types à virgule flottante est définie par l'implémentation.

Et aucune mention de la plage minimale fournie par le type. Où/comment la norme spécifie-t-elle la plage de valeurs (minimum?) Des types à virgule flottante? Ou un compilateur peut-il choisir librement n'importe quelle plage de valeurs et être toujours conforme aux normes?

+0

https://docs.microsoft.com/en-us/cpp/c-language/type-float https://docs.microsoft.com/en-us/cpp/c-language/type-double – Andrew

Répondre

1

Tout comme les limites numériques d'entiers, les limites pour float, double et long double sont importées de la norme C. La valeur minimale pour les constantes FLT_MAX, DBL_MAX et LDBL_MAX est 1E+37. Pour leurs variantes *_MIN, la valeur maximale est 1E-37.

+0

Merci, juste ce que je cherchais. La norme C comporte certaines exigences minimales pour les gammes de flotteurs. Par exemple, ce flottant devrait pouvoir contenir 1E-37 et 1E37 comme vous l'avez dit, et que la différence entre 1 et le prochain flottant représentable devrait être 1E-5 ou moins. – shojtsy

6

Ce que vous avez cité est tout ce qui est garanti sur les types à virgule flottante en C++. Comme il est dit, leur représentation est définie par l'implémentation.

Vous pouvez, cependant, demander des informations sur les limites et savoir si les types sont des types spécifiés CEI 559 (IEEE 754) en utilisant les modèles std::numeric_limits dans <limits>.

2

La norme ne spécifie pas de telles choses car elles dépendent souvent du matériel et évoluent avec le temps. Alors qu'aujourd'hui 32 bits sont considérés comme une norme, dans 10 ans, faire des choses en moins de 64 bits peut sembler désagréable.

+0

La taille des flottants est définie par IEEE, votre compilateur peut choisir d'avoir son propre float non standard, mais il vous le dirait. –

+1

Je ne suis pas sûr d'être d'accord avec la prémisse selon laquelle le 32 bits deviendra "désagréable" car même maintenant, les processeurs 8 bits voient une utilisation importante dans le domaine incorporé. 32 bits vont probablement rester mainstream dans les appareils de combiné pendant une longue période – SingleNegationElimination

Questions connexes