Trouver période de la décimale d'un nombre

Résolu
Elcopeau - 25 sept. 2023 à 18:08
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 - 28 sept. 2023 à 08:16

Bonjour,

Je cherche un algorithme pour extraire la période de la partie décimale d'un nombre.

Exemple :

Pour le nombre 0,133333333 je dois obtenir 3

Pour le nombre 3,245245245 je dois obtenir 2455

Pour le nombre 1,0164778158232 je dois obtenir 0164778158232

Si quelqu'un a une solution car moi je sèche.

Par avance merci beaucoup.

11 réponses

yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477
Modifié le 26 sept. 2023 à 11:04

Pour transformer en fraction:

Public Function frak(x As Double) As String
Const mini As Double = 1 / 1000000000#
Dim i As Integer, t As Double, numer As Long, tt As Double
frak = "?"
For i = 1 To 1000
    t = x * i
    numer = Int(Round(t))
    If numer >= 1 Then
        tt = t / numer
        If Abs(tt - 1) < mini Then
            frak = Str(numer)
            If i > 1 Then
                frak = frak + " / " + Str(i)
            End If
            Exit For
        End If
    End If
Next i
End Function
1
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477
28 sept. 2023 à 08:16

plus lisible et plus général:

Public Function frak(x As Double) As String
Const mini As Double = 1 / 10000000#
Dim i As Integer, numer As Long
frak = "?"
For i = 1 To 1000
    numer = Int(Round(x * i))
    If numer <> 0 Then
        If Abs((numer / i) / x - 1) < mini Then
            frak = Str(numer)
            If i > 1 Then
                frak = frak + " / " + Str(i)
            End If
            Exit For
        End If
    End If
Next i
End Function
0

correction pour le deuxième exemple le résultat est 245

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
25 sept. 2023 à 18:16
0
elcopeau Messages postés 15 Date d'inscription samedi 31 août 2013 Statut Membre Dernière intervention 27 septembre 2023
25 sept. 2023 à 19:29

Réponse pour le modérateur.

Cela me fait plaisir que vous me preniez pour un étudiant mais j’ai 63 ans révolus.

J’ai fait une simulation en VBA sur Excel d’un module Transmittance (filtre passe bas d'ordre 1 et dérivée) qui nécessite environ 5000 calculs pour obtenir la courbe du signal de sortie qui donnent, pour la plupart des résultats à virgule. Pour une raison de simplification de l’affichage, je voudrais convertir certains de ces décimaux en nombres fractionnaires (les points remarquables de la courbe).

Si le nombre décimal contient une série périodique qui se répète à l’infini, il faut connaitre cette série pour pouvoir la supprimer et convertir le nombre en fraction. D’où ma question.

J’ai déjà essayé plusieurs solutions qui n’ont pas aboutis et que j’ai effacé. Je demande éventuellement de nouveaux axes de recherche. Mais bien sûr si quelqu’un a une solution toute faite, je suis aussi preneur.

Cordialement

0
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477
Modifié le 25 sept. 2023 à 21:06

bonjour,

étudiant ou pas, il est nécessaire de contribuer soi-même afin de progresser.  Que ce soit un exercice scolaire ou un défi personnel.  Dommage que tu ne décrives pas ce que tu as essayé et effacé, nous aurions pu mieux te guider.

En réalité, il n'est pas possible de convertir ainsi en fraction un nombre dont on ne connait que quelques décimales.  Le concept même de "qui se répète à l’infini" n'a pas de sens quand tu ne connais que quelques décimales.

Par exemple, avec le nombre 0,133333333, on n'a aucune information qui indique ce que seront les décimales suivantes.

Si tu te contentes de chercher une séquence répétitive dans les quelques décimales connues, je suggère de traiter la représentation décimale comme un texte, et de chercher si le groupe des N dernières lettres se répètent (ou épuisent le texte), pour le N le plus petit possible.  Cela te donnera le résultat recherché pour tes 3 exemples.

Exemple avec 3,245245245:

  • tu prends le dernier chiffre, 5 et tu constates qu'il ne se répète pas
  • tu prends les deux derniers chiffres, 45, et ils ne se répètent pas
  • tu prends les trois derniers chiffres, 245, et ils se répètent, c'est ta solution
0
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477 > yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024
25 sept. 2023 à 21:15

le dernier chiffre étant parfois arrondi, je n'en tiendrais pas compte si il est plus grand que 5.

0
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477 > yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024
25 sept. 2023 à 21:37

Si tu "espères" qu'un nombre est une fraction pour pouvoir en simplifier l'affichage, n'est-il pas plus simple de le multiplier par les dénominateurs recherchés, et de vérifier que le produit est presque un entier?

Suivant ce que tu considères comme un dénominateur utile, tu pourrais multiplier par tous les entiers de 2 à 10000, et vérifier si le produit convient comme numérateur.

0

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

Posez votre question
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
25 sept. 2023 à 21:26

Réponse pour le modérateur.

Je ne suis pas modérateur, mais contributeur.

Cela me fait plaisir que vous me preniez pour un étudiant mais j’ai 63 ans révolus

Soit. Cependant, il y a dans cet article des conseils qui peuvent être appliqués quel que soit le cas. Comme par exemple, celui repris par yg_be, de décrire ce que tu as essayé, ça évite de te reproposer la même chose et permet de cerner ton niveau pour adapter notre réponse.


0
elcopeau Messages postés 15 Date d'inscription samedi 31 août 2013 Statut Membre Dernière intervention 27 septembre 2023
25 sept. 2023 à 21:28

Bonsoir 

Merci pour ta réponse

Je suis d'accord avec toi que l'on ne peut pas parler d'infini sur l'afficheur d'une calculatrice, mais je considère que le nombre 0,133333333 donne bien la fraction 2/15.

J'avais bien converti la partie décimale en texte mais je me suis vite emmêler les pinceaux. Par contre l'idée de commencer par la fin est à essayer. je vais voir.

0
Pierr10 Messages postés 11537 Date d'inscription mardi 13 février 2018 Statut Modérateur Dernière intervention 28 avril 2024 4 874
26 sept. 2023 à 00:40

Bonjour

Si j'ai bien compris le but est de mettre un rationnel sous forme de fraction A/B.

On peut faire ça avec une calculatrice scientifique un peu évoluée.

Avec Excel on peut changer le format de cellule en choisissant Fraction. Il vaut mieux travailler sur la partie décimale, pour éviter l'affichage bizarre sous forme d'un entier et d'une fraction.


0
elcopeau Messages postés 15 Date d'inscription samedi 31 août 2013 Statut Membre Dernière intervention 27 septembre 2023
26 sept. 2023 à 06:18

Bonjour,

Oui mais sans calculatrice (je le fais avec ma "Petite fx" pas scientifique et pas évoluée du tout). Je cherche a le faire dans une fonction (algorithme) utilisable dans n'importe quel langage un tant soit peu évolué C#, Visual Basic ou même VBA.

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
Modifié le 26 sept. 2023 à 08:18

Bonjour 

Pour en faire une fraction, pourquoi ne pas multiplier par 10^n / 10^n, n étant le le de décimales et ensuite réduire la fraction?

Par exemple 0.125 = 0.125 * 1000 / 1000 =125 / 1000 = 25 / 200 = 5 / 40 = 1 / 8

Là j'ai détaillé, mais si tu décomposes le numérateur et le dénominateur en produits de facteurs premiers, il te suffit de diviser en haut et en bas ceux qui sont identiques.

125 = 5 * 5 * 5

1000 = 5 * 5 * 5 * 2 * 2 * 2

On divise par  5 * 5 * 5, il reste 1 en haut et 2 * 2 * 2 en bas soit 8


0
elcopeau Messages postés 15 Date d'inscription samedi 31 août 2013 Statut Membre Dernière intervention 27 septembre 2023
27 sept. 2023 à 09:59

Bonjour

Désolé de ne pas avoir pu répondre plu tôt.

yg_be, merci pour ta fonction.

Je n'ai pas eu le temps de regarder comment elle fonctionne, je l'ai juste copier/coller dans Excel pour la tester.

Malgré un petit problème ( pour 0,13333333 elle renvoie ? au lieu 2/15 ) elle a l'air de fonctionner pas mal et elle feras surement une bonne base de réflexion. 

je vais la regarder de près 

0
yg_be Messages postés 22732 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 avril 2024 1 477
27 sept. 2023 à 10:35

Pour 0,13333333 en 2/15, tu peux

  • soit ajouter des chiffres après la virgule: 0.1333333333 donnera le bon résultat
  • soit changer la valeur de 1 / 1000000000# dans le code, pour accepter un résultat moins précis comme fraction: 1 / 10000000#
0
elcopeau Messages postés 15 Date d'inscription samedi 31 août 2013 Statut Membre Dernière intervention 27 septembre 2023
27 sept. 2023 à 18:36

Bonsoir,

Merci beaucoup à yg_be qui m'a apporté une solution 'toute faite' qui fonctionne, et à toutes les personnes qui ont pris le temps de me répondre.

Bonne continuation.

0