web-dev-qa-db-fra.com

long double vs double

Je sais que la taille des différents types de données peut changer en fonction du système sur lequel je suis. J'utilise XP 32bits, et en utilisant l'opérateur sizeof () en C++, il semble que le double long soit de 12 octets et le double de 8.

Cependant, la plupart des sources majeures indiquent que le double long est de 8 octets, et la plage est donc la même qu'un double.

Comment se fait-il que j'ai 12 octets? Si le double long fait en effet 12 octets, cela n'élargit-il pas également la plage de valeurs? Ou la signature longue n'est utilisée (les chiffres du compilateur) que lorsque la valeur dépasse la plage d'un double et s'étend donc au-delà de 8 octets?

Merci.

59
CppLearner

Citant de Wikipedia :

Sur l'architecture x86, la plupart des compilateurs implémentent le double long comme le type de précision étendue 80 bits pris en charge par ce matériel (parfois stocké en 12 ou 16 octets pour maintenir la structure des données.

et

Les compilateurs peuvent également utiliser le double long pour un format de précision quadruple de 128 bits, qui est actuellement implémenté dans le logiciel.

En d'autres termes, oui, un long double peut être capable de stocker une plus grande plage de valeurs qu'un double. Mais cela dépend entièrement du compilateur.

59
Borealid

Pour les compilateurs modernes sur x64, Clang et GCC utilisent un double de 16 octets pour long double tandis que VC++ utilise un double de 8 octets. En d'autres termes, avec Clang et GCC, vous obtenez une double précision plus élevée, mais pour VC++ long double est identique à double. Les processeurs x86 modernes prennent en charge ces doubles de 16 octets, donc je pense que Clang et GCC font la bonne chose et vous permettent d'accéder à des capacités matérielles de niveau inférieur en utilisant des primitives de langage de niveau supérieur.

5
Shital Shah

Les tailles d'octets standard pour les nombres sont les tailles minimales garanties sur toutes les plateformes. Ils peuvent être plus grands sur certains systèmes, mais ils ne seront jamais plus petits.

3
scott77777

En ce qui concerne mon expérience de débutant en programmation:

  • Utiliser un flottant normalisé périodiquement [-1,0, + 1,0]

  • Maintenez la valeur de normalisation séparément avec double ou long double

  • La normalisation introduit du bruit = petites erreurs = hautes fréquences aux valeurs des variables

  • De temps en temps, il est utile de normaliser avec la valeur médiane conservée séparément et de conserver les données triées (l'ordre des données d'origine pourrait être enregistré comme vecteur de permutation)

0
Piotr Lenarczyk