Les programmes suivants sont disponible au téléchargement sur https://www.planet-casio.com/Fr/programmes/programme4116-last-number-to-fraction-thebigbadboy-utilitaires-conversion.html Ce programme est sous licence Creative Commons 2.0 BY, donc un lien vers le site ci-avant fait toujours plaisir ! Programmeur : SMAGGHE Clément (alias TheBigBadBoy sur la communauté Planète Casio). N'hésitez pas à me contacter par mail : cle.smagghe@gmail.com . L'objectif des différents programmes est de trouver le numérateur et le dénominateur à partir d'un nombre décimal donné en entrée. Plusieurs implémentations s'offrent à nous : - donner une approximation fractionnaire pour tout nombre entré, y compris les irrationnels (pi, sqrt(5), ...) - R2FRCTJS - donner une approximation fractionnaire pour un nombre entré, sans retourner de résultat en fonction d'un seuil (pour ne pas obtenir d'approximation de pi etc) - R2FRC - donner une approximation fractionnaire pour tout nombre entré avec une erreur entrée aussi par l'utilisateur - R2FRCERR - donner une approximation fractionnaire pour tout nombre entré grâce au développement en fraction continue - R2FRCONT Les noms des différents programmes sont assez parlant : R2FRCTJS pour toujours, R2FRC qui fait une sorte de "distinction entre rationnels et irrationnels", R2FRCERR en donnant une erreur et R2FRCONT pour la fraction continue. Les programmes à privilégier (pour ceux qui veulent uniquement obtenir une fraction à partir d'un nombre) sont bien évidemment R2FRC puis R2FRCTJS. Comme dit précédemment, R2FRC peut être plus utile si vous ne voulez pas trouver de fraction à partir d'irrationnels (pi, sqrt(5), ...). Cela implique aussi que certains rationnels "trop compliqués" pourraient ne pas être trouvés, comme le cas de 1÷3-ᴇ-5 qui se trouve être 99997/300000, fraction que seul R2FRCTJS trouvera. R2FRCTJS est en fait une traduction en Basic Casio du Listing 1 disponible dans le magazine Byte de mai 1985 (volume 10, n°5) à la page 430 (qui peut être retrouvée ici : https://archive.org/details/byte-magazine-1985-05/page/n430/mode/2up). La page 429 explique aussi un peu son fonctionnement. Le Listing 2 sur cette même page a servi de base pour R2FRC. En effet, quelques astuces permettent de trouver plus souvent une représentation fractionnaire : - ramener le nombre en entrée dans l'intervalle [0.1; 1[ (une idée de LephenixNoir) - itérer la boucle jusqu'à trouver une fraction dont le numérateur et dénominateur sont entiers qui vaut exactement le nombre donné - vérifier si la fraction trouvée est cohérente : si (dans le Listing 2) la valeur de C a une partie décimale minime (ou très proche de 1), dès lors l'approximation est considérée correcte. Veuillez noter que les instructions "Return" dans les différents programmes signifient que ceux-ci n'ont pas su trouver d'approximation fractionnaire valable. Note supplémentaire : Il est essentiel de savoir qu'en Basic Casio, le nombre maximal de Chiffres Significatifs enregistrés dans une variable est 15, tandis que toute addition/égalité ne prend en compte que les 13 premiers C.S.. Voilà pourquoi, dans le programme R2FRC, vous trouverez "Frac 100AD" : AD appartenant à [0.1; 1[ , Frac (100AD) est donc un nombre contenant au maximum 13 C.S.. Une égalité exacte (sur 15 C.S.) peut alors est vérifiée. Je me suis permis de ne pas implémenter ce petit "plus" (que certains appeleront "une chose à ne pas faire") dans les autres programmes, car il y est plus lourd à implémenter (il faut s'assurer d'obtenir au moins 2 C.S. et au plus 13 !). Il aurait donc été possible d'obtenir une fraction plus correcte/poussée de pi (par exemple). Aussi, une erreur nulle ne veut pas dire pour autant que le nombre entré est rationnel. Sinon, en sachant que max. 15 C.S. sont enregistrés, tous les nombres représentables sur calculatrice pourraient être exprimés comme des fractions (avec une erreur nulle). Seul le programme R2FRCONT peut prendre en entrée des nombres imaginaires, mais cette utilisation est légèrement inutile car la fraction trouvée n'est généralement pas irréductible (par exemple, on pourrait obtenir "(2+I)÷(2-I)"). Par ailleurs, les nombres imaginaires ne peuvent être affichés via l'instruction "Locate", il faudra donc corriger par vous-même ce "problème". Certains symboles étant indisponibles sur ordinateur, je noterai ces expressions suivantes [...] qui peuvent être trouvées sur la calculatrice ici [...] : 10^ peut être trouvé ici : [SHIFT] + [log ] *10^ peut être trouvé ici : [SHIFT] + [log ] ⁻¹ peut être trouvé ici : [SHIFT] + [)] Fin de ligne ici correspond au retour à la ligne [↵] Filename:R2FRC ----------------------------------------------------------------------------------// Real TO FRaCtion - 252 octets - 4 variables & Ans 1→B // Dans ce programme, C sera le numérateur et B le dénominateur (en partie) ?→A // Abs A // → Ans 10^-Intg log 10Ans→D // Ne change pas la valeur de Ans ! Identique à ...log (10Ans). D est la puissance de 10 permettant de mettre A dans l'intervalle [0.1; 1[ AnsD // → Ans Do // B÷Ans→B // Ne change pas la valeur de Ans ! Nouveau dénominateur approximé. B>ᴇ75⇒Return // Si le numérateur devient excessivement grand, on peut arrêter le programme car aucune fraction n'a été trouvée. Je n'ai jamais eu l'occasion de voir cette condition-ci vraie, car une fraction a toujours été trouvée avant (avec des tests personnels). Une valeur plus petite pourrait augmenter la vitesse d'exécution en cas de "non-convergence", mais certaines fractions ne pourraient plus être trouvées (comme par ex. ᴇ-80 qui n'est que 1/ᴇ80). Frac Ans⁻¹ // → Ans Intg (ADB+.5→C // Ne change pas la valeur de Ans ! Nouveau numérateur approximé. Intg(ADB+.5) arrondi ADB à l'entier le plus proche. LpWhile C≠ADInt (B+.5) Or Frac 100AD≠Frac (100C÷Int (B+.5 // Itérer tant que la nouvelle fraction (C÷B) n'est pas égale au nombre entré reporté à l'intervalle [0.1; 1[ . Int (B+.5) arrondi B à l'entier le plus proche (B>0, donc Int ou Intg ne change rien). Pour Frac 100AD, voir note ci-dessus. Ans>.01 And Ans<.99⇒Return // Si la variable Ans est assez petite (ou assez proche de 1), alors la fraction trouvée est considérée comme cohérente. Valeur subjective (0.01). Si vous essayer ce programme en entrant pi, la valeur de Ans ici sera de 0.237 Int (B+.5→B // Arrondir B à l'entier positif le plus proche. Permet de gagner quelques octets car B est lu encore 4 fois. N'est plus utile si une fraction réductible peut vous convenir (ne pas pour autant oublier que cette expression est le dénominateur). 1+Abs log D // → Ans. Maintenant, la fraction trouvée est correcte, mais pour le nombre appartenant à [0.1; 1[ . Soit C doit être multiplié par D si A≥1, soit B doit être multiplié par D si A<0.1. Après cette opération, le numérateur et dénominateur ne sont plus nécessairement premiers entre eux. Abs log D évalue donc le nombre max de facteurs 2 et 5 possiblement communs aux num et dénom de la fraction (on ajoute 1 pour plus de facilité dans la somme juste après). 2 et 5 car ce sont les diviseurs des puissances de 10. D<1⇒CD⁻¹→C // Grâce à ces deux conditions sur D, la fraction est maintenant celle correspondant au nombre donné en entrée. D>1⇒BD→B // .5^Σ(Frac .5^AB=-Abs Frac .5^AC,A,1,Ans)÷5^Σ(Frac .2^AB=-Abs Frac .2^AC,A,1,Ans→A // Attention aux priorités des opérations ! Le calcul est équivalent à Frac (B÷(2^A)). Aussi, l'égalité dans chacune des sommes "=-" permet de déterminer si les 2 membres sont tous les 2 nuls (car ils sont positifs). Nous allons compter combien de facteurs 2 et 5 sont communs au num et dénom. Les sommes feront toujours une itération de plus que nécessaire (car 1+Abs log D) afin d'éviter une erreur math (si commence à l'indice 1 et devrait finir à l'indice 0). ClrText // "NUM" // AC◢ // A est maintenant le facteur multiplicatif permettant de rendre irréductible la fraction trouvée. "DENOM" // AB // // // // Filename:R2FRCTJS -------------------------------------------------------------------------------// Real TO FRaCtion TouJourS - 96 octets - 3 variables & Ans 0→B // 1→C // ?→A // Abs A // → Ans While Frac AC // 1÷Frac Ans // → Ans C→D // Ce genre d'affectation ne change pas la valeur de Ans. Uniquement besoin de D comme valeur intermédiaire. CInt Ans+B→C // D→B // WhileEnd // "NUM" // AC◢ // "DENOM" // C // // // // Filename:R2FRCERR -------------------------------------------------------------------------------// Real TO FRaCtion avec ERReur donnée - 140 octets - 5 variables & Ans 1→A // 0→B // "PRECISION.EX:ᴇ-5"?→D // D peut aussi être vu comme une majoration de l'erreur commise. "X="?→X // Abs X // → Ans While DA