Quand utiliser un flotteur

Il y a des années, j'ai appris à la dure les problèmes de précision avec les flotteurs, alors j'ai arrêté de les utiliser. Cependant, je rencontre toujours du code en utilisant des flotteurs et cela me fait grincer des dents parce que je sais que certains calculs seront inexacts.

Alors, quand est-il approprié d'utiliser un flotteur?

Modifier: Comme info, Je ne pense pas que j'ai rencontré un programme où la précision d'un nombre n'est pas importante. Mais je serais intéressé à entendre des exemples.

37
demandé sur mskfisher 2009-01-02 23:46:54

7 réponses

Réponse Courte: Vous n'avez qu'à utiliser un float quand vous savez exactement ce que vous faites et pourquoi.

Réponse longue: floats (par opposition à doubles) ne sont plus vraiment utilisés en dehors des API 3D pour autant que je sache. Les flotteurs et les doubles ont les mêmes caractéristiques de performance sur les processeurs modernes, les doubles sont un peu plus gros et c'est tout. En cas de doute, utilisez simplement double.

Oh oui, et utilisez décimal pour les calculs financiers, bien sûr.

52
répondu Tamas Czinege 2009-01-02 20:53:36

Tous les calculs en virgule flottante sont inexactes dans un cas général, flotte juste plus que des doubles. Si vous voulez plus d'informations avoir une lecture de Ce Que Tout Informaticien Devrait Savoir Sur L'Arithmétique À Virgule Flottante

Quant à l'utilisation des flotteurs - ils sont souvent utilisés lorsque la précision est moins importante que l'économie de mémoire. Par exemple, des simulations de particules simples dans les jeux vidéo.

11
répondu U62 2009-01-02 20:53:51

Il y a beaucoup de cas où vous voudriez utiliser un float. Ce que je ne comprends pas cependant, c'est ce que vous pouvez utiliser à la place. Si vous voulez dire utiliser double au lieu de float, alors oui, dans la plupart des cas, vous voulez le faire. Cependant, double aura également des problèmes de précision. Vous devez utiliser decimal chaque fois que la précision est importante.

float et double sont très utiles dans de nombreuses applications. decimal est un type de données coûteux et sa plage (la magnitude du plus grand nombre qu'il peut représenter) est inférieure à double. Les ordinateurs ont généralement un support de niveau matériel spécial pour ces types de données. Ils sont utilisés beaucoup dans l'informatique scientifique. Fondamentalement, ce sont des types de données fractionnaires primaires que vous souhaitez utiliser. Cependant, dans les calculs monétaires, où la précision est extrêmement importante, decimal est la voie à suivre.

7
répondu Mehrdad Afshari 2009-01-02 20:50:10

Tout d'abord, n'utilisez jamais de flotteurs ou de doubles si vous voulez représenter exactement les valeurs décimales - utilisez des types entiers (int, long, etc.) ou décimaux (qui est juste un type entier avec un facteur de mise à l'échelle). Les flottants et les doubles sont convertis en interne en une représentation exponentielle en base 2 et les nombres représentés exactement dans une représentation exponentielle en base 10 ne peuvent en général pas être représentés exactement. (Par exemple, le nombre 10 n'est représenté qu'approximativement par des flotteurs ou double).

Deuxièmement, en termes de précision, cela dépend de ce dont vous avez besoin. Je ne suis pas d'accord avec votre sentiment qu'il n'y a jamais de calculs où la précision n'a pas d'importance. Vous avez normalement un besoin spécifique que votre résultat final est précis pour dire, 3 chiffres. Cela n'a pas de sens de chercher la plus grande précision possible si votre entrée n'a qu'une précision limitée-disons que vous pesez 5g de farine et que votre balance n'a qu'une précision de 0,5 g. Cela dit, le calcul intermédiaire habituellement profitez d'une plus grande précision, mais quelque chose qui est plus important que la haute précision si la vitesse assez souvent.

Troisièmement, lorsque vous préformez une série de calculs, disons dans une boucle, vous devez savoir ce que vous faites lorsque vous traitez des calculs inexacts - vous encourrez des erreurs d'arrondi et certains algorithmes peuvent ne pas arriver à une réponse à un degré de précision. Comprendre ces questions en détail peut nécessiter un cours d'analyse numérique. Cela ne dépend pas de savoir si vous choisissez flotteurs ou doubles pour vos calculs.

Pour les calculs en virgule flottante, j'irais généralement avec des doubles car ils sont plus généraux et plus rapides que les flotteurs. Cependant, les flotteurs sont plus petits et si vous avez besoin de stocker beaucoup d'entre eux, ils sont le choix pour éviter les problèmes de performance en raison des échecs de cache.

À ma connaissance, le traitement en virgule flottante est pris en charge dans le matériel pour les doubles mais pas les flotteurs, donc l'utilisation de flotteurs entraîne une conversion en double. Cependant, certaines routines seraient arrêtez-vous plus tôt lors du calcul itératif d'une valeur lorsque vous passez un flottant, car cela implique que vous ne voulez qu'environ 8 chiffres de précision contre environ 16 pour les doubles.

7
répondu ILoveFortran 2009-01-03 15:09:20

La raison la plus courante à laquelle je pourrais penser est d'économiser de l'espace. Non pas que cela vaut souvent la peine de s'inquiéter, mais dans certains cas, cela compte. Un flotteur prend la moitié autant de mémoire qu'un double, de sorte que vous pouvez obtenir deux fois plus dans le même espace. Par exemple, j'ai eu un tableau de nombres qui était trop grand pour tenir dans la RAM en tant que doubles mais en forme comme un tableau flottant.

5
répondu John D. Cook 2009-01-02 21:09:08

Il y a en fait une chose où il est encore courant d'utiliser des flotteurs aka "single precision" avec 32 bits: applications graphiques et impression.

L'autre raison sont les cartes graphiques avec leurs GPU. Plus le type de données est petit, plus vite l'opération car moins de bits doivent être transportés. Les types de données entiers ont des problèmes avec des Images à Plage dynamique élevée: L'œil est capable de fonctionner sur une plage de luminosité de 1: 10^13 et discerne ca. 4000 niveaux. Ainsi, alors que les types de données entiers peuvent stocker le nombre de niveaux, ils sont incapables de stocker la luminosité de l'arrière-plan alors que les flotteurs n'ont aucun problème avec cela. En fait, IEEE 754R permet un nouveau flotteur "demi-précision" avec 16 bits et un 10 bits mantisse qui perd une certaine précision mais permettrait une vitesse encore plus grande. OpenGL et DirectX, par exemple, utilisent beaucoup de flotteurs. L'œil est très indulgent avec des artefacts, donc pas de problème là-bas.

Tous les autres médias construisant sur des graphiques héritent des flotteurs en tant que mesure conviviale. La mantisse a 24 bits permettant donc 2 ^ 24 = 16,7 millions d'étapes consécutives. Si vous avez une imprimante avec une résolution de 2000 dpi, vous pouvez toujours imprimer 213x213 m feuille. Plus de suffisamment de précision.

5
répondu 2009-02-20 17:45:15

Utilisez float pour performance et taille . Si vous pouvez gérer la perte de précision.

S'il est vrai qu'un processeur moderne prend le même temps pour traiter les opérations de précision simple et double, vous pouvez parfois obtenir deux fois le débit si vous utilisez des flotteurs avec SIMD (MMX/SSE/etc. sur x86) instructions.

ESS registres de 128 bits, et peut contenir 4 flotteurs ou 2 doubles. Ainsi, s'il est utilisé correctement, vous pouvez en faire deux fois plus opérations avec flotteurs par rapport aux doubles.

La réduction de taille (4 octets au lieu de 8) devient importante lorsqu'il s'agit de très grands ensembles de données (et la réduction de taille améliore généralement les performances en raison de la mise en cache, etc.)

3
répondu nimrodm 2009-01-03 07:41:52