Comment les bibliothèques mathématiques avec une précision infinie sont-elles implémentées?

StackOverflow https://stackoverflow.com/questions/1004997

  •  05-07-2019
  •  | 
  •  

Question

Je connais donc la précision en virgule flottante (et comment des choses comme 1.1 ne peuvent pas être exprimées exactement en binaire), etc., mais je me demande bien: comment les bibliothèques liées aux mathématiques implémentent-elles la précision infinie? En d'autres termes, comment représenteriez-vous, par exemple, 1.1 avec précision en binaire? Juste une brève description serait formidable, je peux comprendre les détails exacts moi-même. Merci. :)

Était-ce utile?

La solution

Il n’existe pas de bibliothèques à précision infinie, mais des bibliothèques à précision arbitraire. Pour plus d'informations sur leur implémentation, consultez la documentation : -)

.

Pour représenter 1.1 exactement en binaire, la virgule flottante ne peut pas être utilisée comme vous le signalez correctement. Il peut être représenté si vous stockez la partie intégrale (1) en tant qu'entier et la partie fractionnelle (.1) en tant qu'entier, puis vous devez créer la logique pour traiter ces structures. Sinon, il pourrait être stocké sous forme de fraction (11/10) avec le dénominateur et le numérateur stockés sous forme de nombres entiers.

Autres conseils

Si vous voulez vraiment dire précision infinie, il y a deux options:

  • Utilisez une forme de calcul paresseux. Vous pouvez ensuite demander à un numéro autant de précision que vous le souhaitez "après". exécuter le calcul (puisque c'est paresseux, il ne l'a en fait fait qu'à ce moment-là). L'inconvénient est que c'est très inefficace. Vous pouvez le faire dans un langage comme Haskell en utilisant un système de numérotation spécial dans lequel les représentations se chevauchent, par exemple. base 2 avec chiffres -1, 0, 1. La représentation habituelle n’est pas appropriée car, par exemple, il faut une précision infinie pour choisir entre la sortie 0 pour 0,999 ... et 1 pour 1 000 ...

  • Faites le calcul symboliquement. Représente les nombres entiers, les rationnels, les racines, etc. exactement. Cela est nécessaire si vous voulez décider de l’égalité, mais également plutôt inefficace et limité aux cas particuliers.

Les bibliothèques mathématiques avec une précision infinie ne sont pas implémentées. Cela ne peut pas être fait. Le nombre 1/3 ne peut pas être représenté par un nombre fini de bits autrement que par une fraction. Les nombres transcendants tels que pi et e ne peuvent être représentés de quelque manière que ce soit.

D'autre part, il est possible de créer des bibliothèques mathématiques avec une précision énorme . Il s’agit d’allouer suffisamment de bits pour la mantisse de la valeur à virgule flottante.

Certains algorithmes géométriques dépendent d'arithmétique exacte. Par conséquent, si vous regardez dans la bibliothèque CGAL, vous découvrirez une variété de types numériques exacts qui sont "fermés". sous diverses opérations. Autrement dit, il n’existe aucun moyen d’utiliser les opérations prises en charge pour produire un résultat qui ne peut pas être représenté exactement.

Quelques exemples:

  • Les entiers sont fermés par addition et multiplication.

  • Les rationnels sont également fermés sous division, sauf dans un cas particulier pour zéro. Peut être représenté comme une paire d'entiers. Voir aussi les fonctions de nombre rationnel dans GMP . Par exemple 1.1 = 11/10, peut être représenté par (11, 10).

  • Un type de nombre également fermé sous la racine carrée.

Vous pouvez également représenter des nombres en décimal et faire de l’arithmétique décimale. La représentation sous-jacente est binaire dans le sens où chaque chiffre est représenté avec un code binaire. Chaque chiffre, à gauche ou à droite du point décimal, est traité comme un entier. L’arithmétique est ensuite effectuée «manuellement», chiffre par chiffre.

BCMath en PHP est un exemple de bibliothèque basée sur des décimales.

Alors que Pax est tout à fait ici quand on parle de points flottants et de nombres, je pense qu’il existe une solution, mais elle est très inefficace.
Vous pouvez utiliser une chaîne pour représenter votre nombre, les chaînes ne perdant pas en précision.
Chaque fois que vous avez un numéro du type " 0,0001 " + " 0,1 " vous parcourez les deux chaînes et ne convertissez que la position actuelle en un entier.
Étape 1:
0 + 0 = 0 - > convertir en chaîne et affecter aux données [0].
Étape 2:
0 + 1 = 1 - > convertir en chaîne et affecter aux données [1].
Étape 3:
iter > " 0,1 " .ght () - > arrêtez-vous.

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