Pourquoi les nombres à virgule flottante sont-ils souvent utilisés en sciences / ingénierie?


33

En recherchant l’exactitude des nombres en virgule flottante, j’ai vu à quelques endroits une déclaration semblable à

" float et double sont ( conçus pour / utilisés souvent dans ) des calculs d'ingénierie et scientifiques "

De mon point de vue, la force des flotteurs et des doubles réside dans la quantité de mémoire qu'ils utilisent pour leur précision (bonne, mais pas parfaite).

Je sens que je suis presque en train de comprendre de cette réponse

"les nombres en virgule flottante vous permettent de modéliser des quantités continues"

Je ne suis toujours pas convaincu de comprendre. Engineering et Science ressemblent tous les deux à des domaines dans lesquels vous souhaitez obtenir des résultats précis de vos calculs, ce que, à ma connaissance, les points flottants ne donnent pas. Je ne suis pas sûr non plus que je suive ce qu'est une "quantité continue", exactement.

Quelqu'un peut-il développer cette explication et peut-être donner un exemple?



47
Engineering and Science both sound like fields where you would want precise results from your calculations, which, from my understanding, floating points do not give.En sciences et en ingénierie, la précision n’a d’importance que jusqu’à un certain point. Utiliser une précision infinie pour chaque calcul est souvent inutilement coûteux. Ce qui distingue le point flottant du point fixe, c'est que vous n'avez pas à vous engager sur un certain nombre de décimales - vous pouvez avoir de très petites quantités avec beaucoup de décimales ou de très grandes quantités avec une précision limitée.
Doval

24
Pour ajouter aux points évoqués ci-dessus, non seulement vous ne vous souciez pas de la précision au-delà d'un certain point, vous ne pouvez pas obtenir de résultats arbitrairement précis, car bon nombre de vos entrées sont des quantités mesurées comportant une erreur inhérente.

2
Il est également préoccupé par le fait de souligner que les erreurs d'arrondi continueront de s'accumuler non plus. Cela dépend de ce que vous faites et de la façon dont vous le faites. il y a tout un domaine dédié à cela.
Doval

10
La virgule flottante n'est pas une "précision aléatoire", les erreurs pour diverses opérations sont prévisibles et bien connues, et les erreurs pour un algorithme peuvent être résolues. Si elles sont assez basses (et en particulier si vos erreurs en arrière sont plus petites que les incertitudes dans vos variables d'entrée), alors vous pouvez être certain que vos résultats sont bons (ou du moins que leurs problèmes éventuels ne sont pas causés par des erreurs flottantes). erreur de point).
Hobbs

Réponses:


77

Les calculs en sciences et en ingénierie exigent des compromis de précision, de portée et de vitesse. L'arithmétique en virgule fixe fournit précision et rapidité, mais elle sacrifie la portée. BigNum, des bibliothèques de précision arbitraires, gagnent en distance et en précision, mais perdent en vitesse.

Le point crucial est que la plupart des calculs scientifiques et techniques nécessitent une vitesse élevée et une plage étendue, mais ont un besoin de précision relativement modeste. La constante physique la mieux déterminée n'est connue que par environ 13 chiffres et de nombreuses valeurs sont connues avec beaucoup moins de certitude. Avoir plus de 13 chiffres de précision sur l'ordinateur ne va pas aider à cela. La mouche dans la pommade est que les séquences d'opérations en virgule flottante peuvent perdre progressivement en précision. L’analyse numérique consiste essentiellement à déterminer les problèmes qui y sont particulièrement sensibles et à trouver des moyens astucieux de réorganiser la séquence des opérations afin de réduire le problème.

La théorie des nombres en mathématiques, qui doit effectuer des opérations arithmétiques sur des nombres comportant des millions de chiffres mais avec une précision absolue, constitue une exception. Les théoriciens des nombres utilisent souvent des bibliothèques BigNum, et ils supportent des calculs longs.


2
Bonne réponse. Bien que les fonctions sous-jacentes puissent être parfaitement continues, ce qui nécessiterait une précision parfaite pour modéliser avec précision, la réalité est que tout dans la science et l'ingénierie est approximatif. Nous préférerions avoir des approximations utiles et décentes et accomplir quelque chose plutôt qu'une précision infinie, pour laquelle nous attendrions éternellement que de nombreuses opérations soient terminées.
Jonathan Eunice

4
@JonathanEunice Vous ne pouvez pas modéliser exactement la réalité. L'entrée pour le modèle provient de mesures et vous ne pourrez probablement jamais mesurer les choses avec autant de précision qu'un nombre réel natif dans un ordinateur / logiciel moderne (à l'époque) le limiterait. En d’autres termes, vous pouvez avoir un modèle, un logiciel ou des mathématiques parfaits, peu importe. Par exemple, calculer le volume d'une boîte. a*b*cCe qui est facile, cependant, vous devez mesurer les dimensions que vous ne pouvez pas faire avec une certitude absolue. Vous n'avez donc pas vraiment besoin d'une précision infinie du calcul, juste assez pour être lié à une erreur de mesure.
luk32

2
@ luk32 Nous sommes violemment d'accord sur la plupart de ces points. On peut modéliser quelque chose exactement (volume d'une sphère, par exemple), mais on ne peut jamais mesurer exactement. Et la réalité ne correspond jamais parfaitement à un modèle parfait. Il est préférable d’obtenir des valeurs / modèles utiles légèrement imprécis et utiles que d’attendre des mesures ou des calculs parfaits - ce qui sera toujours à une étape de l’avancement.
Jonathan Eunice

2
«Le noeud du problème est que la plupart des calculs scientifiques et techniques nécessitent une grande vitesse et une portée considérable». Si je vous laisse passer longtemps, vous ne pouvez toujours pas calculer exactement car les algorithmes de calcul exact sont largement inconnus. Et tout d’abord, nous ne pouvons même pas représenter les chiffres avec exactitude. C’est juste un problème que nous ne savons pas résoudre, ni rapidement ni lentement.
Michael Le Barbier Grünewald

@ MichaelGrünewald, nous ne pouvons pas représenter les nombres réels avec précision, mais nous sommes en mesure de résoudre les problèmes assez précisément pour pouvoir construire des structures hautes de plusieurs milliers de mètres, identifier les gènes dans l'ADN et rejoindre un satellite avec une comète après deux ans. dans l'espace. Pour paraphraser Randy Newman, cela n’est peut-être pas exact, mais c’est correct. En fait, nous pouvons représenter les rationnels exactement à l'aide de bibliothèques de précision arbitraires (sous réserve des limites de mémoire).
Charles E. Grant

30

Quelle alternative proposez-vous?

Les quantités continues sont représentées à l'aide de nombres réels en mathématiques. Aucun type de données ne peut coder tous les nombres réels possibles (car les réels sont indénombrables), ce qui signifie que nous ne pouvons sélectionner qu'un sous-ensemble des nombres réels qui nous intéressent le plus.

  • Vous pouvez choisir tous les réels calculables, ce qui est similaire à ce que font les systèmes de calcul algébrique (CAS). Le problème est que cela devient rapidement irréalisable à mesure que votre arbre d'expression grandit de plus en plus grand. C'est aussi très lent: essayez de résoudre symboliquement un énorme système d'équations différentielles dans Mathematica et comparez-le avec une autre implémentation basée sur des virgules flottantes et vous verrez une différence de vitesse spectaculaire. En outre, comme l'ont souligné Jörg W Mittag et kasperd: vous n'avez même pas d'opérations d'égalité / de comparaison décidables.

  • Vous pouvez utiliser des nombres rationnels exacts, mais cela ne fonctionne pas vraiment pour de nombreuses applications car vous devez calculer des racines carrées, des cosinus ou des logarithmes, etc. De plus, les rationnels ont également tendance à devenir de plus en plus complexes et nécessitent donc plus d'espace pour le stockage. et le temps nécessaire pour traiter à mesure que vous effectuez de plus en plus de calculs.

  • Vous pouvez également utiliser des décimales à précision arbitraire, mais même une division aussi simple que la division ne fonctionnera pas, car vous obtenez des chiffres qui se répètent à l'infini. Vous pouvez également vous heurter au problème de la complexité croissante, car vos performances s'apparentent davantage à des nombres rationnels, mais dans une moindre mesure.

Vous seriez donc obligé d'utiliser des approximations à un moment donné, auquel cas c'est précisément là que les nombres à virgule flottante fonctionnent le mieux. Les nombres à virgule flottante ont également une largeur fixe (contrairement aux 3 autres types de données mentionnés précédemment), ce qui empêche l'augmentation de la complexité lorsque vous effectuez de plus en plus de calculs.


1
Une des meilleures réponses, je l’avais négligée avant d’écrire la mienne.
Michael Le Barbier Grünewald

8
De plus, il y a le fait légèrement gênant que vous ne puissiez même pas dire si deux réels calculables sont égaux.
Jörg W Mittag Le

1
L'utilisation de tous les réels calculables ne poserait-elle pas un problème de comparaison? Je suis à peu près sûr que vous ne pouvez pas comparer des réels calculables sans résoudre le problème persistant.
Kasperd

@kasperd: Je pense que cela dépendra dans une certaine mesure des opérations que l'on est autorisé à utiliser dans le calcul, bien que je ne sois pas sûr de la richesse d'un ensemble de types de calcul que l'on peut avoir et qui garantit quand même que deux résultats arbitraires pouvant être obtenus produites en un nombre fini d’opérations pourraient être comparées en un temps limité. Les types algébriques satisferaient presque certainement à ce critère, mais je ne sais pas si les fonctions ln (x) et exp (x) pourraient être ajoutées et le rempliraient quand même.
Supercat

Vous pouvez prendre en charge l'arithmétique de précision arbitraire (additionner, multiplier, soustraire, diviser), les irrationnels (comme √2), les transcendantaux bien connus (comme Pi et e), les fonctions trigonométriques, etc. en utilisant des fractions continues. Voir l'algorithme de Gosper dans HAKMEM. Lorsque vous avez terminé, vous pouvez effectuer une évaluation lente pour obtenir une approximation à virgule flottante présentant la précision souhaitée.
Paul Chernoch

14

Votre proposition à propos de la science est fausse, l'ingénierie et la science autres que les mathématiques ne fonctionnent pas avec des résultats exacts. Ils fonctionnent avec un facteur de précision intégré au nombre de chiffres que vous affichez.

Le terme clé que vous devez comprendre ici est: chiffres significatifs . Les chiffres significatifs d’un nombre sont les chiffres qui ont une signification qui contribue à sa précision.

Ce qui veut dire fondamentalement que si je dis quelque chose qui fait 12 centimètres de long, il peut en fait être entre 11,5 et 12,5 centimètres de long. Si toutefois je déclare que quelque chose mesure 12,00 centimètres de long, il peut se situer entre 11 995 et 12 005 centimètres de long.

À titre d'exemple, si vous prenez un ruban à mesurer et mesurez votre salon. Même si vous pouvez constater qu’il mesure 6 mètres sur 25 centimètres de large, vous savez que la mesure de votre bande n’était pas assez précise pour tout dire sur la précision millimétrique ou la précision nanométrique.


@leftaroundabout que voulez-vous dire que les mathématiques (comme en mathématiques) ne sont pas des sciences? Dans mon livre c'est.
Pieter B

2
@PieterB: Les maths ne sont pas des sciences. C'est la philosophie. La science est l'acte de comprendre notre monde physique. La philosophie consiste à comprendre comment les idées fonctionnent dans un monde idéal.
Slebetman

Je pense que la science préfère généralement travailler avec des intervalles de confiance explicites plutôt que des chiffres significatifs.
Taemyr

@slebetman En outre, cela n'a rien à voir avec mon propos dans mon message. Si les mathématiques sont une science ou pas, je ne peux m'empêcher de laisser tomber une citation: la nature est naturellement mathématique et elle nous parle en mathématiques. Il suffit d'écouter. Parce que la nature est mathématique, toute science qui entend décrire la nature est complètement dépendante des mathématiques. Il est impossible de trop insister sur ce point, et c'est pourquoi Carl Friedrich Gauss a appelé les mathématiques «la reine des sciences».
Pieter B

Cette citation étant d'ici . Une bonne lecture et beaucoup de choses à discuter, mais pas ici car en effet cela n’a rien à voir avec votre post ou cette question.
gauche du

7

Notez que les nombres à virgule flottante sont fondamentalement les mêmes que la notation scientifique et technique , le moyen standard utilisé par l'homme pour écrire des nombres en mathématiques et en sciences. Dans ces domaines, le besoin d’extrême précision n’exige pas grand-chose, mais il existe souvent un énorme gamme.

Pour prendre un exemple aléatoire de mes devoirs de physique, j'ai récemment dû travailler avec la masse d'un électron, qui est d'environ 9,11 * 10 ^ -31 kg. Je me fiche de la précision. il pourrait facilement être 9.12 pour tout ce que je me soucie. Mais je me soucie de l’exposant et je ne veux pas écrire 0,0000 ... 911 kg, alors j’utilise la notation scientifique.

Un raisonnement similaire s'applique à l'informatique scientifique et technique: la plage est très large, mais nous ne voulons pas stocker et travailler avec de très grands nombres. Nous stockons donc une valeur normalisée et un exposant, qui est plus petit et plus rapide.


6

Les nombres en virgule flottante ont également plusieurs propriétés qui se prêtent bien au calcul de certains types de résultats scientifiques. En particulier, la précision est inversement proportionnelle à la magnitude, comme dans la notation scientifique, de sorte que vous pouvez représenter à la fois de petites différences proches de zéro et des différences plus importantes beaucoup plus éloignées.

L'article de Goldberg est probablement l'analyse la plus célèbre des propriétés des nombres à virgule flottante (et devrait être une lecture indispensable si vous vous intéressez à ce genre de chose), mais les articles de Kahan, je pense, expliquent mieux la logique qui sous-tend de nombreux les problèmes de conception.

En particulier, la diatribe de Kahan sur la mise en œuvre par Java de la virgule flottante , bien que très incendiaire, explique pourquoi la sémantique IEEE-754 est utile, et Much Ado About Nothing s'intéresse à la raison de la signature signée zéro.


Je n'ai pas encore lu l'intégralité de l'article de Kahan, mais il semble plus poli que moi. Java aurait pu avoir des valeurs numériques plus utiles et plus rapides que si elle avait ajouté un realtype prenant trois entrées de pile à stocker et représentant la précision de calcul naturelle de la machine; la valeur peut être stockée en tant que float 80 bits + 16 bits, un remplissage float 64 bits + 32 bits, ou une mantisse 64 bits, un exposant 16 bits et 16 bits pour le signe et les drapeaux [pour les implémentations non-FPU].
Supercat

Spécifiez cela floatet doublesont des formats de stockage, et realest le format de calcul. Dans de nombreux systèmes dépourvus de FPU, il serait plus rapide de travailler avec une mantisse, un exposant et des indicateurs placés sur les limites de mots et de demi-mots plutôt que de décompresser et de remballer les doublons à chaque opération.
Supercat

2

TL; DR Nous ne savons pas comment calculer la plupart des fonctions avec une précision parfaite, il est donc inutile de représenter des nombres avec une précision parfaite.

Jusqu'ici, toutes les réponses manquent le point le plus important: nous ne pouvons pas calculer les valeurs exactes de la plupart des nombres. En tant que cas spécial important, nous ne pouvons pas calculer les valeurs exactes de la fonction exponentielle - pour ne citer que la fonction irrationnelle la plus importante.

Réponse naïve à la question naïve

Il semble que votre question soit plutôt la suivante: «Il existe des bibliothèques arithmétiques exactes. Pourquoi ne les utilisons-nous pas à la place de l'arithmétique à virgule flottante?» La réponse est que l'arithmétique exacte fonctionne sur les nombres rationnels et que:

  • Le numéro d'Archimède - le nom pédant de π - n'est pas rationnel.
  • Beaucoup d'autres constantes importantes ne sont pas rationnelles.
  • Beaucoup d'autres constantes importantes ne sont même pas connues pour être rationnelles ou non.
  • Pour tout nombre rationnel non nul x, le nombre exp (x) est irrationnel.
  • Des déclarations similaires valent pour des radicaux, des logarithmes et une multitude de fonctions importantes pour les scientifiques (distribution de Gauss, son CDF, fonctions de Bessel, fonctions d'Euler,…).

Le nombre rationnel est un heureux hasard. La plupart des nombres ne sont pas rationnels (voir le théorème de Baire), aussi l'informatique sur les nombres nous sortira toujours du monde rationnel.

Qu'est-ce que l'informatique et la représentation d'un nombre?

Nous pouvons réagir en disant «OK, le problème est que les nombres rationnels ne constituaient pas un excellent choix pour représenter des nombres réels.» Ensuite, nous retroussons nos fourches Debian et concevons un nouveau système de représentation des nombres réels.

Si nous voulons calculer des nombres, nous devons choisir un système de représentation des nombres réels et décrire les opérations importantes qui s’y rapportent - c’est-à-dire définir ce que l’ informatique signifie. Puisque nous nous intéressons au calcul scientifique, nous voulons représenter avec précision tous les nombres décimaux (nos mesures), leurs quotients (nombres rationnels), les valeurs des fonctions exponentielles et certaines constantes amusantes, comme le nombre d’Archimède.

Le problème est que la seule façon de représenter parfaitement les nombres dans un tel système est d'utiliser une forme symbolique, c'est-à-dire de ne rien calculer du tout et de travailler avec des expressions algébriques. Ceci est une représentation plutôt handicapée de nombres réels, car nous ne pouvons pas comparer de manière fiable deux nombres (lequel est le plus grand)? Nous ne pouvons même pas facilement répondre à la question «Le nombre donné est-il égal à 0?».

Si vous cherchez des définitions et des problèmes mathématiques plus précis, cherchez des nombres rationnels, des nombres transcendantaux, les meilleures approximations et le théorème de Baire, par exemple.


Je pense que c'est une excellente réponse, mais pas à cette question, dans la mesure où je ne suis pas convaincu que le demandeur comprendra les points que vous avez soulevés. Cela et vous êtes assez simple avec la représentation inexacte de \ Real ou \ Complex nombres par une représentation numérique finie (indépendamment de la largeur de bit dynamique ou statique). C'est tout à fait vrai, mais à côté du point. Félicitations pour ne pas allier robotique en citant Goldberg. :) Et le théorème de Baire ne fait pas partie de la rhétorique habituelle des programmeurs ou de StackOverflow.
mctylr

0

Car

1) Les auteurs partent du principe que "les calculs techniques et scientifiques" mesurent des quantités physiques réelles

2) Les quantités physiques sont continues et exactement comme vous dites "les nombres en virgule flottante vous permettent de modéliser des quantités continues"

.. et le reste de ma réponse est bien résumé par Rufflewind , je ne vais donc pas répéter cela ici.


0

Les nombres en virgule flottante fournissent une précision relative: ils peuvent représenter des nombres représentant tout au plus un petit pourcentage (si vous souhaitez appeler quelque chose comme 0,0000000000001%) loin de tout chiffre précis sur une large plage de nombres. Ils partagent cette caractéristique avec une règle à calcul, bien que cette dernière ne devienne pas meilleure que quelque chose comme 3 chiffres de précision. Cela dit, il suffisait tout à fait de calculer les forces statiques et dynamiques des grandes structures avant que les ordinateurs numériques ne deviennent monnaie courante, car les constantes des matériaux présentent également des variations et que les constructions choisies sont raisonnablement sans danger par rapport aux différences de matériaux et de construction. rendre les charges maximales et les points faibles raisonnablement identifiables.

Maintenant, la "précision" est une caractéristique utile pour de nombreux nombres représentant des mesures et / ou des magnitudes de propriétés physiques.

En sciences / ingénierie, tout n’appartient pas à cette catégorie. Par exemple, si vous utilisez des transformations théoriques sur les nombres pour multiplier des grands nombres ou des champs de Galois pour manipuler des polynômes à correction d'erreur, il n'existe pas d'erreur mineure: toute erreur sur un bit lors du traitement conduit à des résultats quasiment impossibles à distinguer de complètement aléatoires. bruit.

Même dans ces zones, on peut travailler avec des nombres à virgule flottante (par exemple, utiliser des FFT complexes pour effectuer une convolution) si on garde une trace de l’accumulation d’erreurs et s’assure que les erreurs en virgule flottante n’accumulent pas une magnitude suffisante pour éventuellement retourner un bit les entités réelles dont ils sont une approximation. Pour de telles approximations, le traitement en virgule fixe conviendrait probablement mieux, mais les unités à virgule flottante sur le terrain ont tendance à permettre un fonctionnement plus rapide et un plus grand nombre de bits utilisables.

Les langages de programmation tels que C ou Fortran rendent étonnamment difficile l'accès à des opérations de base telles que multiplication et division à précision mixte ou un bit de report pour addition / soustraction, et constituent des éléments de base pour aller au-delà des entiers à précision limitée.

Ainsi, si vous pouvez mapper les opérations sur des nombres en virgule flottante, vous disposez généralement d'un matériel raisonnablement puissant et vous pouvez raisonnablement spécifier vos algorithmes dans l'un des langages de programmation à usage général actuels.


0

Je pense que cela peut être répondu en indiquant quelle application float/double les types d’ données qui ne conviennent pas.

Lorsque vous devez vous assurer que vous pouvez représenter un nombre avec précision avec un nombre spécifique de chiffres, les nombres à virgule flottante ne sont pas appropriés, car ils représentent les nombres en tant que puissances de 2, au lieu de 10, de la même manière que nous représentons les nombres dans le vrai monde.

Ainsi, un domaine dans lequel les types de données à virgule flottante ne doivent pas être utilisés est celui de finance *. Pour le système central d'une banque, par exemple, il serait totalement inacceptable qu'un montant qui aurait dû atteindre 100 000,01 $ devienne soudainement 100 000,00 $ ou 100 000,02 $.

Un tel problème peut facilement se produire lors de l’utilisation de fonds flottants, en particulier si le nombre est le résultat d’un ou de plusieurs calculs, par exemple le calcul de la somme de toutes les transactions effectuées dans un compte.

L'ingénierie et le calcul scientifique sont des domaines où ces erreurs d'arrondissement relativement petites sont acceptables. Les utilisateurs savent normalement que tous les nombres ont une précision limitée et travaillent souvent avec un nombre de chiffres significatif . Mais surtout, ils ont une précision relative bien définie, c’est-à-dire qu’ils fournissent le même nombre de chiffres significatifs, aussi bien pour les très grands nombres que pour les très petits nombres.

* J'ai déjà travaillé sur une application financière où floats avait été utilisé pour représenter des valeurs et, en conséquence, des erreurs d'arrondi ont été introduites. Heureusement, ce bogue spécifique n'était pas du tout critique, les utilisateurs se sont plaints des erreurs de calcul dans le programme. Et cela a eu un effet différent, bien pire: les utilisateurs ont commencé à perdre confiance dans le système.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.