1 != 1 - créer un bug ?

Fermé
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 - 4 janv. 2010 à 19:51
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 - 5 janv. 2010 à 02:44
yo,

voilà ce qu'on m'a montré il fut un temps. tout cela est correct en mathématiques mais ne marcherait en algo que si on pouvait représenter l'infini en informatique, je ne sais pas si c'est possible.

ce qui suit n'est pas un algorithme mais un calcul mathématique, l'opérateur '=' n'est donc pas un opérateur d'affectation mais bien un opérateur qui montre une égalité.

on donne une valeur à notre unique variable 'x' (héhé en fait pour le coup c'est bien une affectation )
x = 0,999999999999999----à l'infini
donc:
9 + x = 9,9999999999999999----à l'infini
et:
10x = 9,9999999999999999----à l'infini

donc:
9 + x = 10x

et comme:
10x = 9x + x (et ça quelque soit la valeur de x de toute façons)

alors:
9 + x = 9x + x

donc:
9 = 9x

si on divise cette égalité par 9, cela donne:
1 = 1x

donc:
x = 1

donc 0,9999999999ç----à l'infini = 1


voilà je souhaitais surtout partager ce petit tour de passe passe, mais je voulais savoir si selon vous il était possible de l'implémenter dans un langage histoire de faire partir un processeur en sucette ;)
A voir également:

6 réponses

moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
4 janv. 2010 à 20:26
salut

alors:
9 + x = 9x + x

9 +3 = 9*3 +3
12 = 27+3
12=30
non je ne crois pas LOL!!!!


alors:
9 + x = 9x + x

9+1 = 9+1
La ok mais ce n'est pas general
4
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
4 janv. 2010 à 21:03
non tu n'as pas saisi,

c'est: 10x = 9x + x qui se vérifie dans tous les cas.

en effet,

si x vaut 5,

10*5 = 9*5 + 5.



Mais dans ce cas précis, 9 + x = 9x + x quand x = 0,9999999999 infini

puisque chacune des deux expressions équivaut à 9,9999999999 infini

9 + x = 9,9999999999999999----à l'infini
et:
10x = 9,9999999999999999----à l'infini


défini par

10x = 9x + x
, prouvé au dessus.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
4 janv. 2010 à 21:49
niahoo, ton raisonnement est correct. Et oui, 9,999999999.... = 10 . En fait, tout ce qui se termine par 9 à l'infini, peut être remplacé par le "1" correspondant...

3,12399999999999999....
=
3,124


attention, tu n'as pas montré que 1 n'est pas égal à 1 ... tu as montré que 0.99999.... est égal à 1 . Il y a deux manière d'écrire le nombre entier 1 en écriture décimale : 1,0000.... et 0,9999.... ;)
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
4 janv. 2010 à 21:57
de plus, le fait d'avoir une contradiction mathématique, même s'il y en avait une pour de vraie, ne va pas faire partir ton processeur en vrille. si tu veux dégouter ton processeur d'avoir été fabriqué, il faut plutot faire un truc du genre :
1 : FAIRE UN CALCUL (3+5 par exemple)
2 : ALLER A LA LIGNE 1

ça suffit amplement :D


concernant plus précisément les nombres et les ordinateurs, de toute façon un ordinateur ne connait pas de nombre à virgule avec une infinité de décimales. Il ne travaille qu'avec un nombre fini de nombres (normal puisqu'il n'y a qu'un nombre fini de cases mémoires). Les "nombres" dans les ordis, ce sont des faux en quelque sorte, mathématiquement ce sont un sous-ensemble des nombres réels (et même des rationnels particulièrement).
0
lithium_3 Messages postés 2654 Date d'inscription mercredi 14 janvier 2009 Statut Contributeur Dernière intervention 15 juillet 2013 139
4 janv. 2010 à 22:19
Bonjour,

tout cela nous montre bien que l'infini n'est qu'une notion, un outil conceptuel de théoricien, mais en aucun cas un nombre avec lequel on puisse calculer!

Je doute que l'infini soit représentable en informatique.

Cordialement
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
5 janv. 2010 à 00:51
oui, le problème c'est j'aime dire que c'est comme le mot pollution. C'est complètement vague comme notion.

Par contre en maths c'est "quelque chose" de précis (ou plutot c'est plusieurs notions différentes). Il y a par exemple le fait qu'il y a une infinité de chiffres après la virgule (ça c'est précis ! et on peut avoir des résultats avec, par exemple le précédent). Il y a l"infiniment grand" dans les limites et les études de fonctions (niveau lycée). etc...

Simplement parler de "l'infini", je suis d'accord avec toi, n'est qu'une notion abstraite plus ou moins philosophique. Mais sinon, dans les applications elle est tout à fait utilisable : l'infini dont je te parlais des études de fonctions est déjà implémenté en programmation via le standard IEEE des nombres à virgule (flottante) habituels sur les ordinateurs.
Si tu fais un calcul qui donne un nombre trop grand, la valeur symbolique "Inf" est retournée. Elle réagit grosso-modo comme les limites (je ne sais pas si tu as vu ça où si tu t'en rappelles ? )
0
lithium_3 Messages postés 2654 Date d'inscription mercredi 14 janvier 2009 Statut Contributeur Dernière intervention 15 juillet 2013 139 > Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
5 janv. 2010 à 01:26
Forcément, je m'attaque à quelque chose qui est rentré dans le naturel de tout bon chercheur...

Le vide ou la fin fait peur, il nous est facile de dire "l'univers est infini" , ou qu'un disque est constitué d'une infinité de points ... Mais attention, d'une infinité de points infiniments petits!

Qu'est-ce qu'un chiffre si ce n'est qu'une invention de l'Homme (bien pratique, je ne le nie pas). Qu'est-ce que l'infini si ce n'est que l'incapacité à chiffrer quelque chose?

Au niveau du inf retourné par l'ordinateur, je me doutais que l'infini était défini sur ces machines mais l'infinité de chiffres après la virgule l'est-elle? Car cela dépend en plus du pouvoir de calcul du processeur, par exemple s'il est 32 ou 64 bits ... ?

Cordialement
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
5 janv. 2010 à 01:05
moi j'ai vu les limites.. mais hélàs je dessinais sur a table. mais si je me souviens bien ça permettait de montrer le comportement d'une fonction, savoir si elle tendait vers l'infini, 0, ou une constante sans avoir à tester empiriquement des valeurs.

je me rappelle effectivement en potassant un bouquin de C++ avoir lu que les flottants n'étaient qu'une approximation, des "fauxx" comme tu dis, j'ai lu qu'un compilateur trouvera que 2.00 et 2 sont différents. (float et int)

hmm oui une boucle infinie ça suffit pour planter un proc, mais je cherche surtout à le faire se tromper avec un algorithme correct. mais avec ce dont je viens de me rappeler concernant les flottants c'est effectivement impossible.

tu connais des applications mathématiques du 1 écrit 0,9999~ ?
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
5 janv. 2010 à 01:53
tu connais des applications mathématiques du 1 écrit 0,9999~ ?
non. Ce serait plutôt un résultat en soit, une simple curiosité et un prétexte de réflexion sur "qu'est-ce qu'un nombre"... c'est un révélateur du problème que pose l'écriture décimale (et "qu'est ce que l'écriture décimale" d'un nombre? )
On peut retrouver ça plus simplement :
1/3 + 1/3 + 1/3 = 3/3 = 1
0.333... + 0.333... + 0.333 = 0.999...


Et sinon, par rapport à ta question de départ, c'est justement dans les float et leur approximation qu'il y a une grande source de bugs possibles.

j'ai fait un petit programme pour illustrer mes propos :
//------------------------------------------------
#include <iostream>
#include <string>

using namespace std;


int main(int argc, char *argv[])
{

    float a=2.0, b=2.00001;
    cout << "Une erreur d'arrondi plutot importante :" << endl;
    cout << "a=" << a << endl << "b = " << b << endl;
    cout << "b-a = " << b-a << endl;
    cout << "100000000.0*(b-a) = " << 100000000.0*(b-a) << endl;
    cout << "Je doute que la banque ou le magasin apprecie!";
    cout << endl << endl << endl;
    
    
    float c=5000.0;
    float d=c;
    float petit = 0.000001;
    cout << "Voici un petit nombre : " << petit << endl;
    cout << "1'000'000'000 * petit = " << 1000000000*petit << endl;
    cout << "c = " << c << endl;
    cout << "Ajout de 1'000'000'000 de fois petit dans c ... " << endl;
    for (int i=0; i<1000000000; i++) {
        // j'ajoute 1 milliard de fois un millionième.
        // en tout ça fait que j'ai ajouté 1000
        // le résultat devrait être 500001000
        d = d + petit;
    }
    cout << "d = "<<d << endl;
    cout << "c == d    :    " << ((c==d)?"vrai!":"faux!") << endl; 
        
    
    //fin
    cin >> a;
    return 0;
}
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013
5 janv. 2010 à 02:01
sortie sur mon ordi : http://img43.imageshack.us/img43/2534/nombresfloat.gif
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
5 janv. 2010 à 02:24
héhé faut que je voie mon banquier moi ^^




super le PC qui ajoute 0 .. en même temps je pense que de lui faire faire un milliard de fois une simple addition au lieu d'utiliser la multiplication il t'en veut personnellement ton PC. fais le compiler par un CP/CE1 ton programme et tu verras y aura plus de bug !


1/3 + 1/3 + 1/3 = 3/3 = 1 
0.333... + 0.333... + 0.333 = 0.999...


exact, j'y avais pas pensé tiens ''/


ps: gaffe dans tes commentaires y a des coquilles, si quelqu'un tombe dessus tu vas lui faire rater ses examens de programmation :P
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
5 janv. 2010 à 02:30
pour le commentaire, désolé, j'avais mis autre chose avant, et j'ai oublié de modifier, tu as bien corrigé.



et sinon ça peut paraître un peu tiré par les cheveux mon truc d'ajouter plein de fois 0...
pourtant tu as bien vu, mon nombre n'est pas 0.
Et en pratique lors de calcul scientifique, ou économique, etc., il arrive souvent de devoir ajouter un très grand nombre de valeurs entre elles. Mais si tu as plein de petites et une relativement grosse, peu importe le nombre de petite que tu ajoutes, la grosse aura "mangé" les autres si tu ne fais pas attention. Même si à la fin tu aurais été censé avoir un bien plus gros résultat.
0
niahoo Messages postés 247 Date d'inscription lundi 24 décembre 2007 Statut Membre Dernière intervention 23 mai 2010 19
5 janv. 2010 à 02:44
oui j'ai constaté ça en faisant une carte dynamique en SVG/javascript basé sur les données du jeu Eve Online.

(c'est un plan de galaxie, des points représentent des systèmes solaires reliés entre eux par des stargates. un simple graphe au final. mais les coordonnées fournies par les dev du jeu dans leur dump sont de l'odre de x.10^17 pour les extremes. les dessins que je rajoutais dynamiquement, du genre deux droites perpendiculaires qui partent du système solaire demandé pour rejoindre les axes abscisses ordonnées afin de faire une grosse croix sur le système, partaient n'importe ou..

après m'être arraché plusieurs touffes de cheuveux sur mon algo qui me semblait pourtant correct j'ai arbitrairement divisé par 10^14 toutes les coordonnées reçues depuis MySQL et là magie..)

bon allez bonne nuitée et merci pour tes réponses ;)
0