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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top