J'aimerais connaître une bonne façon de vérifier si un numéro X est un rationnel (deux entiers n, m existent de sorte que x = n / m) en python. P>
in mathematica, cela se fait par la fonction Je suppose que cette question a une réponse pour une précision donnée.
Y a-t-il un algorithme commun d'obtenir ces deux entiers? P> rationaliser [6.75] code>:
27/4 code> p>
7 Réponses :
Tout nombre avec une expansion décimale finie est un nombre rationnel. Vous pouvez toujours résoudre par exemple en disant qu'il correspond à p> de sorte que des flotteurs et des doubles ont une précision finie qu'ils sont tous rationnels. p> p>
Notez «Précision donnée» dans la question initiale.
Comme vous avez noté que tout numéro de point flottant peut être converti en nombre rationnel en déplaçant le point décimal et en divisant par la puissance appropriée de dix. P>
Vous pouvez ensuite retirer le plus grand diviseur commun du dividende et diviseur et vérifiez si ces deux numéros correspondent au type de données de votre choix. P>
FWIW, vous pouvez déterminer facilement déterminer le plus grand diviseur commun en Python en utilisant fractions.gcd () code>.
in python> = 2.6 Il y a un Cependant, en raison de la manière dont les flotteurs sont définis dans les langages de programmation Il n'y a pas de numéros irrationnels EM>. P> P> P> P> as_integer_ratio code>
méthode sur des flotteurs:
Les irrationnelles ne peuvent pas être représentées par le ratio (NAL) S non plus - que la définition même et la source du nom!
@delnan, FWIW, ils peuvent être représentés comme des rationnels. Les deux méthodes d'utilisation courante pour le faire officiellement (DEDEKIND CUTS et CAUCHY SERIES) utilisent des rationnelles pour le faire. Ils utilisent juste une quantité infinie de rationnelles :)
Pour un vrai plaisir, recherchez des fractions continues. Pour mettre en œuvre une solution vous-même, vous effectuez la fraction continue jusqu'à ce qu'il entraîne une fraction exacte ou que le dénominateur devient trop gros pour votre goût.
Ensuite, pour voir si c'était rationnel, faites une vérification sanité définie par l'utilisateur sur votre dénominateur.
Python utilise une représentation à virgule flottante plutôt que des nombres rationnels. Jetez un coup d'œil à La bibliothèque standard fractions code> module
pour certains détails À propos des chiffres rationnels.
Observez, par exemple, cela, pour voir pourquoi cela va mal: p> (Oh, vous voulez voir un cas où cela fonctionne?) p>
Y a-t-il des langages de programmation qui "utilisent" des chiffres rationnels?
@SilentGhost: ABC fait. Voir les expériences de Guido avec et pourquoi Python ne le fait pas: python-history.blogspot.com/2009/03/...
@SilentGhost, commune Lisp et (je crois) le schéma fait aussi.
Le problème avec des nombres réels dans les langages de programmation est qu'ils sont généralement définis comme des fonctions qui renvoient une représentation finie donnée une précision (par exemple, une fonction qui prend N comme argument et renvoie un numéro de point flottant dans une précision de 2 ^ -n) . p>
Vous pouvez définitivement transformer un élément rationnel / entier en une réelle réelle, mais même la comparaison des réels d'égalité est indéchée (c'est essentiellement le problème d'arrêt). P>
Vous ne pouvez pas dire si un nombre réel X est rationnel: même en mathématiques, il est généralement difficile, car vous devez trouver p et q tel que x = p / q, et cela est souvent non constructif. P>
Cependant, étant donné une fenêtre de précision, vous pouvez trouver la "meilleure" approximation rationnelle pour cette précision en utilisant par exemple une expansion de fraction continue. Je crois que c'est essentiellement ce que fait Mathematica. Mais dans votre exemple, 6,75 est déjà rationnel. Essayez avec pi à la place. P>
La nature des nombres de points flottants signifie qu'il n'a aucun sens pour vérifier em> si un numéro de point flottant est rationnel, car tous les nombres à virgule flottante sont vraiment des fractions de la forme n em> / 2 e em> sup>. Cependant, vous voudrez peut-être savoir s'il existe une fraction simple em> (une avec un petit dénominateur plutôt qu'une grande puissance de 2) qui se rapproche étroitement d'un numéro de point flottant donné. Donald Knuth discute de ce dernier problème dans l'art de la programmation informatique em> volume II. Voir la réponse à l'exercice 4.53-39. L'idée est de rechercher la fraction avec le dénominateur le plus bas dans une plage, en élargissant les points de terminaison de la gamme comme des fractions continues tant que leurs coefficients sont égaux, puis lorsqu'ils diffèrent, prenez la valeur la plus simple. Voici une implémentation assez simple en python: p> et voici quelques résultats: p>
+1 pour fournir l'algorithme. Nitpick: il devrait être "si x == y: retourne x" puisque vous semblez envisager l'intervalle fermé [x, y].
Je ne fais pas cela car x code> et
y code> sont censés être des flotteurs pendant que la fonction est censée renvoyer une fraction
code>. Je pense qu'il est préférable d'augmenter une erreur dans ce cas.
Il serait logique de renvoyer fraction (* x.as_integer_ratio ()) code>, je suppose.