IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

La racine carrée du nombre

Ce code présente une racine carrée à l'aide du module decimal

C'est aussi un moyen de découvrir comment se fait cette opération...

""" Cette fonction produit la racine carrée du nombre, et
elle commence par définir la partie entière de la racine².
Qui en général a une virgule flottante ( point décimal )
"""

# Nombre à forme décimale
""" Une décimale au format texte a un meilleur suivi
Tests:"""
# :nombre = Decimal('22135323.12554'):
# imageoo2 = 22135323.125540000000000000000000000000000000...
#...00000000000000000000000000000000000000000000000000000000
# :nombre = Decimal(22135323.12554):
# imageoo2 = 22135323.125539999455213546752929687500000000...
#...00000000000000000000000000000000000000000000000000000000

"""Le nombre_carre utilise le module decimal...
La racine carrée réelle a forme générique
Pour les opérations et les comparaisons
Le traité se porte sur le nombre (ex:13.25)
Les nombres négatifs en string dans le code
Au vu du capable complexe de nombre_carre..."""
***
Précision décimale aidant le nombre calculé
La racine carrée réelle de : 3**2
ou bien de : (42-32)**-2
Prémice de nouvelles formes opératoires
Autorités en terme général tant que logiques...?
Avatar de forum
Robot Forum https://www.developpez.com
Le 17/03/2018 à 19:31
Bonjour,

Je vous propose un nouvel élément à utiliser : La racine carrée du nombre

Ce code présente une racine carrée à l'aide du module decimal

C'est aussi un moyen de découvrir comment se fait cette opération...

Qu'en pensez-vous ?
Avatar de tyrtamos
Expert éminent https://www.developpez.com
Le 17/03/2018 à 21:51
Bonjour,

Selon l'objectif de ce code, voir aussi la méthode de Heron d'Alexandrie qui est très efficace, bien qu'elle ait 2000 ans...: https://fr.wikipedia.org/wiki/M%C3%A9thode_de_H%C3%A9ron.
Avatar de
https://www.developpez.com
Le 21/03/2018 à 20:05
Bonjour

Ce programme recherche la racine carrée du nombre de son côté décimal, à partir de la racine entière il va par dizaines incrémentées trouver leurs points de rupture. Ainsi : Décimale = (0.01) est incrémentée = {(0.02), (0.03), (0.04)...}. Si quand elle parvient à (0.05), et que la racine entière à laquelle est ajouté la partie décimale. Ainsi : racine = 33.05, si racine**2 est supérieure à nombre. C'est que sa part décimale a trouvée son point de rupture.

Ensuite, puisque ce n'est pas terminé. On ajoute une dizaine supplémentaire, ainsi : (0.041) a une chance de rencontrer sa rupture par incrémentation. Comme on peut le comprendre, c'est la partie décimale qui est en cours du traitement principal. Un travail de grammage sur les nombres, sans apport géométrique.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# Nombre au carré << nombre2carrex.py >>

from decimal import *

def nombre_carre(nbr):
    """ Cette fonction produit la racine carrée du nombre, et
    elle commence par définir la partie entière de la racine².
    Qui en général a une virgule  flottante ( point  décimal )
    """
    # Racine² décimale entière
    wh = int(nbr ** Decimal('.5'))
    # Plus de précision peut être désapointant
    getcontext().prec = 100  # max = 100000000
    # Secteur décimal
    decitab = []
    recital = 0
    copieur = [0]
    entiere = wh
    print('entiere =', entiere)
    www = top = i9 = 0
    while (Decimal(image[0]) ** 2) < nbr and top == 0:
        iii = 0
        # print('WWW ', recital[0])
        for i in range(1, 10):
            if i == 1:
                print('i1', i, '...WFIimage', image[0])
                print('...WFIrecital', recital)
            if decitab:
                image[0] = (str(entiere) + '.' + recital + str(i))
                if iii < 2:
                    print('iii', i, '...FIIimage =', image[0])
                    iii += 1
            else:
                image[0] = (str(entiere) + '.' + str(i))
                print(www, 'IEimage =', image[0])
            if Decimal(image[0]) ** 2 > nbr:
                decitab.append(i - 1)
                recital = (''.join(str(d) for d in decitab))
                print('i', i, 'Isuprecital =', recital)
                image[0] = (str(entiere) + '.' + recital)
                print(www, 'Isupimage =', image[0])
                if Decimal(image[0]) ** 2 == nbr:  # 1 Valide
                    rondeur[0] = 'Juste racine²'
                    top = 1
                    break
                break
            elif i == 9:
                # i9 = 9**1
                i9 += 1
                # 9658754876325698546785421556487982 Valide
                if i9 > 100:
                    top = 1
                    print('___i', i, '___OK i9', i9)
                if Decimal(image[0]) ** 2 == nbr:
                    rondeur[0] = 'Juste racine²'
                    top = 1
                    break
                decitab.append(i)
                recital = (''.join(str(d) for d in decitab))
                image[0] = Decimal(str(entiere) + '.' + recital)
                # image[0] = Decimal(float(image[0]))
                print(www, 'ELimage =', (image[0]), 'i9', i9)
                print('i9', i, 'ELrecital =', recital)
            elif Decimal(image[0]) ** 2 == nbr:
                rondeur[0] = 'Juste racine²'
                top = 1
                break
        print('* * * Bimage =', image[0])
        print('* * * * * * * recital[0]', recital)
        www += 1
        # break
    else:
        print('Eimage  =', (image[0]), '______')
        # Contrôle des dizaines
        wer = .1
        while Decimal(image[0]) ** 2 > nbr:
            mer = str(wer)[2:]
            copieur[0] = Decimal(str(entiere) + '.' + recital + mer)
            print('EEE ', copieur[0], 'mer', mer, 'len', len(mer))
            print('.EE ', Decimal(copieur[0]) ** 2, wer)
            print('')
            wer /= 10
            if len(str(wer)) > 5:
                break
        if not nbr:
            rondeur[0] = 1
        print('REELrecite =', recital, len(str(recital)))
        print('REELnombre =', nbr, '; type =', nbr % 6, len(str(nbr)))
        print('REELracine =', nbr ** .5, len(str(nbr ** .5)))

nombre = 56325468791546857  # 96587548785421556487982
print('nombre =', nombre)
image = {0: 0}
rondeur = {}
nombre_carre(nombre)
print('image =', image[0], '\nimageoo2 =', (Decimal(image[0]) ** 2))
if rondeur:
    print('Rondeur :', rondeur[0])
else:
    rondeur[0] = 'Valeur intervalle'
    print('Rondeur :', rondeur[0],
          '\n', nombre - (Decimal(image[0]) ** 2))
Avatar de
https://www.developpez.com
Le 03/04/2018 à 21:11
Satisfait de ce bout de chemin réalisé avec le nombre, et plus particulièrement sa racine carrée.
Le mode de lecture basique ne suffisait pas à résoudre le problème de clarté des opérations, alors après maintes et maintes virevoltes au milieu des décimales.
Décimales écosystématiques, redondance visible lorsqu'elles s'occupent des floats. Le monde décimal a besoin d'une technique de déchiffrage qui me dépasse, heureusement le calcul élémentaire a eu finalement raison.
Maintenant les choses sont plus claires, et la racine carrée est liée a ce petit programme fort simple. Dont le rendu n'est pas compliqué...

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# Nombre au carré << nombre6carrea.py >>

from decimal import *

def resume():
    print("""Le nombre_carre utilise le module decimal...
    La racine carrée réelle a forme générique
    Pour les opérations et les comparaisons
    Le traité se porte sur le nombre (ex:13.25)
    Les nombres négatifs en string dans le code
    Au vu du capable complexe de nombre_carre...""")

def nombre_carre(nbr):
    """ Cette fonction produit la racine carrée du nombre, et
    elle commence par définir la partie entière de la racine².
    Qui en général a une virgule  flottante ( point  décimal )
    """
    nbr = Decimal(nbr)
    if nbr < -0:
        nbr = Decimal(str(nbr)[1:])
        rondeur[1] = 1
    # Précision.Allusion.Illusion.
    """ Modulation unaire"""
    if len(str(nbr)) < 10:
        precision = (len(str(nbr)) + 1) * 10
        precisive = '(*10)'
    elif 10 <= len(str(nbr)) < 50:
        precision = int(len(str(nbr)) ** 1.75)
        precisive = '(**1.75)'
    elif 50 <= len(str(nbr)) < 100:
        precision = int(len(str(nbr)) ** 1.5)
        precisive = '(**1.5)'
    else:
        precision = int(len(str(nbr)) ** 1.125)
        precisive = '(**1.125)'
    getcontext().prec = precision
    # Maximum(machine locale) = 100000000
    # Racine² décimale entière
    wh = int(nbr ** Decimal(.5))
    wh0 = (nbr ** Decimal(.5))
    nbu = nbr
    # Secteur décimal
    decitab = []
    if rondeur[1] == 1:
        entiere[0] = str('-' + str(wh))
    else:
        entiere[0] = str(wh)
    print('entiere =', entiere[0])
    www = nbrdec = top = 0
    while image[0] ** 2 < nbr and top == 0:
        for i in range(1, 10):
            if decitab:
                image[0] = Decimal(entiere[0] + '.' + recital[0] + str(i))
            else:
                image[0] = Decimal(entiere[0] + '.' + str(i))
                nbrdec += 1  # Nombre de décimales
    
            if image[0] ** 2 > nbr:
                decitab.append(i - 1)
                nbrdec += 1  # Nombre de décimales
                recital[0] = (''.join(str(d) for d in decitab))
                image[0] = Decimal(entiere[0] + '.' + recital[0])
                if image[0] ** 2 == nbr:
                    rondeur[0] = 'Juste racine² | nbr |'
                    top = 1
                    break
                break
            elif i == 9:
                if image[0] ** 2 == nbr:
                    rondeur[0] = 'Juste racine² | i9 |'
                    top = 1
                    break
                decitab.append(i)
                nbrdec += 1  # Nombre de décimales
                recital[0] = (''.join(str(d) for d in decitab))
                image[0] = Decimal(entiere[0] + '.' + recital[0])
            elif image[0] ** 2 == nbr:
                rondeur[0] = 'Juste racine² | elif |'
                top = 1
                break
        # print(www, '°°° **2 =', image[0] ** 2)
        www += 1
    else:
        if len(str(rondeur[0])) < 1:
            rondeur[2] = 'Variant racine² | not |'
        nb6 = Decimal('6')
        if rondeur[1] == 1:
            nbr = Decimal('-' + str(nbr))
            wh0 = Decimal('-' + str(wh0))
            nb6 = Decimal('-' + '6')
        sq0 = wh0
        print('Rnombre =', nbr, ';type =', nbr % nb6)
        if sq0 ** 2 == nbu:
            print('_Reelle_juste =', sq0)
        else:
            print('_Rracine =', sq0)
        print(',... (', nbrdec, ') Precision', precision, precisive)

# Nombre à forme décimale
""" Une décimale au format texte a un meilleur suivi """
# :nombre = '22135323.12554':
#  imageoo2 = 22135323.125540000000000000000000000000000000...
# ...00000000000000000000000000000000000000000000000000000000
# :nombre = 22135323.12554:
#  imageoo2 = 22135323.125539999455213546752929687500000000...
# ...00000000000000000000000000000000000000000000000000000000
"""."""
nombre = 1  # Permission math [-0 exclu]
nombre = str(Decimal(nombre))
image = {0: 0}
rondeur = {0: '', 1: 0}
entiere = {0: ''}
recital = [0]
nombre_carre(nombre)  # Appel principal
if recital[0] != 0:
    recital[0] = str(image[0])[len(entiere[0]) + 1:]
print('Rrecital =', recital[0])
oo2 = image[0] ** 2
if rondeur[1] == 1:
    oo2 = Decimal('-' + str(oo2))
print('Iimageoo1 =', image[0],
      '\nIimageoo2 =', oo2)
if rondeur[0]:
    print('Rondeur 0:', rondeur[0])
elif rondeur[2]:
    print('Rondeur 2:', rondeur[2], '\nReste =',
          Decimal(nombre) - ((image[0]) ** 2))
else:
    rondeur[0] = 'Valeur intervalle'
    print('Rondeur 0:', rondeur[0], '\nReste =',
          Decimal(nombre) - ((image[0]) ** 2))
print('.*')
resume()
#
Avatar de
https://www.developpez.com
Le 07/04/2018 à 20:43
Je viens de mettre à jour l'en cours, en simplifiant la saisie du nombre. Se faisant en format texte directement.
La définition du typage (%6) se porte non plus seulement sur le nombre entier, mais également sur sa partie décimale.
Les nombres 23154. et 23154.0 sont admis et modifiés. Car dans le résultat (23154,23154.,23154.0) sont inégaux.
:
Avatar de
https://www.developpez.com
Le 08/04/2018 à 13:31
Code : Sélectionner tout
# Séparation décimale pour typage(%6)
La séparation décimale est une argumentation qui a un double tranchant lorsqu'il s'agit de relever le type(reste(n%6)) d'un nombre réel, où le point décimal crée la limite entre la partie entière du nombre réel et sa part décimale. La démarche a commencée quand le nombre réel avait pour partie visible décimale, l'image exacte de celle du nombre réel. D'où la poursuite en mode séparé, un type(%6) spécifique à chacune.
Code : Sélectionner tout
decim6 = 6 # Type 6: Supérieur à *(_TTG_)*
Ce pourquoi la valeur par défaut qui ne sera jamais atteinte par un typage(%6) sur le nombre.
Code : Sélectionner tout
# Recherche du point décimal
La recherche du point décimal facilite un prochain calcul, au sujet de la proportion relative à la partie entière du nombre réel.
Code : Sélectionner tout
# Mesure.Decimale
La mesure décimale prend en charge l'opération des typages aux mentions (Entier.Décimal).
Juste avant
Code : Sélectionner tout
nombre_carre(nombre) # Appel principal
Ce qui est à venir, va permettre de calculer aux normes du module decimal (espoir content)
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"""."""
nombre = '4'
# Séparation décimale pour typage(%6)
# *(_TableTypeGénéral = [0,1,2,3,4,5]_)*
decim6 = 6  # Type 6: Supérieur à *(_TTG_)*
# Recherche du point décimal
for i in nombre:
    if i == '.':
        nentie = len(str(int(float(nombre))))  # Poids.Entier.fort
        break
else:
    # Nombre.Entier
    nentie = len(str(int(nombre)))  # Poids.Entier.faible
nmasse = len(nombre)  # Masse.Nombre
nmedif = nmasse - nentie  # Mesure.Decimale 
ndecim = nombre[nentie + 1:]  # Masse.Decimale
""" Nombre réel aux poids(types): Entier.Decimal"""
# Mesure.Decimale
if nmedif != 0:
    fnd = 0
    for nd in ndecim:
        fnd += int(nd)  # Addition ndecim(nd)
        if fnd != 0:    # Somme positive
            break       # Nombre.Décimal
    if fnd == 0 or nombre[-1] == '.':
        # Nombre.Entier
        nombre = nombre[:nentie]
    else:
        decim6 = int(nombre[nentie + 1:]) % 6
        # Condition nombre négatif
        if nombre[0] == '-':
            decim6 = int(str('-' + str(decim6)))
image = {0: 0}
rondeur = {0: '', 1: 0}
entiere = {0: ''}
recital = [0]
nombre_carre(nombre)  # Appel principal
Avatar de
https://www.developpez.com
Le 10/04/2018 à 20:38
Pour un nombre x = nombre = '652315487.23265487'
Pour un appel (dec) ou "
L'algorithme de Héron d'Alexandrie
" SANS GUILLEMETS
Code : Sélectionner tout
1
2
3
4
>>> Decimal(dec)**2
Decimal('652315487.2326549291610717773437499999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999')
>>> Decimal(_Reelle_juste)**2
Decimal('652315487.2326548700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000')
Pour un appel (
_Reelle_juste
) ou "
L'algorithme de Python"
Ou,
L'algorithme de Héron d'Alexandrie
" AVEC GUILLEMETS

Avatar de
https://www.developpez.com
Le 17/04/2018 à 21:03
En revenant sur le code qui m'intéresse, c'est en essayant plusieurs combinaisons opératoires, que je me suis aperçu d'un manque contextuel "Decimal".
Puisqu'à ce moment du programme le contexte décimal n'est pas encore évalué par le code, donc en ayant ajouté un contexte.
Le nombre calculé a pris une autre dimension, ainsi que la suite opérationnelle qui suit, et un nouveau résultat...

Portion de l'opération sur laquelle était nécessaire un apport contextuel :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def opera(nop):
    """Fonction opératoire"""
    def addition(i, j):
        return i + j
    def soustraction(i, j):
        return i - j
    def multiplie(i, j):
        return i * j
    def expose(i, j):
        return i ** j
    def division(i, j):
        return i / j
    def diventier(i, j):
        return i // j
    def modulo(i, j):
        return i % j
    signe = {'+': addition, '-': soustraction, '*': multiplie,
             '**': expose, '/': division, '//': diventier,
             '%': modulo}
    getcontext().prec = len(nop)*50  # CONTEXTE
    nbr1 = Decimal(nop[0])
    operation = signe[nop[1]]
    nbr2 = Decimal(nop[2])
    opombre[0] = str(operation(nbr1, nbr2))
    if 'E' in opombre[0] or 'e' in opombre[0]:
        op_e = []
        op_o = len(opombre[0])
        for ie in range(op_o - 1, 0, -1):
            if opombre[0][ie] in ("E", '+', '-'):
                break
            else:
                op_e.append(opombre[0][ie])
        op_r = list(reversed(op_e))
        op_j = (''.join(str(o0) for o0 in op_r))
        getcontext().prec = int(op_j) + op_o
        opombre[0] = str(operation(nbr1, nbr2))
Comme étant satisfait de cette favorable issue, je vous propose le code général en Python
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-
# Nombre au carré << nombre10carre.py >>

from decimal import *

def resume():
    print("""Le nombre_carre utilise le module decimal...
    La racine carrée réelle a forme générique
    Pour les opérations et les comparaisons
    Le traité se porte sur le nombre (ex:13.25)
    Les nombres négatifs en string dans le code
    Au vu du capable complexe de nombre_carre...""")

def espec6(ome):
    """ Séparation décimale pour typage(%6)
    # *(_TableTypeGénéral = [0,1,2,3,4,5]_)*
    # Type 6: Supérieur à *(_TTG_)"""
    # Recherche du point décimal
    if '.' in ome:
        nentie = 0  # Poids.Entier.fort
        for me in ome:
            nentie += 1
            if me == '.':
                break
    else:
        # Nombre.Entier
        nentie = len(str(int(ome)))  # Poids.Entier.faible
    nmasse = len(ome)  # Masse.Nombre
    nmedif = nmasse - nentie  # Mesure.Decimale
    ndecim = ome[nentie:]  # Masse.Decimale
    # Mesure.Decimale
    if nmedif != 0:
        fnd = 0
        for nd in ndecim:
            fnd += int(nd)  # Addition ndecim(nd)
            if fnd != 0:  # Somme positive
                decim6[0] = int(ndecim) % 6
                # Condition nombre négatif
                if ome[0] == '-':
                    decim6[0] = int(str('-' + str(decim6[0])))
                break

def opera(nop):
    """Fonction opératoire"""
    def addition(i, j):
        return i + j
    def soustraction(i, j):
        return i - j
    def multiplie(i, j):
        return i * j
    def expose(i, j):
        return i ** j
    def division(i, j):
        return i / j
    def diventier(i, j):
        return i // j
    def modulo(i, j):
        return i % j
    signe = {'+': addition, '-': soustraction, '*': multiplie,
             '**': expose, '/': division, '//': diventier,
             '%': modulo}
    getcontext().prec = len(nop)*50
    nbr1 = Decimal(nop[0])
    operation = signe[nop[1]]
    nbr2 = Decimal(nop[2])
    opombre[0] = str(operation(nbr1, nbr2))
    if 'E' in opombre[0] or 'e' in opombre[0]:
        op_e = []
        op_o = len(opombre[0])
        for ie in range(op_o - 1, 0, -1):
            if opombre[0][ie] in ("E", '+', '-'):
                break
            else:
                op_e.append(opombre[0][ie])
        op_r = list(reversed(op_e))
        op_j = (''.join(str(o0) for o0 in op_r))
        getcontext().prec = int(op_j) + op_o
        opombre[0] = str(operation(nbr1, nbr2))

def nombre_carre(nbr):
    """ Cette fonction produit la racine carrée du nombre, et
    elle commence par définir la partie entière de la racine².
    Qui en général a une virgule  flottante ( point  décimal )
    La polarité du nombre signé, forme une transition (+-)
        Analyse de la surface(Typique = Nombre % 6)
            1 = 7 % 6       :7%6: Pôle positif naturel
            -1 = -7 % -6    :-7%-6: Pôle négatif naturel
            5 = -7 % 6      :-7%6: Transit positif naturel
            -5 = 7 % -6     :7%-6: Transit négatif naturel
    """
    nbr = Decimal(nbr)
    if nbr <= -0:
        nbr = Decimal(str(nbr)[1:])
        rondeur[1] = 1
    # Précision.Allusion.Illusion.
    premax = 100000000
    """ Modulation unaire"""
    if len(str(nbr)) < 10:
        precision = (len(str(nbr)) + 1) * 10
        precisive = '(*10)'
    elif 10 <= len(str(nbr)) < 50:
        precision = int(len(str(nbr)) ** 2)
        precisive = '(**2)'
    elif 50 <= len(str(nbr)) < 100:
        precision = int(len(str(nbr)) ** 1.75)
        precisive = '(**1.75)'
    elif 100 <= (int(len(str(nbr)))) < premax:
        precision = int(len(str(nbr)) ** 1.25)
        precisive = '(**1.25)'
    else:
        return
    getcontext().prec = precision
    # Maximum(machine locale) = 100000000
    # Racine² décimale entière
    wh = int(nbr ** Decimal(.5))
    wh0 = (nbr ** Decimal(.5))
    nbu = nbr
    # Secteur décimal
    decitab = []
    if rondeur[1] == 1:
        entiere[0] = str('-' + str(wh))
    else:
        entiere[0] = str(wh)
    print('entiere =', entiere[0])
    www = nbrdec = nc = top = 0
    while image[0] ** 2 <= nbr and top == 0:
        for img in range(1, 10):
            if decitab:
                image[0] = Decimal(entiere[0] + '.' + recital[0] + str(img))
            else:
                if not nc:
                    nbrdec += 1  # Unité décimale
                    nc = 1
                image[0] = Decimal(entiere[0] + '.' + str(img))
            if image[0] ** 2 > nbr:
                decitab.append(img - 1)
                nbrdec += 1  # Nombre de décimales
                recital[0] = (''.join(str(d) for d in decitab))
                image[0] = Decimal(entiere[0] + '.' + recital[0])
                if image[0] ** 2 == nbr:
                    rondeur[0] = 'Juste racine² | nbr |'
                    top = 1
                    break
                break
            elif img == 9:
                if image[0] ** 2 == nbr:
                    rondeur[0] = 'Juste racine² | i9 |'
                    top = 1
                    break
                decitab.append(img)
                nbrdec += 1  # Nombre de décimales
                recital[0] = (''.join(str(d) for d in decitab))
                image[0] = Decimal(entiere[0] + '.' + recital[0])
            elif image[0] ** 2 == nbr:
                rondeur[0] = 'Juste racine² | elif |'
                top = 1
                recital[0] = str(image[0])[len(entiere[0]) + 1:]
                break
        # print(www, '°°° **2 =', image[0] ** 2)
        www += 1
    else:
        if len(str(rondeur[0])) < 1:
            rondeur[2] = 'Variant racine² | not |'
        nb0 = str(int(nbr) % 6)
        if rondeur[1] == 1:
            nbr = Decimal('-' + str(nbr))
            wh0 = Decimal('-' + str(wh0))
            nb0 = '-' + nb0
        sq0 = wh0
        if decim6[0] < 6:
            print('Rnombre =', nbr, ';typo =', [nb0,
                                                '.', str(decim6[0])])
        else:
            print('Rnombre =', nbr, ';typo =', [nb0])
        if sq0 ** 2 == nbu:
            print('_Rreelle_juste =', sq0)
        else:
            print('_Rracine =', sq0)
        print('*... (', nbrdec, ') Precision', precision, precisive)

# Nombre à forme décimale
""" Une décimale au format texte a un meilleur suivi """
# :nombre = '22135323.12554':
#  imageoo2 = 22135323.125540000000000000000000000000000000...
# ...00000000000000000000000000000000000000000000000000000000
# :nombre = 22135323.12554:
#  imageoo2 = 22135323.125539999455213546752929687500000000...
# ...00000000000000000000000000000000000000000000000000000000
"""."""
# Parenthèses non gérées
nombre = '-.5 ** 2'
    
# Mathématique sur nombres
opsigne = ['+', '-', '*', '/', '%', '**', '//']  # Signes math
opforme = ['(', ')', '=']  # Formes math
opserie = []  # Collecte éléments
opombre = ['']
nn0 = nn1 = nn2 = 0
oo0 = oo1 = ''
for no in nombre:
    oo0 += no
    nn2 += 1
    if no in opsigne and nn0 != 0 \
            and len(oo1) < 2:
        oo1 += no
        pp = len(oo0) - 1
        if oo1 in opsigne:
            if nn1 == 0:
                opserie.append(oo0[:pp])
        oo0 = ''
        if oo1 not in opsigne and len(oo1) > 1:
            oo0 = oo1[1]
            oo1 = oo1[0]
            nn1 = 1
        nn1 = 1
    elif no in opforme:  # Gestion paranthèse
        pass
    elif no == ' ':  # Gestion espace blanc
        pass
    else:
        if nn1 == 1:
            opserie.append(oo1)
            oo1 = ''
            nn1 = 0
    nn0 += 1
    if len(nombre) == nn2 and oo0 \
            and oo0 != nombre:
        opserie.append(oo0)
# Série opération
if opserie:
    opera(opserie)
if opombre[0] != '':
    nombre = opombre[0]
# Séparation décimale pour typage(%6)
decim6 = [6]
espec6(nombre)
image = {0: 0}  # Dico.Nombre réel
rondeur = {0: '', 1: 0}  # Dico.Comment
entiere = {0: ''}  # Dico.Racine.Entier
recital = [0]  # Table.Décimale
nombre_carre(nombre)  # Appel principal
if recital[0] != 0:
    recital[0] = str(image[0])[len(entiere[0]) + 1:]
print('Rrecital =', recital[0], '\n...*')
oo2 = image[0] ** 2
if rondeur[1] == 1:
    oo2 = Decimal('-' + str(oo2))
print('Iimageoo1 =', image[0], '\n..**',
      '\nIimageoo2 =', oo2)
print('.***')
if image[0]:
    if rondeur[0]:
        print('Rondeur 0:', rondeur[0])
    elif rondeur[2]:
        print('Rondeur 2:', rondeur[2], '\nReste =',
              Decimal(nombre) - ((image[0]) ** 2))
    else:
        rondeur[0] = 'Valeur intervalle'
        print('Rondeur 0:', rondeur[0], '\nReste =',
              Decimal(nombre) - ((image[0]) ** 2))
else:
    if float(nombre) == 0:
        print('Rrondeur : Juste réro limite | zéro |')
    else:
        print('Rrondeur : Juste hors limite | premax |')
# resume()
#
Avatar de
https://www.developpez.com
Le 26/04/2018 à 20:34
Bonsoir

Afin d'alléger le visuel donné par le code qui trie les éléments d'une équation suivants : Signes. Parenthèses.
Ne sera présenté que le bout de code en question

Le but est d'obtenir la séquence des opérations respectant la priorité principale des parenthèses, de relever les signes opératoires de l'équation, et qu'à chaque opération soit appliqué la précision décimale du module decimal. Mieux que l'instruction "eval", n'ayant pas cette précision, je présume.

Pour l'instant, les nombres ou opérandes ne sont pas construits. Puis il reste à créer les valeurs intermédiaires avant d'obtenir le résultat final, sous la forme d'un nombre réel. Et aussi passer le cap de l'erreur actuelle, car la fonction decimal6 n'a pas de nombre à grignoter...

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Dispatchage d'une équation
nombre = '(12*((-.5 ** -2)+(4+3 ))) -3'  # = -39.0
    
# Mathématique sur nombres
opsigne = ['+', '-', '%', '*', '/', '**', '//']  # Signes math
opforme = ['(', ')', '=']   # Formes math
opobjet = ''.join(str(o) for o in range(10))+'.'
oparfer = []  # Parenthèses fermantes
oparouv = []  # Parenthèses ouvrantes
optrucs = []  # Collecte signes
opblanc = []  # Collecte blancs
opimage = []  # Points réalisés
opserie = []  # Collecte nombres à calculer
opombre = ['']  # Nombre calculé
print('nombre =', nombre)
n0n = 0
for no in nombre:
    if no in opforme:
        if no == '(':
            oparouv.append(n0n)  # Contrôle parenthèses
        else:
            oparfer.append(n0n)
        opimage.append(no)
    elif no in opsigne:
        optrucs.append(n0n)
        opimage.append(no)
    elif no in opobjet:
        opimage.append(n0n)
    elif no == ' ':
        opblanc.append(n0n)
        opimage.append(no)
    n0n += 1
print()
print('oparouv', oparouv, 'oparfer', oparfer)
print('optrucs', optrucs, 'opblanc', opblanc)
print('opimage', opimage)
print('______________________________',)
# Positionnements des parenthèses ?(())?
optotal = len(nombre)  # Blancs inclus
oparent = len(oparouv)
opstage = [[]] * oparent
o1 = o3 = 0
for ouv in range(oparent):
    o1 -= 1
    parouv = oparouv[o1]
    aro = o2 = parouv
    while o2 < optotal:
        aro += 1
        if aro in oparfer:
            for ops in opstage:
                if aro in ops:
                    break
            else:
                o3 -= 1
                opstage[o3] = [parouv, aro]
                break
        o2 += 1
print('opstage',opstage)
# Traitement des signes ?(**,//)?
signes = []
s0s = ''
o0 = 0
if optrucs:
    while 1:
        if o0 < len(optrucs) - 1 \
           and optrucs[o0+1] - optrucs[o0] == 1:
            s0s += nombre[optrucs[o0]]
            s0s += nombre[optrucs[o0+1]]
            if s0s in opsigne:
                signes.append(s0s)
                s0s = ''
                o0 += 1
            else:
                signes.append(s0s[:-1])
                s0s = ''
        else:
            s0s += nombre[optrucs[o0]]
            signes.append(s0s)
            s0s = ''
        if o0 == len(optrucs)-1:
            print('SIG', signes)
            break
        o0 += 1
À suivre
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.