Représenter un nombre réel sans perte de précision


10

La virgule flottante actuelle (flottant C ANSI, double) permet de représenter une approximation d'un nombre réel.
Existe-t-il un moyen de représenter des nombres réels sans erreur ?
Voici une idée que j'ai eue, qui est tout sauf parfaite.

Par exemple, 1/3 est 0.33333333 ... (base 10) ou o.01010101 ... (base 2), mais aussi 0,1 (base 3)
Est-ce une bonne idée de mettre en œuvre cette "structure":

base, mantissa, exponent

donc 1/3 pourrait être 3 ^ -1

{[11] = base 3, [1.0] mantissa, [-1] exponent}

D'autres idées?


12
Vous ne pourrez représenter les nombres rationnels que de cette façon.
Andrej Bauer

Comment proposez-vous d'implémenter des opérations arithmétiques sur des nombres dans cette représentation? Utiliser des logarithmes pour changer de base? Ce serait beaucoup plus cher que les mathématiques à virgule flottante IEEE.
David Zhang

Eh bien, je n'en ai aucune idée. Je ne suis pas ingénieur :) Évidemment, je ne peux pas l'implémenter dans le matériel. Une implémentation lente et inefficace peut être faite en C. Ce ne serait qu'une expérience
incud

Réponses:


20

Tout dépend de ce que vous voulez faire.

Par exemple, ce que vous montrez est un excellent moyen de représenter des nombres rationnels. Mais il ne peut toujours pas représenter quelque chose comme ou e parfaitement.πe

En fait, de nombreuses langues telles que Haskell et Scheme ont intégré la prise en charge des nombres rationnels, les stockant sous la forme d' a,bsont des entiers.aba,b

La principale raison pour laquelle ceux-ci ne sont pas largement utilisés est la performance. Les nombres à virgule flottante sont un peu imprécis, mais leurs opérations sont implémentées dans le matériel. Votre système proposé permet une plus grande précision, mais nécessite plusieurs étapes de mise en œuvre, par opposition à une seule opération qui peut être effectuée dans le matériel.

Il est connu que certains nombres réels ne sont pas calculables, tels que les nombres d'arrêt . Il n'y a pas d' algorithme ses chiffres énumérant, contrairement à , où l' on peut calculer le n ième chiffre tant que nous attendons assez longtemps.πn

Si vous voulez une vraie précision pour les choses irrationnelles ou transcendantales, vous devrez probablement utiliser une sorte de système d'algèbre symbolique, puis obtenir une réponse finale sous forme symbolique, que vous pourriez approximer à n'importe quel nombre de chiffres. Cependant, en raison des problèmes d'indécidabilité décrits ci-dessus, cette approche est nécessairement limitée. C'est toujours bon pour des choses comme l'approximation d'intégrales ou de séries infinies.


Puis-je poser une autre question? Si vous aviez été ingénieur Intel dans les années 80, comment auriez-vous "conçu" votre véritable format numérique?
incud

3
Je ne suis pas très qualifié pour répondre à cela, car je ne suis pas ingénieur, je suis chercheur en théorie. Je ne vois pas grand-chose de mal avec le flotteur IEEE et les doubles standards, et maintenant quad. Je ne pense pas qu'il y ait eu beaucoup d'applications dépendantes d'une arithmétique de plus grande précision, et celles qui le font peuvent utiliser une version prise en charge par logiciel.
jmite

L'algèbre symbolique n'est pas le formalisme correct pour une arithmétique réelle exacte. Vous avez besoin d'une représentation qui autorise des mantisses arbitrairement grandes.
Andrej Bauer

8
@AndrejBauer: Une mantisse arbitrairement grande ne vous sauvera pas si vous voulez une représentation exacte de . 2
user2357112 prend en charge Monica

@jmite vous êtes trop modeste :)
incud

22

Il n'y a aucun moyen de représenter tous les nombres réels sans erreur si chaque nombre doit avoir une représentation finie. Il existe un nombre incalculable de nombres réels, mais seulement de nombreuses chaînes finies de 1 et de 0 que vous pouvez utiliser pour les représenter.


On pourrait restreindre l'exigence de représenter chaque nombre réel à restreindre uniquement ces nombres réels, qui pourraient être la sortie d'une machine de turing. Ce ne serait qu'un nombre dénombrable de nombres réels, mais couvrirait toujours chaque nombre que vous voudriez représenter. Mais je ne pense pas que vous puissiez faire des calculs efficaces avec de tels nombres.
kasperd

3
@kasperd Ils sont appelés réels calculables . Malheureusement, des choses comme l'égalité ne sont pas calculables sur les réels calculables.
David Richerby

Il est en effet assez clair que le calcul de l'égalité sur de tels nombres équivaut à résoudre le problème d'arrêt. Étant donné une MT, on peut définir un nombre réel, qui commence par un grand nombre de décimales nulles, exactement autant que le temps de fonctionnement de la TM, puis suivi par un. La comparaison de ce nombre à zéro équivaut à résoudre le problème d'arrêt de la MT d'origine.
kasperd

Cette réponse est fausse. Alan Turing dans son premier article sur les machines, celles dans lesquelles il invente les machines de Turing, parle de représenter les réels comme des chaînes de données infinies . Cela conduit à l'idée de ce qu'on appelle la "machine de Turing de type II", et il existe une théorie très réussie du calcul des nombres réels basée sur l'idée. Il est également mis en œuvre dans la pratique, voir ma réponse.
Andrej Bauer

1
Peut-être le fait-il techniquement, mais il manque le point, qui est qu'il existe des représentations infinies parfaitement raisonnables de nombres réels. Et cela n'a rien d'étrange: une connexion TCP / IP, ou un appel Skype, ou un flux vidéo d'une caméra sont tous des exemples de quantité (potentiellement) infinie de données. Il n'y a pas de limitation a priori sur la quantité d'informations qu'ils peuvent fournir. Il n'y a qu'une limitation sur la quantité d'informations que vous pouvez en retirer en un temps limité.
Andrej Bauer

7

Votre idée ne fonctionne pas car un nombre représenté dans la base avec la mantisse m et l'exposant e est le nombre rationnel b m - e , donc votre représentation fonctionne précisément pour les nombres rationnels et pas les autres. Vous ne pouvez pas représenter bmebme par exemple.2

Il existe toute une branche des mathématiques calculables qui traite de l'arithmétique réelle exacte. De nombreuses structures de données pour représenter les nombres réels exacts ont été proposées: des flux de chiffres, des flux de contractions affines, des séquences de Cauchy de rationnels, des séquences de Cauchy de rationnels dyadiques, des coupes Dedekind, des séquences d'intervalles de rétrécissement, etc. sur ces idées, par exemple:

De ces iRRAM est le plus mature et le plus efficace. Marshall dans un projet expérimental, alors que le troisième est un projet étudiant, mais aussi le plus facilement accessible. Il a une très belle introduction expliquant les problèmes concernant le calcul des nombres réels, je vous recommande fortement de le regarder.

Permettez-moi de faire une remarque. Quelqu'un objectera qu'un objet infini ne peut pas être représenté par un ordinateur. Dans un certain sens, c'est vrai, mais dans un autre, ce n'est pas le cas. Nous n'avons jamais à représenter un nombre réel entier , nous n'avons besoin que d'une approximation finieà chaque étape du calcul. Ainsi, nous n'avons besoin que d'une représentation qui peut représenter un réel jusqu'à une précision donnée. Bien sûr, une fois que nous manquons de mémoire d'ordinateur, nous manquons de mémoire d'ordinateur - mais c'est une limitation de l'ordinateur, pas la représentation elle-même. Cette situation n'est pas différente de beaucoup d'autres dans la programmation. Par exemple, les gens utilisent des entiers en Python et les considèrent comme "arbitrairement grands" même s'ils ne peuvent bien sûr pas dépasser la taille de la mémoire disponible. Parfois, l'infini est une approximation utile pour un très grand nombre fini.

De plus, j'entends souvent dire que les ordinateurs ne peuvent traiter que des nombres réels calculables . Cela manque deux points importants. Premièrement, les ordinateurs ont accès aux données du monde extérieur, nous devons donc également faire l'hypothèse (non vérifiable) que le monde extérieur est également calculable. Deuxièmement, nous devons faire la distinction entre les réels qu'un ordinateur peut calculer et ceux qu'il peut représenter. Par exemple, si nous choisissons des flux de chiffres comme représentation de réels, il est parfaitement possible de représenter un réel non calculable: si quelqu'un nous le donnait, nous saurions le représenter. Mais si nous choisissons de représenter les réels comme des morceaux de code source qui calculent les chiffres, alors nous ne pourrions pas représenter les réels non calculables, évidemment.

Dans tous les cas, ce sujet est mieux abordé avec quelques lectures supplémentaires.


+1 mais je objecterais que vous ne pouvez pas représenter une chaîne infinie par une approximation finie sans perdre en précision , comme l'exige la question. Bien sûr, vous pouvez obtenir autant de précision que vous le souhaitez - comme vous pouvez en faisant une approximation par un rationnel - mais ce n'est pas tout à fait ce que la question demande. Sans doute, c'est un problème avec la question, plutôt que la réponse.
David Richerby

2
Le fait est que nous ne représentons pas avec des chaînes finies. Nous représentons avec des chaînes infinies , mais nous n'avons besoin que d'une portion finie d'une telle chaîne infinie à chaque étape du calcul. Ou pour le dire autrement: il n'y a aucune perte de précision, car la structure de données contient l' intégralité des informations, mais bien sûr vous ne pouvez pas accéder ou traiter toutes les informations à la fois: la structure de données vous donne autant de précision que vous le demandez . Le goulot d'étranglement n'est pas du côté de la structure des données, mais plutôt du côté du "consommateur" qui veut en tirer les informations.
Andrej Bauer

@AndrejBauer Mais vous devez accéder ou traiter toutes les informations à la fois dans certains cas, par exemple c'est ce que fait le calcul symbolique, en capturant "l'essence" ou la nature d'une quantité plutôt que comme n'importe quel autre flux de chiffres. Si vous dites à un package de calcul symbolique de vérifier que , il produirait instantanément vrai. Si vous avez utilisé la méthode que vous semblez décrire, en prenant leskpremierschiffres de la racine carrée de2, pourtoutk,vous conclurez que22=2k2 kcar votre résultat sera (pour toutkfini) égal à1,99 ..., mauvaise réponse. Les calculs sont finis. 222k1.99...
Thomas

2
@Thomas: le calcul symbolique ne représente pas des nombres réels, mais généralement un sous-champ des réels, généralement celui généré par les fonctions élémentaires et les racines des polynômes. Ces sous-champs ne sont pas complets (fermés sous les limites des séquences de Cauchy) ni calculables (fermés sous les limites calculables des séquences de Cauchy). Une représentation n'est pas une représentation de réels, sauf si vous pouvez représenter tous les réels (calculables): et les calculs symboliques ne remplissent pas cette condition.
Andrej Bauer

1
Ces remarques sur la comptabilité ne sont pas pertinentes car les réels calculables ne sont pas dénombrables par ordinateur.
Andrej Bauer

7

Il existe de nombreuses implémentations efficaces du nombre rationnel, mais celle qui a été proposée à plusieurs reprises et qui peut même très bien gérer certains irrationnels est les fractions continues .

Citation de fractions continuées par Darren C. Collins :

Théorème 5-1. - L'expression continue d'une fraction d'un nombre réel est finie si et seulement si le nombre réel est rationnel.

Citation de Mathworld - Fractions continues périodiques

... une fraction continue est périodique si elle n'est pas la racine d'un polynôme quadratique.

c'est-à-dire que toutes les racines peuvent être exprimées en fractions continues périodiques.

Il y a aussi une fraction continue exacte pour π qui m'a surpris jusqu'à ce que @AndrejBauer souligne qu'il ne l'est pas.


ππ

Il y a quelque temps, J. Vuillemin a proposé la représentation de fractions continues de réels comme implémentation de l'arithmétique réelle exacte. Il s'avère que ce n'est pas très efficace car les chiffres deviennent assez gros très bientôt, et il est difficile de réduire leur taille.
Andrej Bauer

Les fractions continues ont des problèmes de calcul même pour représenter des nombres rationnels - alors qu'elles peuvent être comparées relativement rapidement en utilisant une variante de l'ordre lexicographique, et tandis que la manipulation d'une seule fraction continue est facile, l'addition (binaire) et la multiplication sur les CF sont des opérations assez compliquées à mettre en place.
Steven Stadnicki

5

Il y a un certain nombre de suggestions "réelles exactes" dans les commentaires (par exemple fractions continues, transformations fractionnaires linéaires, etc.). Le problème typique est que même si vous pouvez calculer les réponses à une formule, l'égalité est souvent indécidable.

Cependant, si vous êtes juste intéressé par les nombres algébriques, alors vous avez de la chance: la théorie des champs fermés réels est complète, o-minimale et décidable. Cela a été prouvé par Tarski en 1948.

Mais il y a un hic. Vous ne voulez pas utiliser l'algorithme de Tarski, car il appartient à la classe de complexité NONELEMENTARY, qui est aussi peu pratique que les algorithmes peu pratiques peuvent obtenir. Il existe des méthodes plus récentes qui réduisent la complexité à DEXP, qui est la meilleure que nous connaissons actuellement.

Notez que le problème est NP-difficile car il inclut SAT. Cependant, il n'est pas connu (ou supposé) être dans NP.

EDIT Je vais essayer d'expliquer cela un peu plus.

Le cadre pour comprendre tout cela est un problème de décision connu sous le nom de Satisfiability Modulo Theories, ou SMT pour faire court. Fondamentalement, nous voulons résoudre SAT pour une théorie basée sur la logique classique.

Nous commençons donc avec une logique classique de premier ordre avec un test d'égalité. Les symboles de fonction que nous voulons inclure et leurs axiomes déterminent si la théorie est décidable ou non.

Il y a beaucoup de théories intéressantes exprimées dans le cadre SMT. Par exemple, il existe des théories sur les structures de données (par exemple des listes, des arbres binaires, etc.) qui sont utilisées pour aider à prouver que les programmes sont corrects, et la théorie de la géométrie euclidienne. Mais pour notre objectif, nous examinons des théories de différents types de nombres.

L'arithmétique de Presburger est la théorie des nombres naturels avec addition. Cette théorie est décidable.

L'arithmétique peano est la théorie des nombres naturels avec addition et multiplication. Cette théorie n'est pas décidable, comme l'a célèbre démontré Gödel.

L'arithmétique de Tarski est la théorie des nombres réels avec toutes les opérations sur le terrain (addition, soustraction, multiplication et division). Fait intéressant, cette théorie est décidable. C'était un résultat hautement contre-intuitif à l'époque. Vous pourriez supposer que parce que c'est un "surensemble" des nombres naturels, c'est "plus difficile", mais ce n'est pas le cas; comparer la programmation linéaire sur les rationnels avec la programmation linéaire sur les entiers, par exemple.

Il ne peut pas sembler évident que la satisfaction est tout ce dont vous avez besoin, mais c'est le cas. Par exemple, si vous souhaitez tester si la racine carrée positive de 2 est égale à la racine cubique réelle de 3, vous pouvez l'exprimer comme le problème de satisfiabilité:

x.x>0x22=0x33=0

ex

sin{xπ|sinx=0}sin

exeix


Alfred Tarski (1948), Une méthode de décision pour l'algèbre élémentaire et la géométrie .


2

Il est possible de représenter exactement une très grande classe de nombres appelés nombres algébriques , en les traitant comme des racines de polynômes.

πe


eeixsincos{xR|sinx=0}

@Pseudonym Cela semble vraiment intéressant, mais je ne pense pas avoir la formation mathématique pour bien le comprendre ... Que voulez-vous dire par "assez proche des entiers"?
Plus d'axes

Je vais modifier ma réponse pour expliquer.
Pseudonyme

1

π2


Cette réponse est fausse. Il existe tout un domaine de l'arithmétique réelle exacte qui explique comment représenter les réels par ordinateur. L'hypothèse selon laquelle un réel doit être représenté par une chaîne finie est erronée. Nous pouvons également utiliser des chaînes infinies. Alan Turing a déjà écrit à ce sujet dans son premier article, celui où il a inventé les machines Turing!
Andrej Bauer

Pouvez-vous créer un lien vers un document sur la façon de stocker et de manipuler des chaînes infinies dans un ordinateur réel, car ce serait la réponse à la question posée. Ce n'était pas non plus son premier article, sa première publication date de 1936, cet article date de 1937.
lPlant

Vous avez raison, c'est le journal de 1937. Pour voir comment les chaînes infinies sont manipulées, vous pouvez regarder le protocole TCP / IP, par exemple. Je n'ai jamais dit que tout le réel devait être stocké dans l'ordinateur.
Andrej Bauer

-1

Vous ne pouvez pas représenter tous les nombres réels dans un ordinateur, mais vous pouvez en représenter plusieurs. Vous pouvez utiliser des fractions qui représenteraient plus de nombres que de flottants. Vous pouvez également faire des choses plus sophistiquées comme représenter des nombres comme racine d'un polynôme avec une approximation qui, selon la méthode newtons, convergera vers le nombre.


C'est encore une fausse réponse, produite par ignorance. Il existe tout un domaine de l'arithmétique réelle exacte qui étudie comment représenter tous les réels par des structures de données appropriées.
Andrej Bauer

@AndrejBauer Vous suggérez donc qu'il existe une structure de données qui peut représenter n'importe quel nombre réel? Une telle structure de données devrait utiliser une quantité infinie indéfinissable de bits pour représenter n'importe quel nombre.
Alice Ryhl

1
Une quantité dénombrable de bits suffit, tout d'abord, et comme vous n'avez pas besoin de tous en même temps, et que vous n'êtes pas en mesure de les traiter tous en même temps, ils peuvent être stockés dans le temps ainsi que dans l'espace.
Andrej Bauer

@AndrejBauer Cette réponse est correcte et dit la même chose que la vôtre, mais avec beaucoup moins d'informations. Vous ne pouvez pas représenter tous les nombres réels dans un ordinateur. Vous pouvez représenter n'importe quel nombre réel, mais pas tous à la fois. Si quoi que ce soit, je contesterais que vous pouvez représenter «plusieurs», car vous ne pouvez représenter qu'un nombre infini dans un ordinateur donné, et seulement presque aucun (au sens mathématique) dans un ordinateur abstrait qui est équivalent aux modèles de calcul habituels (Turing équivalent machine).
Gilles 'SO- arrête d'être méchant'

-1

Il est possible de représenter n'importe quel nombre avec précision où les entrées sont représentables en les stockant comme une chaîne d'opérations.Par exemple, vous stockez 1/3car 1 divided by 3, en gérant l'annulation des opérations, vous pouvez simplifier l'opération suivante pour donner une réponse exacte (1/3) * 3. Cela peut également gérer des situations où vous avez connu des irrationnels, πpar exemple en les conservant dans vos calculs.

Cependant, cela nécessite une quantité croissante de mémoire pour chaque nombre et - en supposant que votre simplificateur n'est pas parfait - cela nécessitera probablement une quantité toujours croissante pour les valeurs sur lesquelles vous travaillez beaucoup.


5+262=3

En effet. En fait, il est probablement impossible d'automatiser complètement avec succès. Cependant, le résultat reste précis même si vous n'avez pas utilisé la représentation la plus simple possible.
Jack Aidley
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.