Question

Il y a des années, j’ai appris à la dure les problèmes de précision des flotteurs, j’ai donc cessé de les utiliser. Cependant, je rencontre toujours du code qui utilise des flottants, ce qui me fait grincer des dents, car je sais que certains calculs seront inexacts.

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

MODIFIER: En tant qu'information, je ne pense pas avoir rencontré un programme dans lequel l'exactitude d'un nombre n'est pas importante. Mais j'aimerais entendre des exemples.

Était-ce utile?

La solution

Réponse courte: vous devez utiliser un float seulement si vous savez exactement ce que vous faites et pourquoi.

Réponse longue: les flottants (par opposition aux doubles ) ne sont plus réellement utilisés en dehors des API 3D, à ma connaissance. 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 un nombre décimal pour les calculs financiers, bien sûr.

Autres conseils

Tous les calculs en virgule flottante sont inexacts dans un cas général, flottent plus que les doubles. Si vous voulez plus d’informations, lisez Ce que tout informaticien devrait savoir sur l'arithmétique en virgule flottante

Quant aux moments où les flottants sont utilisés - 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.

Tout d’abord, n’utilisez jamais de doubles ou de flottants si vous voulez représenter exactement les valeurs décimales - utilisez des types entiers (int, long, etc.) ou décimaux (ce qui est simplement un type entier avec un facteur d’é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é que de manière approximative par des flottants ou des doubles).

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 importe peu. Vous avez normalement un besoin spécifique que votre résultat final est précis, à savoir 3 chiffres. Cela n’a aucun sens de rechercher la plus grande précision possible si votre saisie n’a qu’une précision limitée: supposez que vous pesez environ 5 g de farine et que votre balance n’a qu’une précision de 0,5 g. Cela dit, les calculs intermédiaires bénéficient généralement d’une précision supérieure, mais ils sont plus importants que la haute précision si la vitesse est assez souvent utilisée.

Troisièmement, lorsque vous effectuez une série de calculs, par exemple dans une boucle, vous devez savoir ce que vous faites lorsque vous traitez avec des calculs inexacts - vous encourrez des erreurs d'arrondi et certains algorithmes peuvent ne pas aboutir à une réponse degré de précision. Comprendre ces questions en détail peut nécessiter un cours d’analyse numérique. Cela ne dépend pas du fait que vous choisissiez des flottants ou des doubles pour vos calculs.

Pour les calculs en virgule flottante, je choisirais généralement les doubles, car ils sont plus généraux et plus rapides que les flottants. Toutefois, les flottants sont plus petits et si vous devez en stocker beaucoup, ils vous permettent d'éviter les problèmes de performances dus à des erreurs de cache.

À ma connaissance, le traitement par virgule flottante est pris en charge dans le matériel pour les doublons mais pas pour les flottants. Par conséquent, l’utilisation de ces flottants entraîne une conversion en double. Cependant, certaines routines s’arrêteraient plus tôt lors du calcul d’une valeur de manière itérative lorsque vous passerez un float, car cela implique que vous ne souhaitiez qu’une précision d’environ 8 chiffres, contre environ 16 pour les doubles.

Il existe de nombreux 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 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 décimal 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 une prise en charge matérielle spéciale pour ces types de données. Ils sont utilisés beaucoup en 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, décimal est la voie à suivre.

La raison la plus courante à laquelle je pouvais penser est de gagner de la place. Non que cela vaille souvent la peine de s’inquiéter, mais dans certains cas, cela compte. Un float utilise deux fois moins de mémoire qu'un double, vous pouvez donc en avoir deux fois plus dans le même espace. Par exemple, j'ai eu un tableau de nombres trop volumineux pour tenir dans la RAM en double mais pour un tableau qui flotte.

Il y a en fait une chose où il est encore courant d'utiliser des flotteurs aka " simple précision " 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 peut 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 ne peuvent pas stocker la luminosité de l'arrière-plan, tandis que les valeurs flottantes ne posent aucun problème. En fait, IEEE 754R permet une nouvelle "demi-précision". float avec 16 bits et 10 bits mantisse qui perd de la précision mais permettrait une vitesse encore plus grande. OpenGL et DirectX, par exemple utilisez beaucoup les flotteurs. L'œil est très tolérant avec les artefacts, donc pas de problème.

Tous les autres supports de création graphique héritent des flottants comme mesure pratique. La mantisse a 24 bits permettant ainsi 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 feuilles. Plus qu'assez de précision.

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

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

Les registres

SSE ont une largeur de 128 bits et peuvent contenir 4 flotteurs ou 2 doubles . Ainsi, si vous l'utilisez correctement, vous pouvez effectuer deux fois plus d'opérations avec des flottants qu'avec des doubles.

La réduction de la taille (4 octets au lieu de 8) devient importante pour les très grands ensembles de données (et la réduction de la taille améliore également les performances en raison de la mise en cache, etc.)

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