Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

Répondre

Veuillez composer votre message et l'envoyer
Nom (obligatoire)

E-mail (obligatoire)

Message (obligatoire)

Programme anti-spam : Afin de lutter contre le spam, nous vous demandons de bien vouloir répondre à la question suivante. Après inscription sur le site, vous n'aurez plus à répondre à ces questions.

Quel est le résultat de l'opération suivante (donner le résultat en chiffres)?
trente et un plus soixante dix-sept
Système anti-bot

Faites glisser le curseur de gauche à droite pour activer le bouton de confirmation.

Attention : Vous devez activer Javascript dans votre navigateur pour utiliser le système anti-bot.

Retour

Résumé de la discussion (messages les plus récents en premier)

renéb
06-08-2024 23:35:46

Bonsoir,

Merci Yoshi; c'est vachement plus joli.

RB

yoshi
06-08-2024 18:39:10

Bonsoir,

Fausse manip : une combinaison de touches m'avait valider mes 3 lignes d'écriture.
J'ai pensé que tu n'allais pas repasser tout de suitez, alors j'ai choisi modifier et je l'ai complété...
Pas de bol, tu étais passé entre temps...

@+

renéb
06-08-2024 18:20:16

Bonjour,

Oui c'est bien ceci:

Faire en sorte que ton code présente mieux

Merci

rb

yoshi
06-08-2024 18:02:24

Bonsoir,

renéb a écrit :

P S :    Comment faire pour que le code soit plus joli.

On peut comprendre ta demande de deux façons.
1. Modifier ton code, pour qu'il ne "gigote pas dans tous les sens".
    Pour cela, il faudrait que je comprenne les idées qui sont derrière l'algorithme que tu as inventé.
    Hélas, ce n'est pas demain la veille : il fait trop chaud pour cela...
2. Faire en sorte que ton code présente mieux (= soit plus joli à regarder à l'écran).
    Ça, en principe, c'est simple et est facile.
Comme ci-dessous ?

i=23     # à partir de
p=3     #période
x,y,sol=[],[],[]
q,f=p,0
rep=0
for Z in range(0,10):  
        z=str(Z*i)
        y.append(int(z))      
        x.append(int(z[-1]))  
R,Sol=[0],[0]
while f<50:  
    r=0
    w=(x.index(q))            
    #print("index",w)  
    sol.insert(0,w)
    #print("sol",sol)
    v=str(y[w])  
    u=list(v)
    u.insert(0,str(0))
    u.insert(0,str(0))
    u.insert(0,str(0))
    R.append(u[-3])
    b=int(u[-2])+int(rep)+int(R[-2])  
    for r in range(p,90+p,10):
        if b<=r :
            rep=int(r/10)
            q=r-b
            break
    f+=1  
L=''
for G in sol:
        L=L+str(G)
L=int(L)
print("solution = ",L)
T=L*i
print("solution *",i,"=", T)
print("--------------------------------------------------")

Ce qui donne :

solution =  5797101449275362318840579710144927536231884057971
solution * 23 = 133333333333333333333333333333333333333333333333333

Si oui, alors dans la barre d'outils des messages, tu pars de la fin et tu comptes 6 icônes : cette 6e icône est <>...
Si tu passes ta souris dessus, l'info-bulle qui apparaît te dit notamment :
Texte préformaté : [ code=langage]texte[ \code]
Donc
1. Tu sélectionnes ton code
2. tu cliques sur la balise code <>
3. Dans la balise de début, après code, tu ajoutes = Python.

C'est tout...
On ne met pas d'espace dans n'importe quelle balise. Pourtant, j'ai écrit ci-dessus :

[ code=langage]texte[ \code]

Je l'ai fait volontairement pour empêcher les balises code de fonctionner, et que tu puisses voir dans les balises dé début et de fin, le mot code...

@+

renéb
06-08-2024 14:59:30

Bonjour,

Curiosité encore:

Y aurait-il une période au multiplicateur que je cherche pour contrôler son produit.après qu’il ai été multiplié par le multiplicande
Autrement dit:
un multiplicande (23) multiplié par un multiplicateur (que je cherche)= un produit composé que, seulement, de 3 (par exemple) ?

Il m’aura fallu pas mal de temps pour traduire en python un algorithme capable de répondre à mes attentes. (Mais, somme toute, ce fut amusant).

Ben oui on remarque une période dans le multiplicateur.

Le voici :

i=23     # à partir de
p=3     #période
x,y,sol=[],[],[]
q,f=p,0
rep=0
for Z in range(0,10):   
        z=str(Z*i)
        y.append(int(z))       
        x.append(int(z[-1]))   
R,Sol=[0],[0]
while f<50:   
    r=0
    w=(x.index(q))             
    #print("index",w)   
    sol.insert(0,w)
    #print("sol",sol)
    v=str(y[w])   
    u=list(v)
    u.insert(0,str(0))
    u.insert(0,str(0))
    u.insert(0,str(0))
    R.append(u[-3])
    b=int(u[-2])+int(rep)+int(R[-2])   
    for r in range(p,90+p,10):
        if b<=r :
            rep=int(r/10)
            q=r-b
            break
    f+=1   
L=''
for G in sol:
        L=L+str(G)
L=int(L)
print("solution = ",L)
T=L*i
print("solution *",i,"=", T)
print("--------------------------------------------------")

Ce qui donne :

solution =  5797101449275362318840579710144927536231884057971
solution * 23 = 133333333333333333333333333333333333333333333333333
--------------------------------------------------

Et on remarque (144927536231884057971)  à partir du premier 0
    144927536231884057971 * 23 =
    3333333333333333333333

renéb

P S :    Comment faire pour que le code soit plus joli.

yoshi
24-07-2024 12:37:19

RE,

Quelques questions:

renéb a écrit :

yoshi a écrit :

    from decimal import Decimal as D, getcontext
    getcontext().prec=104

pourquoi 104?

    fin=96

96 ?
En tous cas divmod(x,y) semble génial.

Diable !  J'avais prévu ces questions et rédigé des réponses, mais je constate que j'ai dû être distrait par autre chose et que je ne les ai pas ajoutées...
Pourquoi 104 ?
J'avais commencé par calculer divmod(623378,33740) et obtenu q= 18, r=16058.
En gros je voulais 100 décimales + le quotient entier de 2 chiffres, ça me donnait 102 chiffres significatifs + le point décimal : longueur 103, j'avais pris 104 pour faire bonne mesure.


j'avais pensé que ça rentrerait sur une ligne, c'était une erreur...
Chez moi, pendant la rédaction, un texte semble tenir sur une ligne, et après validation, surprise, il arrive que 1 ou 2 mots passent en ligne suivante, même si la taille prévue de la fenêtre d'écriture n'est pas fixée par moi.
Cependant avec un écran de 24 pouces, peut-être que les caractères n'ont pas la même largeur (je n'y crois pas).

Pourquoi 96 ? Comme fin de boucle, j'avais choisi 104... Et, surprise, j'avais eu deux affichages, l'un dû à print(D(623378),D(33740)) et l'autre à print(Q)...
Avec fin=104 pour la boucle de divmod, voilà l'affichage :

Comparaison des quotients obtenus avec les 2 méthodes :
1. Avec divmod. et les chaînes
18.5944872554831061055127445168938944872554831061055127445168938944872554831061055127445168938944872554831061055127

2. Avec le module decimal
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

Via divmod, et fin =104, par rapport à Decimal et getcontext().prec=104, j'avais calculé 10 décimales de trop : 1061055127

Nombre de décimales :
len(Q[3:]) = 112.
Je m'étais demandé pourquoi, alors que demandé 104 ?...
Et j'ai pensé Et si c'était à cause des zéros ?
Alors, j'ai inclus le décompte des zéros avec la variable z... Bingo ! z=8...
104+8=112
(je n'ai pas vérifié mon code pour rectifier cette anomalie).
A quoi il fallait ajouter 2 pour le 18 'hors boucle) et le . décimal...
Et en tâtonnant, je suis arrivé à 96.
Or, dans ces décimales de trop figurent 2 zéros supplémentaires. si je veux m'arrêter avant, il n'y aura plus que 6 zéros à décompter me suis-je dit.
Nouvel essai avec fin =98 :

1. Avec divmod. et les chaînes
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483106

Raté ! La boucle ne s'est pas arrêtée assez tôt : z=7 et j'avais encore un zéro de trop...
Alors j'ai tâtonné et je suis arrivé à fin =96...

Tu vois, même si j'ai manié les maths pendant 38 ans, quelquefois, je pense que ça ne vaut pas le coup que je me casse la tête...

Alors, hier soir, j'étais parti pour calculer la fraction d'origine avec la suite décimale périodique illimitée ci-dessous (c'était son nom , jusqu'à ce que cette notion sorte des programmes du Collège).
Donc, hier soir, j'étais parti pour te montrer comment on retrouve la fraction qui a donné naissance au nombre :
x=24,1237237237237237...

Et là, je m'aperçus que le 1 foutait en l'air la méthode que j'avais apprise et à mon tour, enseignée... Donc, prudemment, j'ai fait ma démo à partir de x=24,237237237237237...
Mais, dans mon lit, au lieu de dormir, j'y ai réfléchi un moment : là, ça valait le coup...) et j'ai rapidement trouvé la parade...
La voilà:
Soit $n=10x=241,237237237237237..$.
$1000n =241237,237237237237237...$
$1000n-n=999n =241237-241=240996
et :
$n =\dfrac{240996}{999}$
Or, $ n=10x$, donc $x=\dfrac{n}{10} =\dfrac{240996}{9990}$
Fraction que je simplifie :
$x=\dfrac{40166}{}$
Vérification :


from decimal import Decimal as D, getcontext
getcontext().prec=52

print( D(40166)/D(1665))

 

Résultat :
24.12372372372372372372372372372372372372372372372372

N-B : la méthode avec divmod n'est rien d'autre que l'écriture informatique de la division de 627378 par 33740 comme la feraient "à la main  ceux qui n'auraient pas oublié...

Savais-tu que du temps où le Collège n'existait pas, dans le programme de 4e au Lycée, on apprenait à calculer une racine carrée "à la main" (Ah, oui, précision : les calculatrices n'existaient pas encore).
Au passage je me suis amusé à la traduire en Python, c'est bien moins rapide que la méthode de Heron d'Alexandrie , mais ça marche bien...               

@+

[EDIT]
Rien à avoir, mais tu vas aimer...
nom=["R","E","N","E","B"]
Et à l'envers :
print (nom[::-1])
donne :
['B', 'E', 'N', 'E', 'R'].

Ca marche aussi avec les Chaînes :
C="ESOPE RESTE ICI ET SE REPOSE"
print(C[::-1]) :
'ESOPER ES TE ICI ETSER EPOSE'

Autre chose encore :
nom=["R","E","N","E","B"]
print(nom.index("N")) renvoie 2.
Les chaînes et listes commencent leur numérotation à 0 :

Liste : ["R","E","N","E","B"]
index :  0    1    2    3   4

Donc nom[4] --> 'B' même si c'est la 5e lettre.
Tu peux l'obtenir sans connaître son index :
print(nom[-1])-->

index c'est pour les listes, le mot-clé correspondant pour les chaines est find :
prenom = "ARTHUR"
print(prenom.find("H")) renvoie 3.
et si tu demandes print(prenom[3]), tu obtiens bien 'H'

Tu n'as pas besoin de numéros pour parcourir une liste (ou une chaîne) ni leur longueur :
for lettre in nom:
    print (lettre, end=" ")
te donne :
R E N E B

for lettre in prenom:
    print (lettre, end="    ")
te donne :
A    R    T    H    U    R

Tu peux avoir les deux numéros et éléments :
Nom=['J', 'e', 'a', 'n', '-', 'B', 'a', 'p', 't', 'i', 's', 't', 'e']
for i, lt in enumerate(Nom):
    print(i, lt)
donne :
0 J
1 e
2 a
3 n
4 -
5 B
6 a
7 p
8 t
9 i
10 s
11 t
12 e

A suivre...

renéb
23-07-2024 22:18:59

re',
Quelques questions:

yoshi a écrit :

from decimal import Decimal as D, getcontext
getcontext().prec=104

pourquoi 104?

fin=96

96 ?
En tous cas divmod(x,y) semble génial.

rb

renéb
23-07-2024 22:09:51

bonsoir,

Tu trouves plusieurs périodes ?...

non pas plusieurs périodes mais bien leurs points d'amorce qui peut être au nombre d'éléments de la période.
L'amorce peut se faire à partir de n'importe quelle décimale pour autant qu'elle soit suffisamment éloignée  de la partie entière de la fraction.

La fin d'une période est suivie immédiatement de la même : elles s'enchaînent sans espaces, c'est la définition de la période...

C'est bien ce qui est indiquer dans "recouvrement de la série" de l'exemple ci-dessus.

A bientôt
rb

yoshi
23-07-2024 21:22:43

Bonsoir,

Tu trouves plusieurs périodes ?...
Impossible...
La fin d'une période est suivie immédiatement de la même : elles s'enchaînent sans espaces, c'est la définition de la période...
Voilà ce que je veux dire soit la période 237 d. voilà un exemple de ce que ça peut donner
24,237237237237237...
Je vais rechercher la fraction qui lui donne naissance
$x=24,237237237237237...$
$1000x =24237,237237237237237...$
$999x = 24237-24 =24213$
La fraction est donc $\dfrac{24213}{999}$


from decimal import Decimal as D, getcontext
getcontext().prec=90
 
print(D(24213)/D(999))

renvoie :
24.2372372372372372372372372372372372372372372372372372372372372372372372372372372372372372

@+

renéb
23-07-2024 20:02:27

bonsoir,

J'ai fait tourner la fraction de l'exemple poste  #3 à savoir:


avec le code suivant:

   
##n=input()
##m=input()
n=313689
m=16670
print("fraction:",n," / ",m)
print()
v,w=0,0
num=float(n)
dnom=float(m)
a=list(str(n))
b=list(str(m))
if"." in a:
    v=len(a[a.index("."):])-1
if"." in b:
    w=len(b[b.index("."):])-1  
max=(max(v,w))
num*=10**int(max)
dnom*=10**int(max)
##num=int(num)
##dnom=int(dnom)
print("num",num," / ",dnom,"dnom")
print("num/dnom = ",num/dnom)
sol=[]
v,r=0,0
while v<20000: #############  nbre de décimales voulues ##########################  
    i=0
    while num>dnom:
        i+=1
        num=num-dnom
    sol.append(int(i))
    num=num*10
    v+=1
print("sol",sol)
print()
#######  début de la période   #########
inf,sup=[],[]
l=len(sol)
n,p,j,t=1,6,0,30
#### t : espace pour les premières décimales ne rentrant pas dans la période.
#### n=1 pour décaler la première recherche d'égalité.
#### p=largeur de la palette de recherche.
while n<l:
    inf=sol[r+t:r+t+p]
    sup=sol[r+n+t:r+n+t+p]
    if sup==inf:
        print("une période = ",sol[r+t:r+t+10],"...  ...",sol[r+n+t-10:r+n+t])
        print()
        break          
    n+=1
while sol[r+t-j]==sol[r+t+n-j]:
    j+=1
print("premiére période ",sol[r+t-j+1:n+r+t-j+1])
print("elle commence à la ",r+t-j+1,"ième position)")
print("d'une longueur de ",len(sol[r+t-j+1:n+r+t-j+1]),"chiffres")
q=(sol[n-5:n+r+t-j+9])
print("recouvrement de la série:",q)
 

Long code quand même...
comment le rendre plus joli?

Je souhaite naviguer dans le résultat ; il y a des outils qui existent mais je ne les connais et ne les métrise pas trop bien.
( index, pop, keys, items, ...)

Mais je vais me pencher plus avant sur toutes les interventions que vous avez daigner poster.

En vous remerciant, à bientôt.

rb


num,dnom=627378,33340
et je trouve les mêmes résultats ( ouf ! )

fraction: 313689  /  16670

num 313689.0  /  16670.0 dnom
num/dnom =  18.81757648470306

sol:  Squeezed text (751 lines)

une période =  [5, 0, 2, 0, 9, 9, 5, 8, 0, 0...  ... 2, 2, 3, 7, 5, 5, 2, 4, 8, 9]

premiére période  [1, 7, 5, 7, 6, 4, 8, 4, 7, 0, 3, 0, 5, 9, 3, 8, 8, 1, 2, 2, 3, 7, 5, 5, 2, 4, 8, 9, 5, 0, 2, 0, 9, 9, 5, 8, 0, 0, 8, 3, 9, 8, 3, 2, 0, 3, 3, 5, 9, 3, 2, 8, 1, 3, 4, 3, 7, 3, 1, 2, 5, 3, 7, 4, 9, 2, 5, 0, 1, 4, 9, 9, 7, 0, 0, 0, 5, 9, 9, 8, 8, 0, 0, 2, 3, 9, 9, 5, 2, 0, 0, 9, 5, 9, 8, 0, 8, 0, 3, 8, 3, 9, 2, 3, 2, 1, 5, 3, 5, 6, 9, 2, 8, 6, 1, 4, 2, 7, 7, 1, 4, 4, 5, 7, 1, 0, 8, 5, 7, 8, 2, 8, 4, 3, 4, 3, 1, 3, 1, 3, 7, 3, 7, 2, 5, 2, 5, 4, 9, 4, 9, 0, 1, 0, 1, 9, 7, 9, 6, 0, 4, 0, 7, 9, 1, 8, 4, 1, 6, 3, 1, 6, 7, 3, 6, 6, 5, 2, 6, 6, 9, 4, 6, 6, 1, 0, 6, 7, 7, 8, 6, 4, 4, 2, 7, 1, 1, 4, 5, 7, 7, 0, 8, 4, 5, 8, 3, 0, 8, 3, 3, 8, 3, 3, 2, 3, 3, 3, 5, 3, 3, 2, 9, 3, 3, 4, 1, 3, 3, 1, 7, 3, 3, 6, 5, 3, 2, 6, 9, 3, 4, 6, 1, 3, 0, 7, 7, 3, 8, 4, 5, 2, 3, 0, 9, 5, 3, 8, 0, 9, 2, 3, 8, 1, 5, 2, 3, 6, 9, 5, 2, 6, 0, 9, 4, 7, 8, 1, 0, 4, 3, 7, 9, 1, 2, 4, 1, 7, 5, 1, 6, 4, 9, 6, 7, 0, 0, 6, 5, 9, 8, 6, 8, 0, 2, 6, 3, 9, 4, 7, 2, 1, 0, 5, 5, 7, 8, 8, 8, 4, 2, 2, 3, 1, 5, 5, 3, 6, 8, 9, 2, 6, 2, 1, 4, 7, 5, 7, 0, 4, 8, 5, 9, 0, 2, 8, 1, 9, 4, 3, 6, 1, 1, 2, 7, 7, 7, 4, 4, 4, 5, 1, 1, 0, 9, 7, 7, 8, 0, 4, 4, 3, 9, 1, 1, 2, 1, 7, 7, 5, 6, 4, 4, 8, 7, 1, 0, 2, 5, 7, 9, 4, 8, 4, 1, 0, 3, 1, 7, 9, 3, 6, 4, 1, 2, 7, 1, 7, 4, 5, 6, 5, 0, 8, 6, 9, 8, 2, 6, 0, 3, 4, 7, 9, 3, 0, 4, 1, 3, 9, 1, 7, 2, 1, 6, 5, 5, 6, 6, 8, 8, 6, 6, 2, 2, 6, 7, 5, 4, 6, 4, 9, 0, 7, 0, 1, 8, 5, 9, 6, 2, 8, 0, 7, 4, 3, 8, 5, 1, 2, 2, 9, 7, 5, 4, 0, 4, 9, 1, 9, 0, 1, 6, 1, 9, 6, 7, 6, 0, 6, 4, 7, 8, 7, 0, 4, 2, 5, 9, 1, 4, 8, 1, 7, 0, 3, 6, 5, 9, 2, 6, 8, 1, 4, 6, 3, 7, 0, 7, 2, 5, 8, 5, 4, 8, 2, 9, 0, 3, 4, 1, 9, 3, 1, 6, 1, 3, 6, 7, 7, 2, 6, 4, 5, 4, 7, 0, 9, 0, 5, 8, 1, 8, 8, 3, 6, 2, 3, 2, 7, 5, 3, 4, 4, 9, 3, 1, 0, 1, 3, 7, 9, 7, 2, 4, 0, 5, 5, 1, 8, 8, 9, 6, 2, 2, 0, 7, 5, 5, 8, 4, 8, 8, 3, 0, 2, 3, 3, 9, 5, 3, 2, 0, 9, 3, 5, 8, 1, 2, 8, 3, 7, 4, 3, 2, 5, 1, 3, 4, 9, 7, 3, 0, 0, 5, 3, 9, 8, 9, 2, 0, 2, 1, 5, 9, 5, 6, 8, 0, 8, 6, 3, 8, 2, 7, 2, 3, 4, 5, 5, 3, 0, 8, 9, 3, 8, 2, 1, 2, 3, 5, 7, 5, 2, 8, 4, 9, 4, 3, 0, 1, 1, 3, 9, 7, 7, 2, 0, 4, 5, 5, 9, 0, 8, 8, 1, 8, 2, 3, 6, 3, 5, 2, 7, 2, 9, 4, 5, 4, 1, 0, 9, 1, 7, 8, 1, 6, 4, 3, 6, 7, 1, 2, 6, 5, 7, 4, 6, 8, 5, 0, 6, 2, 9, 8, 7, 4, 0, 2, 5, 1, 9, 4, 9, 6, 1, 0, 0, 7, 7, 9, 8, 4, 4, 0, 3, 1, 1, 9, 3, 7, 6, 1, 2, 4, 7, 7, 5, 0, 4, 4, 9, 9, 1, 0, 0, 1, 7, 9, 9, 6, 4, 0, 0, 7, 1, 9, 8, 5, 6, 0, 2, 8, 7, 9, 4, 2, 4, 1, 1, 5, 1, 7, 6, 9, 6, 4, 6, 0, 7, 0, 7, 8, 5, 8, 4, 2, 8, 3, 1, 4, 3, 3, 7, 1, 3, 2, 5, 7, 3, 4, 8, 5, 3, 0, 2, 9, 3, 9, 4, 1, 2, 1]
elle commence à la  2 ième position)
d'une longueur de  833 chiffres
recouvrement de la série: [... 9, 3, 9, 4, 1, 2, 1, 1, 7, 5, 7, 6, 4, 8, 4,...]

yoshi
23-07-2024 13:15:30

Re,

ok...
Mais l'utilisation basique que je fais de la classes Decimal du module decimal est suffisante pour obtenir des nombres décimaux avec un nombre de chiffres décimaux exacts considérable...
Dans mon post #3, les 3360 chiffres significatifs demandés sont une "broutille" en regard de ce qu'on peut faire en théorie avec assez de RAM :
     32 bits                   64 bits
425 000 000      99 999 999 999 9999 999


Dans mon système avec divmod, je procède comme pour une division à la main (comme je l'avais apprise, il y a longtemps en primaire)
sauf que je démarre après le quotient de 18


627378                       | 33740      
289978                       | 18.594...
 200580                      |
  318800                     |
   151400                    |
    16440
    (...)

Le premier reste est alors de 20058, à la main, on abaisse un zéro, ce qui revient à multiplier ce reste par 10 d'où le zéro bleu en fin de reste...
Mais je dois prévoir le cas où multiplier ce reste par 10 ne suffit pas, alors j'ajoute str(0)  soit "0" au quotient chaîne, et je remultiplie ce reste à nouveau par 10, etc...

Quant à ma variable z, elle compte le nombre de zéros du quotient : 6...
Ma boucle for produit :
96 décimales + 6 zéros = 102 chiffres
Le quotient commence en outre par 18.
J'ai donc 104 chiffres, ce qui colle avec le getcontext().prec=104.
En constatant que les 2 quotients n'avaient par la même longueur, je me suis douté que le "problème" venait des zéros, j'ai donc ajouté le "mouchard" z pour vérifier et ainsi, j'ai pu ensuite réduire la valeur de fin de boucle...
Après quoi la vérification chiffre à chiffre ne comprenait plus d'éléments "parasites"...

Bon, c'était marrant à faire, mais pas trop évident à mettre au point... Je n'en ai pas été choqué, ayant été biberonné depuis mes débuts à l'aphorisme : "un script informatique ne marche toujours pas du premier coup !".
D'ailleurs, il n'est pas exclu que je remplace la boucle for par une boucle while....

Je préfère de loin ne pas me fatiguer et importer la classe Decimal du module decimal en début de script :


from decimal import Decimal as D, getcontext
getcontext().prec=104

Je dois me rappeler de ne pas mélanger entier et Decimal, Decimal et flottant, c'est tout. Après quoi, j'utilise normalement les opérations...
Le D est un alias que j'ai choisi, il m'évite d'avoir à écrire Decimal() en entier : quand je disais que je ne voulais pas me fatiguer... ^_^
Avec la méthode de Heron d'Alexandrie, et en utilisant la classe Decimal du module decimal et en demandant 20000 chiffres significatifs, je calcule la valeur du nombre d'or :
* en 0,59 s
* avec seulement 14 itérations
L'affichage du nombre ne se fait pas, il prendrait trop de temps et de place : 201 lignes...

@+

renéb
22-07-2024 23:41:30

Bonsoir,

j'en conclus que tu ne veux rien savoir de ce module decimal...

Que nenni. j'ai tant à apprendre.
L'efficacité du recourt à l'"image" me plait et ne va pas m'empêcher d'essayer de comprendre et de réfléchir à ce que vous me proposez.

DrStone
22-07-2024 22:43:37

Bonsoir.

Une autre manière de procéder et d'utiliser une variable epsilon "très" petite afin de vérifier si la différence est suffisamment proche de $0$. Si c'est le cas, on peut alors supposer que les deux nombres sont égaux.
Par exemple, dans le cas de la vérification $0,1+0,2=0,3$, on peut réaliser cela par


>>> eps=1e-9
>>> a=0.1+0.2 # 0.30000000000000004
>>> b=0.3     # 0.3
>>> abs(a-b)<eps
True
 

C'est peu ou prou ce qui est utilisé par python avec la fonction math.isclose dont on peut voir l'implémentation en C ici : https://github.com/python/cpython/blob/ … le.c#L3152.

yoshi
22-07-2024 21:00:59

Bonsoir,

DrStone a raison, c'est une "curiosité" à connaître : un certain nombre de personnes venant sur le forum s'était alarmé de ce phénomène pensant que Python calculait faux...
Le module decimal permet avec précautions de contourner le problème...
Mais, puisque tu as écrit :

Pour ce qui est de chasser les  décimales de la fraction, je passe par l'analyse de son "image"  afin de déterminer le nombre de fois qu'il faudra multiplier le numérateur et le dénominateur.
par 10.
Simple et infaillible.

j'en conclus que tu ne veux rien savoir de ce module decimal...

Je te propose alors une autre façon de chasser les décimales de la fraction.
Connais-tu l'instruction divmod ?
Sa syntaxe est


q,r = divmod(125,13)
print("le quotient est",q,"et le reste",r)
 

qui renvoie :

le quotient est 9 et le reste 8

En effet, 13*9+8 =125...

J'ai donc écrit le programme suivant :


from decimal import Decimal as D, getcontext
getcontext().prec=104

z=0
num,dnom=627378,33740
q,r=divmod(num,dnom)
Q=str(q)+"."
fin=96
for i in range(fin):
    num=r*10  
    while num<dnom:
        Q+="0"
        num*=10
        z+=1
    q,r=divmod(num,dnom)
    Q+=str(q)
         
print("Comparaison des quotients obtenus avec les 2 méthodes :")
print("1. avec divmod. et les chaînes")
print(Q)
print("2. Avec le module decimal")
print(D(627378)/D(33740))
print()
print("Recherche si la chaîne T= 7255 est comprise dans la chaîne Q :")
T="7255"
print (T in Q)
 

Je n'ai utilisé aucun nombre décimal, le quotient Q est une chaîne de caractères.
Et pour la recherche de la période, je n'ai pas besoin de décimaux.
Je n'ai toujours pas réfléchi à ta méthode de recherche, mais lorsque j'aurai pris le temps de chercher, je suis sûr que je pourrai me passer de nombres décimaux, même avec 2024 caractères après le ".",comme testé en fin de code...
Si la réponse avait été négative, la ligne print(T in Q) aurait renvoyé False

Le code ci-dessus renvoie :

Comparaison des quotients obtenus avec les 2 méthodes :
1. Avec divmod. et les chaînes
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

2. Avec le module decimal
18.594487255483106105512744516893894487255483106105512744516893894487255483106105512744516893894487255483

Recherche si la chaîne T = 7255 est comprise dans la chaîne Q :
True

@+

[EDIT]
Sur ce site, une discussion à propos du phénomène signalé par DrStone et qui te trouble :
https://www.bibmath.net/forums/viewtopi … 864#p92864

DrStone
22-07-2024 19:08:19

Bonsoir.

renéb a écrit :

bonsoir,
n=25.9   
m=n-intn)
print(m)

m=   0.8999999999999986

et pas m = 0.9

Ceci est dû à la manière même dont les nombres flottants (a.k.a. nombres "réels") sont gérés au niveau binaire par un ordinateur. Je vous invite à chercher «pourquoi 0.1+0.2=0.30000000000000004 ?».

Pied de page des forums