6
votes

Single VS Double DaTatypes

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 ma recherche, l'inconvénient d'un double est qu'il nécessite plus d'espace, ce qui n'est pas un problème pour la plupart des applications. Dans ce cas, tous les nombres de points flottants doivent-ils être doubles?

Un peu d'informations de fond: Je travaille avec une application qui traite de nombreuses données sur les coordonnées et les produits chimiques. Quelques clients ont remarqué que lors de l'importation de feuilles de calcul des données, certaines valeurs avec une haute précision sont arrondies la précision d'un seul.


2 commentaires

"La plupart" applications. Pourrait être un problème pour les systèmes embarqués ou lorsque vous avez des millions de doubles.


Ma règle echalique est d'utiliser un double normalement, flotter (apparemment votre unique) lorsque j'ai une bonne raison de (comme économiser de l'espace).


6 Réponses :


2
votes

Comme Mark dit dans son commentaire, l'espace peut être un problème sur des systèmes contraints de la mémoire. Vous voudrez peut-être aussi indexer ou trier une liste et pourquoi le faire en double si vous pouvez stocker vos valeurs en singles?


0 commentaires

4
votes

sur la plupart des applications de bureau, oui.

Bien que si vous en avez un grand nombre d'entre eux, la taille de celle-ci pourrait être suffisamment importante pour être utile si vous n'avez pas besoin de la précision.

Surtout étant donné que tous les ordinateurs de bureau de consommation ont à double consommation ont une arithmétique à virgule flottante à double précision effectuée dans du matériel.


2 commentaires

Les premières cartes CUDA NVIDIA se gèrent plus de flotteurs à une précision à une précision que les doubles par seconde. Je n'ai pas les chiffres à l'esprit, désolé.


Remarque: les processeurs Intel et AMD dans les ordinateurs de bureau communs ont également un matériel arithmétique à une précision unique dans les registres SSE, ce qui prend également en charge plusieurs opérations parallèles.



5
votes

de Cet article .NET < / p>

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. Sur le courant plates-formes, la largeur de données est de 32 bits, pour l'ordinateur et le Système d'exploitation.

Par conséquent, Integer est actuellement la Type de données le plus efficace dans Visual BASIC .NET. Le prochain meilleur est long, court, et octet, dans cet ordre d'efficacité. Vous pouvez améliorer la performance de Court et octet en éteignant l'entier Vérification du débordement, par exemple par Réglage de la suppressionIntegerChecks propriété, mais cela encourt le risque de Calculs incorrects dus à débordements non détectés. Vous ne pouvez pas Basculez cette vérification sur et éteindre pendant Durée; Vous ne pouvez définir sa valeur que Pour la prochaine construction de votre application.

Si vous avez besoin de valeurs fractionnaires, le le meilleur choix est le double, parce que le Processeurs à point flottant du courant Les plates-formes effectuent toutes les opérations dans double precision. Suivant meilleur sont célibataires et décimal, dans cet ordre de efficacité.


2 commentaires

Est-ce que cela dit que le double est plus efficace que célibataire?


Oui, selon l'article, d'un point de vue des opérations (c'est-à-dire la multiplication, la division, etc ...) doit être plus efficace. Bien sûr, autant d'autres l'ont souligné, à partir d'un point de vue d'utilisation de la mémoire unique, c'est mieux. Plus important encore, vous mentionnez que les clients ont remarqué la perte de précision, ce qui implique qu'ils veulent une précision plus élevée. Alors, la question n'est pas ce qui est mieux? C'est, où / pourquoi mes doubles sont-ils lancés vers des célibataires?



1
votes

Doubles Prenez plus de place, mais la précision supplémentaire peut ou non être nécessaire. J'ai fait beaucoup de programmation dans le monde scientifique où l'arithmétique ponctuelle flottante est très courante et que vous avez constaté que vous pouvez souvent faire les calculs en précision double ou supérieure, mais stocker les résultats comme des célibataires sans effets néfastes.

Gardez à l'esprit qu'une fois que les chiffres sont aspirés dans le FPU, ils sont étendus à une très haute précision de toute façon. Cela étant dit, il serait préférable d'essayer ce que vous faites dans les deux précisions et de voir si les résultats sont comparables.

Malheureusement, l'informatique est toujours une science expérimentale.


1 commentaires

Les limites sont calculables (avec difficulté) pour une erreur de point flottante découlant de l'évaluation de toute expression donnée dans la précision donnée.



0
votes

Si vous codez OpenGL, il est normal d'utiliser GLSINGLE (par exemple un seul) plutôt que de GLDOUBLE. Dans presque toutes les circonstances, une précision unique est plus que suffisante pour la plupart des applications graphiques et devrait être plus rapide - bien que je confesse, je ne suis pas certain de cela sur la dernière génération de GPU.

Ma citation préférée à ce sujet est que la précision unique était suffisante pour naviguer vers la lune et le dos, donc en pratique, il est inhabituel de causer un véritable problème. Cela dit dans la plupart des circonstances que j'avais atteint un double de nos jours, car le stockage est bon marché et il est moins susceptible d'être des problèmes binaires étranges à des problèmes décimaux.


0 commentaires

2
votes

Sur certains matériels, l'arithmétique impliquant des valeurs doubles peut prendre plus de plus que celle impliquant des valeurs simples, mais les FPU les plus récents ont un seul type de données natif (par exemple, des valeurs de point variant étendues de 80 bits pour x86) qui seront utilisées en interne pour des calculs Indépendamment du type de données en mémoire que vous utilisez. Ainsi, c'est-à-dire que "les calculs FPU seront plus rapides avec une précision unique" sont généralement pas une raison d'utiliser une seule précision sur le matériel le plus moderne aujourd'hui.

Cela dit, en plus de "utilise moins de mémoire" des raisons élaborées dans les autres réponses, il existe une raison très pratique lorsqu'il s'agit de simd vectoriel des instructions telles que SSE et Altivec - une précision unique est identiaire à être deux fois plus vite. En tant que double précision, étant donné que les instructions fonctionnent sur des vecteurs de taille fixe et que vous pouvez créer deux fois plus de valeurs de précision unique dans un seul vecteur, le temps de traitement restant généralement identique.

Par exemple, avec une unité de vecteur de 128 bits capable de traiter les multiplications de vecteur dans 2 cycles d'horloge, vous pouvez obtenir un débit de 2 multiplications de précision par horloge par horloge, contre 1 double précision, car vous pouvez 4 singles dans un vecteur, contre deux doubles.

Un effet similaire se produit avec la bande passante de la mémoire et n'est pas spécifique au traitement de vecteur - si vous avez de grandes tableaux de doubles, ils ne prendront pas seulement deux fois l'espace, mais peuvent prendre deux fois plus de temps pour traiter dans le cas où Votre algorithme est contrainte de la bande passante (ce qui est de plus en plus susceptible de susciter la taille croissante et la diminution des latences d'unités de traitement de vecteur).


2 commentaires

et références: ce que chaque informatique devrait connaître sur l'arithmétique de point flottant - docs.sun .COM / SOURCE / 806-3568 / NCG_GOLDERG.HTML Point flottant (de la programmation en Java) - CS.PRINCETON.EDU/Introcs/91Float


Notez que j'ai un double coché et Altivec prend en charge uniquement les valeurs FP de précision unique de précision 32 bits pour SIMD, mais au moins les différentes saveurs SSE supportent définitivement les deux.