Erreur machine

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
ice456
Membre Relatif
Messages: 109
Enregistré le: 13 Oct 2007, 14:43

Erreur machine

par ice456 » 11 Nov 2007, 16:05

Bonjour,
dans le cadre du cour d'analyse numérique, on étudie l'arithmétique machine et on regarde notament les erreurs comises par un ordinateur.

Il y a un exemple que je n'arrive pas bien à comprendre :

On cherche à calculer la fonction f : ] - définie par f(x) := .

On l'implémente alors de la façon naïve (de la même manière que la définition de la fonction). A première vue, celle-ci se comporte bien. On trace alors la fonction et en faisant un zoom autour de x = 0, on voit que ce n'est pas le cas. Comme on le voit sur le dessin, lesvaleurs données pas f1 peuvent être fort éloignées de f(0) = -1 et, alors que f est continue, le graphe fait des sauts de -2 à 0!

Image

Je ne comprends pas l'explication qui nous est donné à savoir :

La raison de se phénomène est que, lorsque y est proche de 1, ln(y) est proche de y-1 et donc, lorsque x est proche de 0, f(x) est proche de ((1-x)-1)/x). Algébriquement, cette expression vaut -1. Ceci n'est pas vrai en arithmétique machine car l'addition machine n'est pas associative.

Voilà. Je ne comprends pas trop l'explication en rapport avec le y proche de 1... et j'aimerai aussi comprendre la dernière phrase à savoir Ceci n'est pas vrai en arithmétique machine car l'addition machine n'est pas associative.

Merci pour votre aide



legeniedesalpages
Membre Irrationnel
Messages: 1512
Enregistré le: 16 Mai 2007, 22:40

par legeniedesalpages » 11 Nov 2007, 16:18

Bonjour,

pour la non-associativité:

on considère la précision machine, c'est à dire le plus petit nombre réel positif tel que .

On a donc en arithmétique flottante :

, et donc ,

par contre .

legeniedesalpages
Membre Irrationnel
Messages: 1512
Enregistré le: 16 Mai 2007, 22:40

par legeniedesalpages » 11 Nov 2007, 16:27

Pour ton problème je pense qu'il faut voir ça comme ça:

quand , on a donc .

mais on a une précision limité, si x est suffisamment proche de 0,

en arithmétique flottante (je crois que cette précision sur les voisinages dépend de la précision machine, et aussi du nombre de décimales de garde pour la soustraction)

et pour ces x là, on aura donc .

ice456
Membre Relatif
Messages: 109
Enregistré le: 13 Oct 2007, 14:43

par ice456 » 11 Nov 2007, 16:30

Merci pour ton explication je comprend maintenant la notion de non associativité.

Donc dans notre exemple pour calculer ((1-x)-1)/x , si le x est supérieur à la précision machine (donc au ) le calcul se passera bien mais si on est sous la valeur (par exemple /2), le calcul ne donnera plus -1 pour l'expression?

ce que je ne comprends pas c'est pourquoi regarde-t-on pour y proche de 1 et pourquoi ln(y) est proche dey-1.

Merci

(je viens de voir ton post précédent je vais le lire maintenant)

ice456
Membre Relatif
Messages: 109
Enregistré le: 13 Oct 2007, 14:43

par ice456 » 11 Nov 2007, 16:42

daccord je comprends mieux maintenant d'où viens le f(x) = 0 pour les x proche de 0.

Qu'est ce qui se passe concrètement pour un x égal à 0? parce que en regardant l'algorithme ça devrait quand même prendre la valeur -1 non?

J'ai du mal à comprendre aussi le fait que si y est proche de 1, ln(y) est très proche de y-1...

legeniedesalpages
Membre Irrationnel
Messages: 1512
Enregistré le: 16 Mai 2007, 22:40

par legeniedesalpages » 11 Nov 2007, 16:58

ice456 a écrit:Merci pour ton explication je comprend maintenant la notion de non associativité.

Donc dans notre exemple pour calculer ((1-x)-1)/x , si le x est supérieur à la précision machine (donc au ) le calcul se passera bien mais si on est sous la valeur (par exemple /2), le calcul ne donnera plus -1 pour l'expression?

ce que je ne comprends pas c'est pourquoi regarde-t-on pour y proche de 1 et pourquoi ln(y) est proche dey-1.

Merci

(je viens de voir ton post précédent je vais le lire maintenant)



C'est un peu plus vicieux que ça.
Les flottants forment un sous-ensemble des réels qui n'a pas autant de propriétés algèbriques que les réels.

Par exemple, on perd l'associativité et la distributivité.

L'addition +* et la soustraction -* dans les flottants sont des opérations légèrement différentes que celles de .

Les constructeurs de microprocesseurs favorisent la précision à l'étendue des valeurs, et il faut savoir que pour conserver une présicion sur l'addition du type:

avec a et b des flottants et , toujours avec la précision machine

ils ont mis une technique sur la soustraction de décimales de gardes.

Parfois pour soustraire deux flottants qui n'ont pas le même exposant, on conserve une ou plusieurs décimales du nombre le plus petit en valeur absolue qu'on veut soustraire en mémoire.


Par exemple:

on fait la soustraction de à en base 2, et la mantisse n'utilise que quatre chiffres: .




A cause de ça, on a ,

mais il y a quand même un voisinage plus petit de 0 où qui doit dépendre du nombre de décimales conservées.

legeniedesalpages
Membre Irrationnel
Messages: 1512
Enregistré le: 16 Mai 2007, 22:40

par legeniedesalpages » 11 Nov 2007, 17:03

ice456 a écrit:daccord je comprends mieux maintenant d'où viens le f(x) = 0 pour les x proche de 0.

Qu'est ce qui se passe concrètement pour un x égal à 0? parce que en regardant l'algorithme ça devrait quand même prendre la valeur -1 non?

J'ai du mal à comprendre aussi le fait que si y est proche de 1, ln(y) est très proche de y-1...



normalement ça doit donner la valeur -1 en ce point, après ça dépend peut-être de ton algo, je sais pas.

la tangente en 1 de y--> ln(y) est y--> y-1.

ice456
Membre Relatif
Messages: 109
Enregistré le: 13 Oct 2007, 14:43

par ice456 » 11 Nov 2007, 17:30

Ok merci bcp pour toutes ces explications ça m'a été fort utile

ice456
Membre Relatif
Messages: 109
Enregistré le: 13 Oct 2007, 14:43

par ice456 » 12 Nov 2007, 15:51

Re-bonjour,

pour calculer la fonction suivante f : ] - définie par f(x) := , on a donc fini par implémenter de la façon suivante de tel sorte à imiter la perte de précision du numérateur au dénomminateur (en java) :

double f2(double x)
{
double y;
y = 1 - x;
if (y == 1)
_____return -1.0;
else
_____return log(y)/(1-y);
}

Comme exercice on nous a laisé la fonction suivante :

f(x) = .

Je l'ai implémenter de façon naïve et on voit que ça ne passe pas par le point f(0) = -1/2 mais je n'arrive pas à trouver une autre implémentation pour éviter ces erreurs numériques

merci

 

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 23 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite