En étudiant la précision des nombres à virgule flottante, j'ai vu à quelques endroits une déclaration similaire à
" float et double are ( conçu pour/ utilisé souvent en) ingénierie et calcul scientifique "
D'après ma compréhension, la force des flotteurs et des doubles est la quantité de mémoire qu'ils utilisent pour leur précision (bonne, mais pas parfaite).
J'ai l'impression que je comprends presque tout cela réponse
"les nombres à virgule flottante vous permettent de modéliser des quantités continues"
Je ne suis toujours pas convaincu de comprendre. L'ingénierie et la science sonnent comme des champs où vous voudriez précis résulte de vos calculs, ce qui, à mon avis, ne donne pas de virgule flottante. Je ne suis pas sûr non plus de savoir exactement ce qu'est une "quantité continue".
Quelqu'un peut-il développer cette explication et peut-être donner un exemple?
Le calcul en science et en ingénierie nécessite des compromis en termes de précision, de portée et de vitesse. L'arithmétique à virgule fixe fournit précision et vitesse décente, mais elle sacrifie la portée. BigNum, bibliothèques de précision arbitraires, gagnent en portée et en précision, mais perdent en vitesse.
Le nœud du problème est que la plupart des calculs scientifiques et techniques nécessitent une vitesse élevée et une gamme étendue, mais ont des besoins de précision relativement modestes. La constante physique la plus bien déterminée n'est connue qu'à 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 progressivement perdre en précision. Le pain et le beurre de l'analyse numérique déterminent quels problèmes sont particulièrement sensibles à cela, et trouvent des moyens intelligents de réorganiser la séquence des opérations pour réduire le problème.
Une exception à cela est la théorie des nombres en mathématiques qui doit effectuer des opérations arithmétiques sur des nombres avec des millions de chiffres mais avec une précision absolue. Les théoriciens des nombres numériques utilisent souvent les bibliothèques BigNum, et ils supportent leurs calculs en prenant beaucoup de temps.
Que alternative proposez-vous?
Les quantités continues sont représentées en utilisant des nombres réels en mathématiques. Aucun type de données ne peut coder tous les possibles nombre réel (car les réels sont indénombrables), ce qui signifie que nous ne pouvons choisir qu'un sous-ensemble de ces 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 d'algèbre informatique (CAS). Le problème est qu'il devient rapidement irréalisable à mesure que votre arbre d'expression grossit de plus en plus. C'est aussi très lent: essayez de résoudre symboliquement un énorme système d'équations différentielles dans Mathematica et comparez-le à une autre implémentation basée sur des virgules flottantes et vous verrez une différence dramatique de vitesse. De plus, comme Jörg W Mittag et kasperd l'ont souligné: vous n'avez même pas d'opérations d'égalité/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. et le temps de traiter lorsque vous effectuez de plus en plus de calculs sur eux.
Vous pouvez également utiliser des décimales de précision arbitraire, mais même quelque chose d'aussi simple que la division ne fonctionnera pas car vous obtenez des chiffres répétitifs à l'infini. Vous pouvez également rencontrer le problème de la complexité croissante à mesure que vous effectuez des performances plus similaires aux nombres rationnels, mais dans une moindre mesure.
Vous seriez donc obligé d'utiliser des approximations à un moment donné, auquel cas c'est exactement là que les nombres à virgule flottante font le mieux. Les nombres à virgule flottante sont également de largeur fixe (contrairement à tous les 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 sur eux.
Votre proposition sur la science est fausse, l'ingénierie et les sciences autres que les mathématiques ne fonctionnent pas avec des résultats précis et précis. Ils fonctionnent avec un facteur de précision qui est intégré dans le 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 portent un sens contribuant à sa précision.
Ce qui signifie essentiellement que si je déclare que quelque chose mesure 12 centimètres de long, il peut en fait être compris 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.
Juste à titre d'illustration, si vous prenez un ruban à mesurer et mesurez votre salon. Même si vous pouvez constater qu'il mesure 6 mètres 25 centimètres de large, vous savez que votre mesure de bande n'était pas suffisamment précise pour dire quoi que ce soit au millimètre ou au nanomètre.
Notez que les nombres à virgule flottante sont fondamentalement les mêmes que la notation scientifique et ingénierie, la façon standard pour les humains d'écrire des nombres en mathématiques et en sciences. Dans ces domaines, il n'y a pas un grand besoin d'extrême précision, mais il y a souvent une gamme énorme .
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 ne me soucie pas beaucoup de la précision; ça pourrait facilement être 9,12 pour tout ce que je veux. Mais je me soucie de l'exposant et je ne veux pas avoir à écrire 0,0000 ... 911 kg, donc j'utilise la notation scientifique.
Un raisonnement similaire s'applique à l'informatique scientifique et technique: il existe une gamme énorme, mais nous ne voulons pas avoir à 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 à utiliser.
Les nombres à virgule flottante ont également plusieurs propriétés qui se prêtent bien au calcul de certains types de résultats scientifiques. Plus particulièrement, la précision est inversement proportionnelle à la magnitude, tout comme dans la notation scientifique, vous pouvez donc représenter à la fois de petites différences proches de zéro et de plus grandes différences beaucoup plus loin.
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 obligatoire si vous vous souciez de ce genre de chose), mais articles de Kahan I Pensez à mieux expliquer les raisons de bon nombre des problèmes de conception subtils.
En particulier, Kahan diatribe sur l'implémentation Java de virgule flottante , bien que très incendiaire, fait plusieurs bons points sur les raisons pour lesquelles la sémantique IEEE-754 est utile, et Beaucoup de bruit sur le bit de signe de Nothing explore en profondeur la justification du zéro signé.
TL; DR Nous ne savons pas comment calculer la plupart des fonctions avec une précision parfaite, il n'y a donc pas de point représentant des nombres avec une précision parfaite.
Jusqu'à présent, 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.
Il semble que votre question soit plutôt "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 des 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), donc le calcul sur les nombres nous fera toujours sortir du monde rationnel.
Nous pouvons réagir en disant "OK, le problème est que les nombres rationnels n'étaient pas un si bon choix pour représenter des nombres réels". Ensuite, nous enroulons nos sleaves fork Debian et concevons un nouveau système de représentation pour les nombres réels.
Si nous voulons calculer des nombres, nous devons choisir un système de représentation pour les nombres réels et décrire les opérations importantes sur eux - 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 des 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 paralysée des 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 répondre facilement à la question "Le nombre donné est-il égal à 0?".
Si vous recherchez des définitions et des problèmes mathématiques plus précis, recherchez les nombres rationnels, les nombres transcendantaux, les meilleures approximations et le théorème de Baire, par exemple.
Parce que
1) Les auteurs émettent l'hypothèse que "l'ingénierie et le calcul scientifique" mesurent des quantités physiques réelles
2) Les quantités physiques sont continues, et exactement comme vous le dites "les nombres à virgule flottante vous permettent de modéliser les quantités continues"
.. et le reste de ma réponse est bien résumé par Rufflewind , donc je ne vais pas répéter cela ici.
Les nombres à virgule flottante offrent une précision relative: ils peuvent représenter des nombres qui sont au plus un petit pourcentage (si vous voulez appeler quelque chose comme 0,000000000000001% en pourcentage) loin de tout nombre précis sur une large gamme de nombres. Ils partagent ce trait avec une règle à calcul, bien que cette dernière ne soit pas meilleure que quelque chose comme 3 chiffres de précision. Pourtant, il était tout à fait suffisant pour déterminer les forces statiques et dynamiques des grandes structures avant que les ordinateurs numériques ne deviennent monnaie courante pour cela, et c'est parce que les constantes de matériau montrent également une certaine variation, et le choix de constructions qui sont raisonnablement bénignes contre les différences de matériaux et de construction aura tendance pour rendre les charges maximales et les points faibles raisonnablement identifiables.
Désormais, la "précision" est une caractéristique utile pour de nombreux nombres représentant des mesures et/ou des amplitudes de propriétés physiques.
Tout en science/ingénierie n'appartient pas à cette catégorie. Par exemple, si vous utilisez des transformations théoriques des nombres pour multiplier de grands nombres ou des champs de Galois pour manipuler des polynômes de correction d'erreurs, il n'y a rien de tel qu'une petite erreur: toute erreur sur un seul bit pendant le traitement entraînera des résultats qui ne peuvent pas être distingués de complètement aléatoires bruit.
Même dans ces zones, on peut travailler avec des nombres à virgule flottante (comme utiliser des FFT complexes pour effectuer la convolution) si l'on garde la trace de l'accumulation d'erreurs et s'assure que les erreurs en virgule flottante n'accumulent pas suffisamment d'amplitude pour même retourner un seul bit dans les entités réelles dont ils sont une approximation. Pour de telles approximations, le traitement en virgule fixe serait probablement plus approprié mais les unités à virgule flottante sur le terrain ont tendance à fournir un fonctionnement plus rapide et un plus grand nombre de bits utilisables.
De plus, les langages de programmation comme C ou Fortran rendent étonnamment difficile l'accès aux opérations de base comme la multiplication et la division à précision mixte ou un bit de retenue pour l'addition/la soustraction, et ce sont des éléments de base pour aller au-delà des entiers à précision limitée.
Donc, si vous pouvez mapper des opérations sur des nombres à virgule flottante, vous avez tendance à avoir du matériel raisonnablement puissant à votre disposition de nos jours et vous pouvez raisonnablement bien spécifier vos algorithmes dans l'un des langages de programmation à usage général d'aujourd'hui.
Je pense que cela peut être répondu en abordant les types de données d'application float
/double
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 sont inappropriés, car ils représentent les nombres en tant que puissances de 2, au lieu de puissances de 10, comme c'est le cas pour la représentation des nombres en le vrai monde.
Un domaine dans lequel les types de données à virgule flottante ne doivent pas être utilisés est donc celui de la finance *. Pour le système central, par ex. une banque, il serait tout à fait inacceptable qu'un montant qui aurait dû être de 100000,01 $ devienne soudainement 100000,00 $ ou 100000,02 $.
Un tel problème pourrait facilement se produire lors de l'utilisation de flotteurs, en particulier si le nombre était le résultat d'un ou plusieurs calculs, par ex. calculer la somme de toutes les transactions d'un compte.
L'ingénierie et le calcul scientifique sont des domaines où ces erreurs d'arrondi relativement faibles sont acceptables. Les utilisateurs sont normalement conscients que tous les nombres ont une précision limitée, et ils travaillent souvent avec un certain nombre de chiffres significatifs. Mais surtout, ils ont une précision relative bien définie, c'est-à-dire qu'ils ont fourni le même nombre de chiffres significatifs, à la fois pour les très grands nombres et pour les très petits nombres.
* J'ai travaillé une fois 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 bug spécifique n'était pas du tout critique, les utilisateurs se sont plaints des erreurs de calcul dans le programme. Et cela a conduit à un effet différent, bien pire: les utilisateurs ont commencé à perdre confiance dans le système.