Simple vs types de données Double
-
18-09-2019 - |
Question
Y a-t-il des situations où il serait plus logique d'utiliser un seul type de données au lieu d'un double? De mes recherches, l'inconvénient d'un double est qu'il nécessite plus d'espace, ce qui est un problème pour la plupart des applications. Dans ce cas, si tous les nombres à virgule flottante double être?
Un peu d'information de fond: Je travaille avec une application qui traite avec beaucoup de données sur les coordonnées et les produits chimiques. Quelques clients ont remarqué que lors de l'importation des feuilles de calcul de données, certaines valeurs avec une grande précision sont arrondies la précision d'un seul.
La solution
Sur la plupart des applications de bureau, oui.
Bien que si vous avez un choix énorme d'entre eux, réduire de moitié la taille de ce pourrait être assez important pour être utile si vous n'avez pas besoin de la précision.
En particulier, étant donné que à peu près tous les postes de consommation ont double précision arithmétique en virgule flottante fait dans le matériel.
Autres conseils
De ce article .net
Type de données Largeur
Les types de données les plus efficaces sont ceux qui utilisent la largeur de données native de la plate-forme d'exécution. le courant les plates-formes, la largeur de données est de 32 bits, pour l'ordinateur et la système d'exploitation.
Par conséquent, Integer est actuellement la plupart des types de données efficace dans Visual Basic .NET. meilleures sont longues, courtes Ensuite, et Byte, dans cet ordre d'efficacité. Vous pouvez améliorer les performances de Court et Byte en éteignant nombre entier vérification de débordement, par exemple réglage des RemoveIntegerChecks la propriété, mais cela entraîne le risque de calculs erronés en raison de non détectés. déversoirs Vous ne pouvez pas activer cette vérification et hors cours le temps d'exécution; vous ne pouvez définir sa valeur pour la construction de votre prochaine application.
Si vous avez besoin des fractions, les meilleur choix est double, parce que le processeurs à virgule flottante de courant plates-formes effectuent toutes les opérations double precision. Meilleure sont célibataires et décimal, dans cet ordre de efficacité.
Comme Mark dit dans son commentaire, l'espace peut être un problème sur les systèmes limités en mémoire. Vous pouvez également indexer ou trier une liste, et pourquoi faire le double si vous pouvez stocker vos valeurs en simple?
Sur certains matériels, l'arithmétique impliquant des valeurs doubles peut prendre plus de temps que celle impliquant des valeurs uniques, mais la plus récente FPU ont un seul type de données natif (par exemple, 80 bits étendue des valeurs à virgule flottante pour x86) qui seront utilisés en interne pour les calculs quel que soit en mémoire type de données que vous utilisez. Donc, c'est-à-dire que « les calculs FPU sera plus rapide avec une précision unique » est généralement pas une raison d'utiliser une seule précision sur la plupart aujourd'hui du matériel moderne.
Cela dit, en plus de la « utilise moins de mémoire » raisons développées dans les autres réponses, il y a une raison très pratique en ce qui concerne des instructions vectorielles SIMD comme SSE et AltiVec - simple précision est likey être deux fois plus vite comme double précision, étant donné que les instructions fonctionnent sur des vecteurs de taille fixe, et vous pouvez farcir deux fois plus de valeurs de précision unique dans un seul vecteur, avec le temps de traitement en général reste le même.
Par exemple, avec une unité vectorielle 128 bits capable de multiplications traitement de vecteur dans 2 cycles d'horloge, vous pourriez obtenir un débit de 2 multiplications simple précision par cycle d'horloge, contre 1 double précision, puisque vous pouvez 4 singles dans un vecteur, par rapport à deux doubles.
Un effet similaire se produit avec une bande passante de la mémoire et n'est pas spécifique au traitement vectoriel - si vous avez de grands tableaux de doubles, ils ne prendront pas seulement deux fois l'espace, mais peut prendre jusqu'à plus de temps pour traiter deux fois dans le cas où votre algorithme est une bande passante limitée (qui est de plus en plus probable étant donné la taille de plus en plus et latences diminution des unités de traitement vectoriel).
Double occupent plus d'espace, mais la précision supplémentaire peut ou peut ne pas être nécessaire. Je l'ai fait beaucoup de programmation dans le monde scientifique où l'arithmétique en virgule flottante est très fréquent et ont constaté que souvent, vous pouvez faire les calculs en double précision ou plus, mais stocker les résultats en tant que célibataires sans mauvais effet.
Gardez à l'esprit qu'une fois que les chiffres sont aspirés dans la FPU, ils sont étendus à une très grande précision de toute façon. Cela étant dit, il serait préférable d'essayer tout ce que vous faites dans les deux precisions et voir si les résultats sont comparables.
Malheureusement, le calcul est encore une science expérimentale.
Si vous codez OpenGL alors il est normal d'utiliser GLSingle (par exemple simple) plutôt que GLDouble. Dans presque tous les cas simple précision est plus que suffisant pour la plupart des applications graphiques et devrait être plus rapide - même si je vous avoue que je ne suis pas certain de cela sur la dernière génération de processeurs graphiques.
Ma citation préférée à ce sujet est que la précision simple était suffisante pour accéder à la lune et retour, dans la pratique, il est rare de provoquer un réel problème. Cela dit dans la plupart des cas j'atteins un double de nos jours que le stockage ne coûte pas cher et il y a moins de chances d'être un binaire impair en décimal questions.