9
votes

Comment les limites supérieure et inférieure des nombres de points flottants sont-elles déterminées?

J'ai une question sur la citation ci-dessous (N3797, 3.9.1 / 8):

La représentation de la valeur des types de points flottants est définie par la mise en œuvre.

Autant que je sache, cela donne la mise en œuvre totale liberté dans la définition des limites des les numéros de points flottants . Ils sont spécifiés dans Modèle Classe numeric_Format . Par exemple, xxx

Démo

Ma question est la suivante: les limites supérieure et inférieure des nombres de points flottants sont-elles arbitrairement élevées ou faibles, ou y a-t-il des restrictions? Est-ce que pure c fournit également un ensemble de valeurs défini de la mise en œuvre pour les nombres de points flottants?

Je soupçonne que cela dépend de l'architecture que nous travaillons.


2 commentaires

Avez-vous suivi un coup d'oeil à la norme C? (C'est sensiblement plus court que le C ++ One.)


@OliverCharlesworth oui, j'ai. La norme C définit flt_max, flt_mint et ainsi de suite comme plus que 1e37, 1e-37 correspondant en conséquence, dans quant à la norme C ++.


3 Réponses :


3
votes

Les limites supérieure et inférieure dépendent de la mise en œuvre des compilateurs de nombres de points flottants. Donc, ce n'est pas seulement une limite définie par l'utilisateur. Plutôt sa contrainte mathématique qui dépend de la mise en page de mémoire conçue par le compilateur pour stocker des nombres de points flottants.

Si vous voulez une limite définie par l'utilisateur Vous pouvez utiliser votre classe entier personnalisée qui surcharge des opérateurs de fonctionnement numériques et applique la limite définie de votre utilisateur avant toute opération.


8 commentaires

Est-ce que le compilateur, typiquement, implémente un point flottant? Dans mon expérience, c'est généralement fait par le matériel que le compilateur cible?


@MATSPETERSSON: Qu'en est-il quand il n'y a pas de matériel de FP?


Je pense que les compilateurs peuvent implémenter, mais la plupart des compilateurs choisissent d'externaliser la machine cible. par exemple. GCC représente les nombres de points flottants au format des machines cibles. Cependant, il peut imiter lorsque Cross compilé.


@OliverCharlesworth: Eh bien, il n'est toujours généralement pas mis en œuvre par le compilateur ... et ce matériel existe-t-il toujours? ;)


@MatSpetersson Donc, dans un quincaillerie où l'arithmétique de points flottants (n'allons pas que le matériel ne soit plus matériel sans mise en œuvre arithmétique de poit flottant), le compilateur est-il à jouer par règle du processeur, non?


@MatSpetersson: toujours relativement courant dans le monde intégré.


Non seulement du matériel non-FP. En cas de compilation croisée aussi, il doit être émulé.


@Neelbasu je suppose que vous parlez spécifiquement des optimisations pliantes constantes? Autre que cela, je ne peux pas penser que lorsque la compilation croisée importerait à quel type de code FP est généré.



5
votes

Les limites des types intégrés sont principalement contraintes par les limites matérielles. x64 cpus utilisent généralement Les représentations IEEE 754 pour leurs données de point flottant telles que définies dans la norme FPA (coprocesseur matérielle).

Quoi qu'il en soit, comment les choses sont représentées en interne et manipulées peut varier comme indiqué

La représentation de la valeur des types de points flottants est définie par la mise en œuvre

Un compilateur a généralement des connaissances (notamment se référant à l'arrière-plan qui effectue la génération de code) du système cible sous-jacent et peut donc choisir le bon ensemble d'instructions lorsqu'il est invité à la FP-arithmétique.

Vous pouvez toujours définir un type de données personnalisé qui gère vous-même les ressources physiques. Le terme que vous faites référence peut être arithmétique de précision arbitraire (généralement considérablement plus lente, si vos données conviennent à ce que le matériel Offres, vous devriez y aller).

Dans des cas particuliers (par exemple certaines unités intégrées dans lesquelles aucun FPU n'est disponible ou une opération de point flottante ne peut pas être effectuée) une émulation peut être utilisée. Ceci est moins cher (moins de transistors) bien que lentement.


0 commentaires

2
votes

dans plaine c, vous pouvez #include qui fournit des constantes telles que: xxx

et ainsi que combien de bits et chiffres le Mantissa est, une gamme exposante, etc.

Je suis toujours confondue sur lequel du site de référence C ++ est le "on vous êtes autorisé à poster ici et qui est celui que vous n'êtes pas censé, parce que Vous obtenez des commentaires à ce sujet », mais voici une trouvée dans Google: http://www.cplusplus.com/reference/cfloat/ Comme il s'agit plutôt d'un fichier standard, je m'attends à ce qu'il n'y ait pas beaucoup de différence de toute façon. Bien sûr, cela fait référence à la "version C ++ - ified", mais les macros définies sont les mêmes pour c.

(Notez que les limites C ++ sont généralement implémentées du même constantes qui se trouvent dans float.h dans un sens, directement ou indirectement)


1 commentaires

Vous savez par vous-même que cpluscplus.com, CPPrefreence.com ne sont pas normatifs. C'est la raison pour laquelle je ne peux pas compter sur leur. Bien sûr, si je ne comprends pas ce que la norme dit, j'essaie toujours de le trouver sur ces sites.