web-dev-qa-db-fra.com

Pourquoi utilisons-nous toujours des flotteurs?

Je comprends pourquoi les flotteurs ont servi un but dans le passé. Et je pense que je peux voir pourquoi ils sont utiles dans certains exemples de simulation aujourd'hui. Mais je pense que ces exemples sont plus exceptionnels que communs. Je ne comprends donc pas pourquoi les flottants sont plus répandus dans les simulations simples plutôt que les entiers de très haute précision.

Un argument classique est que les flottants offrent une plus grande plage, mais les entiers de haute précision peuvent maintenant relever ce défi. Par exemple: avec les processeurs 64 bits modernes, nous pouvons faire des calculs entiers rapides jusqu'à 2 ^ 64. Le système solaire mesure un peu moins de 10 milliards de kilomètres de large. 10 milliards de km divisés par 2 ^ 64 font environ 5 microns. N'est-il pas suffisant de représenter la position dans le système solaire avec la précision d'un demi-cheveu humain?

D'un autre côté, les erreurs d'arrondi des calculs flottants peuvent poser des problèmes. Vous devez tenir compte de l'échelle des calculs pour vous assurer que vous n'introduisez pas par erreur d'erreur dans votre simulation.

Alors pourquoi les ordinateurs personnels ont-ils encore besoin de FPU? Pourquoi ne pas simplement laisser des flotteurs aux supercalculateurs?

30
anon

Votre argumentation contre les nombres à virgule flottante est très fragile, probablement à cause de la naïveté. (Aucune infraction ici, je trouve que votre question est en fait très intéressante, j'espère que ma réponse le sera également.)

Un argument classique est que les flottants offrent une plus grande plage, mais les entiers de haute précision peuvent maintenant relever ce défi. Par exemple: avec les processeurs 64 bits modernes, nous pouvons faire des calculs entiers rapides jusqu'à 2 ^ 64. Le système solaire mesure un peu moins de 10 milliards de kilomètres de large. 10 milliards de km divisés par 2 ^ 64 font environ 5 microns. N'est-il pas suffisant de représenter la position dans le système solaire avec la précision d'un demi-cheveu humain?

Vous semblez faire une déclaration implicite, selon laquelle une fois que nous connaissons l'échelle de notre problème, nous pouvons utiliser point fixe l'arithmétique par rapport à cette échelle pour résoudre ce problème.

Parfois, c'est une approche valide, et c'est celle choisie par Knuth pour implémenter les calculs de distance dans TeX. Ce qui rend l'utilisation de l'arithmétique à virgule fixe pertinente dans ce cas, c'est que toutes les quantités apparaissant dans un calcul sont soit des entiers, soit des distances se produisant dans un problème de composition. Parce que le champ d'applications est si étroit, il est logique de choisir une très petite longueur unitaire, beaucoup plus petite que ce que l'œil humain peut percevoir, et de convertir toutes les quantités en multiples de cette unité. Cela conduit à un résultat très important: dans les problèmes typographiques reposant sur cette représentation des nombres, nous n'avons jamais besoin de multiplier deux longueurs ensemble, de sorte que la perte de précision causée par les multiplications en arithmétique à virgule fixe ne se produit pas.

La plupart du temps, c'est cependant une approche terrible, voici quelques raisons pour lesquelles:

  1. Il existe des constantes physiques et vous ne pouvez pas toujours adapter leurs unités de manière sensée.

    Tenez compte de la configuration de votre système solaire. La constante gravitationnelle est de 6,67 × 10−11 N · (m/kg) 2, la vitesse de la lumière est de 3,00x10 + 5 m/s, la masse du Soleil est de 1,9891 × 10 + 30 kg et la masse de la Terre est 5,97219 × 10 + 24. Dans votre réglage en virgule fixe, vous ne pourrez pas représenter la constante gravitationnelle avec une précision satisfaisante. Vous allez donc changer l'unité. Mais ce faisant, vous devez remplacer chaque nombre, en remplaçant les quantités connues et familières, par des valeurs cryptiques. De plus, il est très probable que trouver un système pour représenter correctement toutes les constantes dont vous avez besoin ne soit même pas possible. Pensez aux physiciens quantiques travaillant avec des particules infiniment petites dont la vitesse est proche de la vitesse de la lumière.

  2. Il existe des constantes mathématiques sans unité.

    La valeur de Pi 3,1415 (jusqu'à la 4e décimale) sans aucune unité attachée. Il existe en fait de nombreuses constantes utiles similaires qui ne peuvent pas être représentées avec précision dans un système de points fixes arbitraires. Dans le cadre du système solaire que vous avez décrit, nous pouvons représenter Pi avec 6 décimales, ce qui donne une précision terrible lors du calcul de la circonférence d'une orbite planétaire, par exemple.

  3. Dans un système à virgule fixe, nous devons connaître à l'avance la taille de la quantité que vous calculez.

    Supposons que nous ne connaissions toujours pas la valeur de la constante gravitationnelle. Nous prenions beaucoup de mesures et écrivions un programme informatique pour trouver une approximation de cette constante. Malheureusement, dans le cadre du système solaire que vous avez décrit, la constante gravitationnelle est représentée par 0, qui devrait être le résultat, plutôt inutile, de notre
    calcul.

  4. Certaines fonctions mathématiques ne fonctionneront pas bien avec une arithmétique de précision fixe, en raison de leur taux de croissance.

    Les plus importants sont l'exponentielle et la fonction gamma, ce qui signifie pratiquement que chaque programme fonctionnant avec autre chose que des polynômes sera défectueux.

  5. En arithmétique à virgule fixe, il est très difficile de multiplier et de diviser les nombres correctement.

    En effet, si nous ne connaissons pas a priori la taille des nombres, nous ne pouvons pas dire si leur produit rentrera dans la représentation. Autrement dit, nous devrions vérifier manuellement le sous-dépassement de précision avant chaque multiplication.

Conclusion

Alors que la conclusion de votre question implique que l'arithmétique à virgule fixe pourrait être suffisante pour des calculs polyvalents et que l'arithmétique à virgule flottante devrait être réservée aux supercalculateurs, c'est précisément l'inverse qui est vrai: l'arithmétique à virgule flottante est un très bon et très judicieux outil pour les calculs polyvalents, alors que le point fixe ne fonctionnera bien que dans des cas très spécifiques et bien analysés.

46
user40989

Parce que le passage aux entiers ne résout rien. Le problème avec les flotteurs n'est pas qu'ils ont des inexactitudes, c'est que la moitié des personnes qui les utilisent ne font pas attention à ce qui se passe. Ces mêmes personnes n'accorderont pas l'attention voulue aux unités qu'elles utilisent lorsqu'elles utilisent un nombre entier, et un ensemble différent de ratés se produira.

Répétez après moi: il n'y a PAS de solution miracle.

26
Michael Kohne
  1. Les caractéristiques physiques de l'univers (comme le nombre d'atomes qu'il contient) ne sont pas utiles pour déterminer les limites de la taille des nombres, car des calculs utiles existent en utilisant des nombres ayant des plages plus larges.

  2. Les nombres à virgule flottante sont un compromis entre la précision et la plage. Ils abandonnent délibérément une certaine précision pour atteindre une plus grande portée.

21
Robert Harvey

Parce que la plupart des processeurs que vous utilisez dans votre vie quotidienne sont pas les processeurs 64 bits modernes avec des calculs entiers rapides et fous ou une surabondance d'espace. La plupart de vos processeurs sont des appareils 8-16 bits qui exécutent des choses comme votre voiture, votre micro-ondes ou votre montre.

En outre, que se passe-t-il lorsque vous devez parler de la moitié d'une unité, comme un demi-gallon ou un demi-cheveu humain? Les nombres entiers sont excellents, mais vous finissez par parler en notations comme 6,4216 × 1030 ce qui, bien que précis, n'est pas la façon dont les humains pensent naturellement.

13
Ampt

Utiliser un flottant au lieu d'un entier de haute précision (avec des conversions!) Est simplement plus facile et plus rapide. Je peux taper

float myVar = 0.15; //my value...

et passer au reste de la logique de ma simulation. Je n'ai pas besoin de passer plus de temps à penser à convertir en int et à m'assurer que toutes mes échelles sont correctes.

Et les résultats finissent par être assez bons. J'échangerai avec plaisir la vitesse de développement sur des niveaux ridicules de précision présumée et relative dans mon travail.

10
user53019

Je travaille sur un rapport en tapant ceci. L'un des champs est une long millisecondes de durée que j'ai obtenue ailleurs. Cela va être envoyé à Microsoft Excel et les unités de durée qu'il utilise sont des jours décimaux (1.25 = 1 jour, 6 heures).

Bien sûr, vous pouvez subdiviser une plage de la valeur la plus basse possible à la plus grande et avoir des unités entières entre elles, mais c'est une unité vraiment maladroite avec laquelle travailler dans la plupart des cas.

Il y a trois fois qui entrent en jeu lorsque vous travaillez avec des ordinateurs:

  1. Le temps qu'il faut pour coder
  2. Le temps qu'il faut pour courir
  3. Le temps qu'il faut pour maintenir

Lorsque vous travaillez avec des entiers plutôt qu'avec des virgules flottantes, vous échangez les temps 1 et 3 pour que le temps 2 s'exécute plus rapidement. Mais voici le truc ... Je ne le fais pas besoin pour courir vite.

S'il y a une erreur d'arrondi à la 10ème décimale dans le calcul d'un temps décimal, c'est des fractions de seconde dont je me fiche (le rapport est HH:MM:SS - ne pas HH:MM:SS.000). Ils ne sont pas arrondis dans ce que je traite ou présente. Le point flottant est assez bon.

Calculer l'aire d'un cercle pour un graphique ou où pi trouve son chemin dans les probabilités avec seulement des entiers n'est pas amusant . Pi est pas 3.

C'est aussi plus rapide pour moi de travailler avec la virgule flottante dans de nombreux endroits. 1.5 est 1.5 non (15 avec une échelle de 1). Je peux donc écrire mon code plus rapidement et la personne qui l'entretient peut le lire plus rapidement et travailler avec.

Si vous avez besoin d'utiliser la précision en virgule fixe (argent) ou des mathématiques entières pures pour accélérer certaines applications (simulation de collision de galaxies et de bombes nucléaires), utilisez-les par tous les moyens. Mais pour la plupart des choses, la virgule flottante est très bien si vous n'avez vraiment pas affaire à ces situations spécialisées.


Cela ne fonctionne qu'avec une extrémité de l'échelle. Les nombres qui peuvent être subdivisés entre 0 et 264 (ou quel que soit le nombre de bits que vous utilisez). 264 est d'environ 1019. Mais que faire si vous devez travailler avec 1020 ou 10200? Il y a des problèmes qui fonctionnent dans ce domaine qui ne sont pas limités aux super-ordinateurs. Il y a des moments où les simulations et les jeux réguliers utilisent des flottants - souvent à cause des restrictions sur la bibliothèque, mais ils les utilisent aussi là-bas. Parfois, c'est juste plus facile.

Liés à gamedev.SE: A propos de la précision en virgule flottante et pourquoi l'utilisons-nous toujours

10
user40980

Parce que parfois même un entier 64 bits ne vous donnera pas assez de plage.

Par exemple, dans le code physique sur lequel je travaille actuellement, j'ai besoin de convertir certaines masses moléculaires entre des grammes par mole (que le format d'entrée/sortie utilise) et des kilogrammes par molécule (dont les calculs internes ont besoin pour la cohérence des unités).

Il y a environ 279 molécules dans une taupe, donc cette conversion particulière implique de multiplier ou de diviser les quantités par un facteur de 1000 × [~ # ~] n [~ # ~] UNE ≈ 6,022 × 1026 ≈ 289.

Bien sûr, ce problème particulier pourrait être traité en virgule fixe, simplement en utilisant différents types numériques à virgule fixe pour les quantités par mole et par molécule, mais cela ajoute beaucoup de complexité au code qui n'en a pas vraiment besoin. Et ceci est loin d'être un cas isolé - les calculs physiques eux-mêmes impliquent souvent une multiplication avec des choses comme constante de Boltzmann ≈ 2-76. En théorie, je pourrais gérer tout cela en utilisant beaucoup de types de points fixes différents et en gardant une trace des numéros qui doivent être stockés en utilisant quel type, mais pourquoi s'embêter? La virgule flottante me permet d'utiliser un seul type numérique pour les stocker tous.

En outre, le plus important ici est que ces masses moléculaires sont finalement basées sur des données expérimentales. Aucun d'entre eux n'est connu à plus de dix chiffres significatifs ou plus, et même cela est bien plus que la précision de certains autres paramètres qui entrent dans les calculs. Même les flotteurs simple précision seraient plus que suffisants pour les stocker - bien que j'utilise en fait des doubles parce que, eh bien, il n'y a aucune vraie raison de ne pas le faire.

5
Ilmari Karonen

Pourquoi les programmeurs utilisent-ils toujours des flottants? Aux réponses (généralement bonnes) déjà présentes, j'ajouterais:

Parce que la plupart des langages de programmation ne fournissent pas de type "décimal", ou du moins ne le rendent pas aussi pratique à utiliser qu'un flottant. S'ils sont intégrés au langage et faciles à utiliser, les nombres décimaux à précision arbitraire sont beaucoup plus intuitifs et plus faciles à utiliser que les nombres binaires à virgule flottante, qui donnent des réponses amusantes lorsque vous essayez de calculer des choses comme 0.3 - 0.2.

Oui, vous pouvez utilisez des entiers comme nombres décimaux à virgule fixe. L'addition et la soustraction fonctionnent très bien, mais des étapes supplémentaires sont nécessaires lors de la multiplication/division (le résultat doit être déplacé vers le haut/bas). Cela a peut-être gagné en performances il y a 15 ou 20 ans, mais sur les processeurs d'aujourd'hui, devinez quoi? L'utilisation de flotteurs est plus rapide. En fait, l'arithmétique en virgule flottante est parfois encore plus rapide que entier arithmétique!

5
Alex D
  • Le traitement audio général utilise des floats car ils sont suffisants et rapides à calculer, en utilisant une précision plus élevée que ce que propose le float 32 bits est purement inutile; les implémentations dites numériquement "exactes" nécessiteraient beaucoup plus de puissance de traitement et pourraient ne pas correspondre aux spécifications en temps réel. Certaines implémentations spécifiques utilisent des points fixes, comme pour certaines (anciennes) plates-formes intégrées, mais ce n'est pas la portée de votre question. Voir http://broadcastengineering.com/audio/fixedpoint_vs_floatingpoint .

  • La plupart des autres implémentations d'algorithmes de traitement du signal et de traitement d'image utilisent la virgule flottante pour les mêmes raisons. Les implémentations à virgule fixe ou entière sont uniquement dérivées des algorithmes à virgule flottante à des fins spécifiques.

2
moala

Si vous voulez avoir des coefficients, les flotteurs sont tout simplement meilleurs.

Par exemple, 54,2% de 12442, vous faites juste 0,542 * 12442.

N'oubliez pas que les flottants sont calculés par une unité dédiée sur le CPU, le FPU. Ils ne sont évidemment pas meilleurs pour le matériel embarqué, car ils consomment plus d'énergie, mais ils sont très importants dans la programmation de jeux et la programmation graphique.

En science et en finance, le float n'est pas vraiment apprécié car il peut y avoir perte de données.

En simulation scientifique, je pense qu'ils ne sont pas utilisés, la bibliothèque GMP vous permet de faire un flottant de 128 bits ou même plus, vous pouvez théoriquement avoir une précision aussi grande que possible, au détriment de la vitesse.

Cependant, dans la simulation en temps réel, le flottement est préféré. Il existe certaines précautions lors de l'utilisation du nombre flottant si vous souhaitez éviter la perte de données ou l'accumulation d'erreurs. Par exemple, Blizzard utilise une méthode déterministe pour changer l'état du jeu pendant le jeu multijoueur de Starcraft 2, car seuls les ordres des joueurs sont transmis, et non les positions des unités.

Les flotteurs ont juste leur application, ils ont des avantages et des inconvénients.

0
jokoon