Forums Développement Multimédia

Aller au contenu

Gestion des Nombres Irrationnels

CODE Actionscript

21 réponses à ce sujet

#1 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 23 May 2008 - 13:44 PM

Bonjour.

Comme tout le monde le sait, Flash sait gérer les entiers grâce aux types uint (ℕ) et int (ℤ).
De même, il est capable de gérer une version binaire des nombres decimaux grace au type float (interne a Number)

Il est possible de traiter l'ensemble des rationnels (ℚ) grâce à un couple d'entiers représentant une fraction.

Par contre, je n'arrive pas à trouver comment on peut réussir à représenter les irrationnels (nombres réels non-rationnels) en informatique.
Est-ce que quelqu'un aurait une solution, ou une piste sur la façon dont on peut gérer un irrationnel en Flash ?

Merci d'avance si quelqu'un a une réponse a cette question.

Pour information, je suis en train de travailler sur un ensemble de classes mathématiques me permettant de gérer des nombres qui se trouvent en dehors des limites des primitives de Flash. (par exemple, les entiers supérieurs a la taille d'un uint), et avec une précision optimum.

Donc, si quelqu'un a un conseil a donner, qu'il n'hésite pas.

Bonne journée.

#2 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 23 May 2008 - 20:52 PM

Il faut implémenter un calcul symbolique, le même qu'on fait en cours de maths quand on simplifie des formules. Ca veut dire faire une surcouche de calcul avec comme type d'atome l'entier positif, puis implémenter les types negatif, fraction, addition, multiplication. Puis pourquoi pas ajouter racine carré, PI (une vraie constante)... Prévoir un opérateur de simplification et un d'approximation (qui te donnera le résultat classique approché sous forme de Number, mais en passant par une résolution symbolique pour avoir le meilleur possible).

Genre là c'est fait à l'arrache, mais je me baserai sur une structure genre comme ça:

Action Script


///////////////////////////////////////
// il nous faut une classe abstraite //

class SymbolicValue
{
public function SymbolicValue() {}

public function equal(value:SymbolicValue):Boolean
{
trace("to override);
return false;
}

public function approximate():Number {
trace("to override);
return 0;
}

public function simplify():SymbolicValue
{
trace("to override");
return null;
}
}

///////////////////////////////////////////
// le type de base est l'entier naturel //

class Natural extends SymbolicValue
{
public var value:uint;

public function Natural (valueUint:uint)
{
value = valueUint;
}

public override function equal(value:SymbolicValue):Boolean
{
if (value is Natural && this.value == value.value) {
return true;
} else {
return false;
}
}

public override function approximate():Number {
return value;
}

public override function simplify():SymbolicValue{ return this }

}

////////////////////////////////
// le négatif est un type //

class Negative extends SymbolicValue
{
public var value:SymbolicValue;
public var sign:int;

public function Negative (symbolicValue:SymbolicValue)
{
sign = -1;
if (symbolicValue is Negative) {
value = symbolicValue.value;
sign *= symbolicValue.sign;
} else {
value = symbolicValue;
}
}

public override function equal(symbolicValue:SymbolicValue):Boolean
{
if (symbolicValue is SymbolicNegative && this.value == symbolicValue.value) {
return true;
} else {
return false;
}
}

public override function approximate():Number {
return value;
}

public override function simplify():SymbolicValue
{
value.simplify();
if (sign == 1) {
return value;
} else {
return this;
}
}

}


///////////////////////////////////////
// l'addition est aussi un type //

class Addition extends SymbolicValue
{
public var leftComponent:SymbolicValue;
public var rightComponent:SymbolicValue;

public function Addition (left:SymbolicValue, right:SymbolicValue)
{
super();
leftComponent = left;
rightComponent = right;
}

public override function approximate():Number
{
return leftComponent .approximate() + rightComponent.approximate();
}

public override function simplify():SymbolicValue
{
leftComponent .simplify();
rightComponent.simplify();
if (leftComponent is SymbolicInteger && rightComponent is SymbolicInteger ) {
return new SymbolicInteger(leftComponent + rightComponent );
} else {
return this;
}
// en fait ici il faudrait tester les types pour voir si:
// - on peut additionner 2 fractions
// - on peut additionner une fraction et un naturel
// ect ect, toutes les règles de simplification s'appliquant à l'addition
}

}

/////////////////////////////
// la fraction //
class Fraction extends SymbolicValue
{
public var numerator:SymbolicValue;
public var denominator:SymbolicValue;

public function Fraction(num:SymbolicValue, den:SymbolicValue)
{
super();
numerator = num;
denominator = den;
}

public function equal(value:SymbolicValue):Boolean
{
if (value is Fraction && value.numerator.equal(this.numerator) && value.denominator.equal(this.denominator)) {
return true;
} else {
return false;
}
}

public override function approximate():Number
{
return numerator.approximate() / denominator.approximate();
}

public override function simplify():SymbolicValue
{
numerator.simplify();
denominator.simplify();
// ici il faudrait testes les type de numerator et denominator
// et simplifier selon les cas si c'est possible pour retourner un naturel par exemple
}

// ensuite la multiplication, la soustraction ...

}

// au final ça permettrai de faire des trucs du style:
var a:Natural = new Natural(5);
var b:Natural = new Natural(17);
var fraction:Fraction = new Fraction(a, b);
var negfraction:Negative = new Negative(fraction);
fraction = new Fraction(a, negfraction);
trace(fraction.approximate);


Bon ça vaut ce que ça vaut, j'ai jamais implémenté vraiment cela et il reste que la simplification de formules peut aussi faire appel à des stratégies, ce qui me parait lourd à implémenter. Donc une piste, mais à mon avis peut-être pas la solution ultime.

Modifié par Logic, 23 May 2008 - 20:55 PM.


#3 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 23 May 2008 - 21:11 PM

Ou alors tu cherches juste à obtenir de meilleurs approximations, genre de PI ou des racines ? A ce moment là il faut utiliser des algos maisons. Pour PI tu as des algos capable de te retourner la n-ieme décimale par exemple. Pareil pour les racines. En général soit ce sont des algos basés sur des théorèmes un peu brutaux, soit c'est juste l'application d'évaluation géométrique.

Par exemple PI étant le rapport entre le périmètre d'un cercle et son diamètre, tu peux l'approximer en inscrivant un polygone régulier dans un cercle et approximer PI en prenant la le rayon du cercle de base et le périmètre du polygone. Plus ton polygone sera précis, plus il "collera" au cercle et te donnera une approximation précise.

#4 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 24 May 2008 - 00:31 AM

Bonjour.

Alors, tout d'abord, l'etat actuel des choses :
Je suis en train de develloper cinq classes :
- La classe BigInt, qui représente un entier relatif à valeur possiblement infinie (Si je travaillait en systeme decimal, je dirait avec un nombre de chiffres possiblement infinis). Le fonctionnement est relativement simple.
- La classe BICalc, qui effectue les opérations fondamentales (+, -, *, /, %, autres ?) avec des BigInt;
- La classe Rational, qui représente un nombre rationnel. Il fonctionne sous la forme d'une paire numerateur-denominateur de BigInt. il possède en interne une gestion automatique pour obtenir une fraction irreductible.
- La classe RationalCalc, qui effectue les opération fondamentales (+, -, *, /, %, autres ?) avec des Rational
- La classe Calc, qui gère les opérations entre fondamentales entre les types courants (uint, int, float, Number), BigInt et Rational.

J'ai, en prevision, pour plus tard:
- La classe RaMath, qui effectue les mêmes opérations que Math, mais avec des Rational.

J'aimerai faire :
- Une classe Real, qui gere les reels.
- Une classe RealCalc, pour les operations fondamentales entre Real.
- Une classe ReMath, qui effectue les mêmes opérations que Math avec des Real.

Je possède toutes les infos nécessaires pour les 5 premières classes, et je connais les méthodes à utiliser pour la sixième.
Mon problème vient du fait que je cherche à représenter le type réel (et donc, par définition, le type irrationnel). Malheureusement, si le concept du nombre réel est simple, je n'ai aucune idée de la façon de le représenter pratiquement. C'est sur ce fait la que je demande de l'aide.
Ceci mis a part, je connais les différents principes de calcul de PI et autre méthodes de Machin, mais ce n'est pas mon problème premier, qui reste de trouver une façon viable de représenter un nombre irrationnel (c'est a dire un nombre ayant une infinité de nombres après la virgule, quelque soit la base dans lequel on fait le calcul).

J'ai peu d'espoirs, mais on ne perd rien a demander.

Bonne journée.

PS: pfff, si j'avais été en C++, il y aurait eu de la surcharge d'opérateur à tout va.

#5 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 24 May 2008 - 01:14 AM

OK, alors ne t'attends pas à trouver une formulation finitiste pour les irrationnels à partir des naturels: tout simplement car cette formulation n'existe pas. Je m'explique: les irrationnels sont indénombrables et ne sont donc pas caractérisables par des moyens finitistes (les moyens finitistes ne génèrent que des ensembles dénombrables). Pour te dire, la construction ensembliste des réels nécessite un "bond" dans l'infini.

Néanmoins, tu peux ajouter à tes rationnels les nombres algébriques (dénombrables). C'est une sous classe des irrationnels qui sont exprimables comme solution d'une équation algébrique (tu obtiendras ainsi toutes les racines), il te manquera alors juste le gros paquets de transcendants (PI par exemple) qui reste indénombrable

#6 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 24 May 2008 - 01:23 AM

Bon j'avoue le coup du finitisme c'est pas forcément ce qu'il y a de plus clair. Si ça peut mieux te convaincre, prend l'ensemble des algorithmes. Il est infini dénombrable et chaque algo ne peut générer qu'un nombre potentiellement infini dénombrable de résultats (on considère même les algos qui ne s'arrêtent jamais et écrivent des décimales pendant un temps infini). Tu fais la réunion de tout ça et tu obtiens toujours du dénombrable... donc bien loin de l'indénombrable des réels icon_idea.gif

Modifié par Logic, 24 May 2008 - 01:27 AM.


#7 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 24 May 2008 - 09:35 AM

salut,

cette discussion est super intéressante... (et c'est pas ironique wink.gif)

mais je m'interroge sur l'utilité d'une telle classe (pour les irrationnels) puisque de toute manière il faudra bien à un moment en faire une estimation.

si le but est de limiter les erreurs d'approximation pourquoi ne pas plutôt implémenter une classe de calcule formelle, qui permet la factorisation, le développement,... ainsi une fois la formule réduite on utilise la valeur approchée du nombre irrationnel et on limite les erreurs.

mais de toute manière on ne peut pas représenter un nombre irrationnelle (à part en symbolique) avec un nombre fini de chiffre, puisque c'est exactement le contraire de la définition.

#8 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 24 May 2008 - 18:38 PM

Citation (la pieuvre @ May 24 2008, 09:35 AM) Voir le message
mais de toute manière on ne peut pas représenter un nombre irrationnelle (à part en symbolique) avec un nombre fini de chiffre, puisque c'est exactement le contraire de la définition.


Ca fait un peu maths de bistrot ça...

#9 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 25 May 2008 - 10:44 AM

au moins ça essaye de faire avancer les choses wink.gif...

#10 Xarald

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2179 messages

Posté 25 May 2008 - 10:51 AM

Euh c'est quoi un nombre irrationnel ? icon_lol.gif

#11 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 26 May 2008 - 06:04 AM

Bonjour.

Logic : Très intéressants, tes liens. Je ne connaissant pas le principe des nombres algébriques.

Xarald : Un rapide retour sur les différents ensembles habituels en mathématiques :
- Les entiers naturels (ℕ) : Cette ensemble contient tous les nombres entiers positifs.
- Les entiers relatifs (ℤ) : Ils correspondent a l'ensemble des entiers naturel et leurs pendants négatifs. ℕ C ℤ
- Les rationnels (ℚ) : Ils correspondent a l'ensemble de nombres qu'il est possible de représenter sous la forme d'un quotient de deux entiers relatifs (cad une fraction). Autrement dit, tout nombre ayant un nombre finit de décimales dans au moins une base est un rationnel. On peut également dire que tout nombre présentant une période dans leur développement décimal est rationnel. ℤ C ℚ
- Les réels (ℝ): Ils représentent l'ensemble des nombres ayant une représentation décimale finit comme infinie. Il sont donc composes des tous les rationnels, plus les nombre ne possédant pas de période dans leur développement décimal (Tel que Π et √2). ℚ C ℝ
- Les autres ensembles (Complexes, Hypercomplexes, ou autres), je vais les mettre de côté pour une prochaine fois.

Les nombres irrationnels sont les nombres réels non-rationnels. C'est donc le cas de Π et √2, qui ne peuvent pas être représentés par une fraction.

Bonne journée.

#12 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 29 May 2008 - 08:28 AM

Il y a aussi les nombres transfinis.

#13 gregpich

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 62 messages

Posté 29 May 2008 - 23:33 PM

hum... sans vouloir m'immiscer dans une conversation de haut vol, et qui me passe donc largement au-dessus de la tête... en informatique, les irrationnels n'existent pas puisqu'on est forcèment limité par le nombre d'octets sur lesquels on code les données... (fais une recherche sur IEEE 754 qui est la norme de représentation des nombres en informatique)

#14 antinua

  • Members
  • PipPipPipPipPipPipPipPip
  • 1067 messages

Posté 30 May 2008 - 04:29 AM

Bonjour.

Je connais, bien sur, la norme IEEE 754, mais mon but est d'aller haut-delà de cette norme en tentant de représenter des nombres que cette norme de peut pas représenter sans imprécision.
C'est, entre autre, pourquoi je travaille avec des 'Nombres' dont le nombre d'octets est variable.

Bonne journée.

#15 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 30 May 2008 - 15:55 PM

Citation (grigri_lab @ May 29 2008, 11:33 PM) Voir le message
en informatique, les irrationnels n'existent pas puisqu'on est forcèment limité par le nombre d'octets sur lesquels on code les données...


Avec ton raisonnement on pourrait même déduire qu'il est impossible de coder les entiers. Ce qui est bien sur faux, puisqu'il suffit de mettre "bout à bout" plusieurs int pour avoir des entiers de tailles arbitrairement grandes (enfin pour peu que l'univers soit infini, sinon on arrivera forcément à la taille limite permise par la physique).

#16 gregpich

    Ceinture Verte

  • Members
  • PipPipPipPip
  • 62 messages

Posté 30 May 2008 - 20:06 PM

Citation (Logic @ May 30 2008, 02:55 PM) Voir le message
Avec ton raisonnement on pourrait même déduire qu'il est impossible de coder les entiers. Ce qui est bien sur faux, puisqu'il suffit de mettre "bout à bout" plusieurs int pour avoir des entiers de tailles arbitrairement grandes (enfin pour peu que l'univers soit infini, sinon on arrivera forcément à la taille limite permise par la physique).

et bien oui c'est le cas... il est impossible de coder les entiers! icon_lol.gif la taille des entiers n'est pas arbitrairement grande en binaire... elle est fonction du nombre d'octet! par exemple dans une base de données, tu vas avoir des prolèmes pour dépasser bigInt (sur 8 octets soit de -9223372036854775808 à 9223372036854775807, ce qui laisse quand-même une sacrée marge!). Après tu peux coder sur n bits, tu ne dépasseras jamais le nombre réel 2^n+2^(n-1)+...+2^0, n'est-ce pas?... alors pour les irrationnels et l'infini, ça se corse sérieusement ,non?... mais tout est possible, enfin... je n'ai pas bien compris ce que Aralicia voulait faire, mais ça s'apparenterait à un truc du genre ça :
http://www.vbfrance.com/codes/BIGINT-STRUC...ILLE_41931.aspx
de quoi s'arracher les cheveux ! enfin bon courage !;-)

#17 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 30 May 2008 - 22:35 PM

Oui tu peux recoder les entiers à partir des String (on va mettre de coté les performances). Ca supposera donc que la seule limite est la mémoire physique de l'ordinateur. Encore que l'ordinateur peut demander un ajout de mémoire quand il a besoin, et dans ce cas la seule limite devient la taille de l'univers.

Pour les irrationnels la limite est autre; il s'agit ici d'une limite démontrée dans le cadre de la théorie de la calculabilité.

#18 la pieuvre

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 3055 messages

Posté 31 May 2008 - 18:50 PM

je me pose toujours la question de l'utilité d'une tel fonction...

(parce que à mon avis, c'est l'utilité qui va définir la méthode, enfin en parti!).

#19 phil

  • Members
  • PipPipPipPipPipPipPipPip
  • 738 messages

Posté 01 June 2008 - 08:52 AM

Citation (Logic @ May 30 2008, 11:35 PM) Voir le message
Oui tu peux recoder les entiers à partir des String (on va mettre de coté les performances). Ca supposera donc que la seule limite est la mémoire physique de l'ordinateur. Encore que l'ordinateur peut demander un ajout de mémoire quand il a besoin, et dans ce cas la seule limite devient la taille de l'univers.

Pour les irrationnels la limite est autre; il s'agit ici d'une limite démontrée dans le cadre de la théorie de la calculabilité.


Logic, juste une question :

TU ES PROF DE MATH OU UN GENIE ?

A++

#20 Logic

  • Honoris
  • PipPipPipPipPipPipPipPip
  • 2733 messages

Posté 01 June 2008 - 17:36 PM

Ni l'un ni l'autre, la théorie de la calculabilité est enseignée dans beaucoup de Masters mathématiques et informatiques.

#21 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 01 June 2008 - 17:49 PM

salut

j'y connais pas trop en math mais quand je regarde wikipedia je vois que la racine de 2 peut etre representer par un triangle qui aurai comme coté 1,1,racine de 2

tu peux peut etre representé un irrationnel par 2 entier ?

mais je dis surement nawak


a+

#22 tibibi0508

  • Members
  • PipPipPipPipPipPipPipPip
  • 1704 messages

Posté 01 June 2008 - 18:51 PM

Salut,

En fait un irrationnel ne peut pas être représenté par la fraction de 2 entiers. C'est la racine d'un nombre n'étant pas un carré parfait qui donne le nombre irrationnel. De plus les nombres transcendants échappe à cette règle. Aralicia a du courage gourou.gif

Modifié par tibibi, 01 June 2008 - 18:52 PM.




1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP