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?
la source
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.Réponses:
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.
la source
a*b*c
Ce 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.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.
la source
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.
la source
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.
la source
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.
la source
real
type 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].float
etdouble
sont des formats de stockage, etreal
est 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.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 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.
la source
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.
la source
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.
la source
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ù
float
s 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.la source