Racine carrée (ajout aux fonctions précédentes)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 607 fois - Téléchargée 36 fois

Contenu du snippet

Voilà, il y a quelques temps, j'avais posté une source avec un ensemble de fonctions mathématiques pour les calculs sur de très grands nombre:
http://www.vbfrance.com/article.aspx?ID=9115
J'avais dit que j'ajouterais des fonctions, c'est chose faite avec celles-ci.

POUR FONCTIONNER, ELLES NECESSITES LES AUTRES FONCTIONS (voir l'autre source).

Source / Exemple :


Public Function racine(nombre As String, reste As Boolean)
If Len(nombre) Mod 2 = 1 Then nombre = "0" & nombre
tmp3 = "0"
For i = 1 To Len(nombre) Step 2
    tmp1 = tmp3 & Mid$(nombre, i, 2)
    tmp2 = "0"
    tmp5 = multi(Mid$(racine, 1), "2")
    If i = 1 Then tmp4 = 0: tmp2 = Int(Sqr(tmp1)) ^ 2: a = Int(Sqr(tmp1)): tmp0 = tmp2: GoTo nott
    For a = 0 To 10
        tmp0 = tmp2
        If a < 10 Then tmp2 = multi(tmp5 & Mid$(a, 1), Mid$(a, 1))
        If a = 10 Then tmp2 = multi(addition(multi(Mid$(tmp5, 1), "10"), Mid$(a, 1)), Mid$(a, 1))
        tmp4 = pgdd(Mid$(tmp2, 1), Mid$(tmp1, 1))
        If tmp4 = 0 Then Exit For
        If tmp4 = 1 Then Exit For
    Next a
nott:
    tmp3 = soustraction(Mid$(tmp1, 1), Mid$(tmp0, 1))
    racine = racine & Mid(a - tmp4, 1)
Next i
If reste = True Then racine = racine & "r" & tmp3
End Function

Function addit(nombre As String)
For i = 1 To Len(nombre)
addit = addition(Mid$(addit, 1), Mid$(nombre, i, 1))
Next i
End Function

Public Function DecToBin(nombre As String)
Do While nombre <> "0"
bini = Val(Right(nombre, 1)) Mod 2
biny = bini & biny
nombre = divis2(nombre)
Loop
DecToBin = biny
End Function

Public Function divis2(ByVal nombre As String)
suiv = 0: div2 = ""
For i = 1 To Len(nombre)
div2 = div2 & Val(Mid(nombre, i, 1)) \ 2 + suiv
suiv = (Val(Mid(nombre, i, 1)) Mod 2) * 5
Next i
divis2 = zero(Mid$(div2, 1))
End Function

Conclusion :


::RACINE CARREE::
----------------------

racine(nombre, reste)

renvoie la racine entière de nombre, si reste vaut TRUE, renvoie la racine de nombre entière suivit de 'r' et du reste.

:: Decimal en Binaire :: || MàJ ||
--------------------------

DecToBin(nombre)

renvoie la valeur binaire (1 et 0) de nombre, je l'ai améliorée de facon à la rendre plus rapide (beaucoup plus rapide).

:: Division par 2 ::
---------------------

C'est grace à cette fonction que DecToBin est plus rapide, elle peut être utilisée de préférence à la fonction Division, mais n'a été créer que pour la fonction DecToBin

:: Addition des chiffres du nombre ::
-----------------------------------------

Addit(nombre)

Renvoie la somme des chiffres composants le nombre.
EXEMPLE: addit ("223") renvoie 2+2+3, soit 7.

RAPPEL: NECESSITE LES AUTRES FONCTIONS:
http://www.vbfrance.com/article.aspx?ID=9115

A voir également

Ajouter un commentaire

Commentaires

cs_Kaizen
Messages postés
7
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
17 janvier 2005
-
Salut Cédric,

La racine n'ayant pas été corrigée, je te propose une racine entière qui fonctionne sous VBA...

Private Function Racin(nombre As String)
Dim NbImp As String
Dim LeReste As String
Dim Sous As String
If Len(nombre) Mod 2 1 Then nombre "0" & nombre
NbImp = 1
LeReste = ""
For I = 1 To Len(nombre) Step 2
Tranche = Mid$(nombre, I, 2)
LeReste = LeReste & Tranche
Sous = "1"
Do
If Mid$(LeReste, 1, 1) <> "-" Then
LeReste = soustraction(Mid$(LeReste, 1), Mid$(NbImp, 1))
Else
LeReste = addition(Mid$(LeReste, 2), Mid$(NbImp, 1))
LeReste = "-" & LeReste
End If
NbImp = addition(Mid$(NbImp, 1), "2")
Sous = addition(Mid$(Sous, 1), "1")
cond = Mid$(LeReste, 1, 1)
Loop While cond <> "-" Or cond = "0"
Sous = soustraction(Sous, 2)
NbImp = soustraction(Mid$(NbImp, 1), "2")
If Left$(LeReste, 1) = "-" Then
LeReste = soustraction(Mid$(LeReste, 2), Mid$(NbImp, 1))
LeReste = Mid$(LeReste, 2)
Else
LeReste = addition(Mid$(LeReste, 1), Mid$(NbImp, 1))
End If
NbImp = soustraction(Mid$(NbImp, 1), "2")
NbImp = addition(multi(addition(Mid$(NbImp, 1), 1), 10), 1)
res = res & Sous
Next
Racin = zero(Mid$(res, 1))
End Function
OBI76
Messages postés
28
Date d'inscription
mardi 23 juillet 2002
Statut
Membre
Dernière intervention
4 janvier 2004
-
c pas du tout comme ça que ca fonctionne dans la réalité, ils ne font que des développements limités... tu peux faire toutes les fonctions comme ça (a^b = e^b*ln(a)) c récurent et atteint une certaine précision au bout d'un certain nombre d'itération, maintenant ce qu'il faudrai voir c combien.....)
DHKold
Messages postés
153
Date d'inscription
vendredi 6 décembre 2002
Statut
Membre
Dernière intervention
29 mai 2005
-
Désolé, j'étais absent ces derniers mois. Dès que j'ai le temps (rarement), je corrige les erreurs. Mais je ne ferai sans doute pas de gros ajouts, étant donné que je pense lacher en grande partie VB, pour travailler sur un language de bas-niveau comme l'assembleur, en parrallèle avec du C#/C++
cs_Kaizen
Messages postés
7
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
17 janvier 2005
-
Pour ma part, c'est justement ta version que j'utilise.
L'amélioration porte sur le typage, la lisibilité du code, les calculs préalables hors boucle.
L'intérêt du code étant de travailler sur des grands nombres et de l'utiliser à travers excel, une compilation sous C++ n'apporterait pas grand chose, si ce n'est de se traîner avec une DLL de plus.
Ce qui reste à creuser, c'est l'algorithme. Preuve en est sur Divis2(x) par rapport à Divis(x,2,faux)
Pour Racine(x) qui ne fonctionne pas, il faudrait réussir :
Puiss(x;0,5)
Mais ce code ne travaille pas avec les nombres à virgule.

Voire au delà de l'algorithme, ce qui reste à creuser c'est la connaissance des facteurs premiers de grands nombres, surtout quand il n'y en a que deux...
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
J'avais posté sur l'autre source une version améliorée du code...... si ca en interesse quelques uns, j'aimerai bien vos avis...... surtout toi, DHKold

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.