'Addition For t = lgmul - Multiple + 1 To 1 Step -Multiple V1 = Mid$(Nb1, t, Multiple) V2 = Mid$(Nb2, t, Multiple) R = V1 + V2 + Ret lr = Fix(Log(R + 0.11) / ln10) + 1 If lr Multiple + 1 Then Ret 1 Else Ret = 0 Mid$(Total, t - lr + Multiple, lr) = CStr(R) Next t
For i As Integer = pNombre1.Length To 1 Step -1 ' Addition monodigitale cTemp1 = Val(Mid(pNombre1, i, 1)) cTemp2 = Val(Mid(pNombre2, i, 1)) cTemp = cTemp1 + cTemp2 + cRetenue cRetenue = 0 ' Retenue If Len(cTemp.ToString) = 2 Then cRetenue = Val(Mid(cTemp.ToString, 1, 1)) cTemp = Val(Mid(cTemp.ToString, 2, 1)) End If cResultat = cTemp.ToString & cResultat ' Concaténation Next i
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionlr = Fix(Log(R + 0.11) / ln10) + 1
If lr Multiple + 1 Then Ret 1 Else Ret = 0
If Len(cTemp.ToString) = 2 Then cRetenue = Val(Mid(cTemp.ToString, 1, 1)) ...
Mid$(Total, t - lr + Multiple, lr) = CStr(R)
'Déclare le résultat à la longueur maxi Total = String$(lgmul, z)
cResultat = cTemp.ToString & cResultat. En gros, j'évite ici des manipulations en interne lors de l'exécution du code... Gros gain de temps !... Maintenant, je ne sais pas sous VB.NET comment faire cette forme d'optimisation, ni même si cela optimisera VB.NET ?... Les pistes d'optimisation du codage du VB.NET son encore (me semble-t-il) à étudier...
Le problème étant que si je souhaite une précision n'étant pas dans le suite quadratique (2 4 8 16 32...) les résultats peuvent être erronés ainsi il faudrait que je fasse une condition qui augmente Z à la valeur quadratique supérieur pour le calcul puis je découpe la chaine avec la première valeur de Z (avec mon Mid() ou une fonction plus optimisée) mais je vois pas trop comment faire...
Sinon, j'arrive à faire marcher l'algorithme pour des nombres comme 14 et tapant 1/14 sur ma calculatrice et en donnant à x une valeur approchée, cette technique (qui simule le précalcul de x qui sera effectué par les types de VB avant la structure itérative) marche (encore) pour obtenir l'inverse d'un nombre comme 123456789 (avec x=0.000000008) mais j'ai peur que pour des très grands nombres l'écart entre le x0 obtenu (par division VB) et a soit trop important pour que l'algorithme puisse démarrer sa division.
Function Addition(ByVal pNombre1 As tReel, ByVal pNombre2 As tReel) As tReel ' Déclarations Dim cResultat As tReel With cResultat .tSigne = "+" .tSignificande = 0 .tValeur = "" End With pNombre1 = VirguleFlottante(pNombre1, pNombre2) pNombre2 = VirguleFlottante(pNombre2, pNombre1) ' Addition If (pNombre1.tSigne "+" And pNombre2.tSigne "+") Or (pNombre1.tSigne = "-" And pNombre2.tSigne = "-") Then cResultat.tValeur = AdditionMonodigitale(pNombre1.tValeur, pNombre2.tValeur) cResultat.tSignificande = cResultat.tValeur.Length - (pNombre1.tValeur.Length - (pNombre1.tSignificande + 1)) - 1 If (pNombre1.tSigne "-" And pNombre2.tSigne "-") Then cResultat.tSigne = "-" End If ' Soustraction If pNombre1.tSigne "+" And pNombre2.tSigne "-" Then If Comparaison(pNombre1, pNombre2) = False Then Dim cTransfert As tReel = pNombre1 pNombre1 pNombre2 : pNombre2 cTransfert cResultat.tSigne = "-" End If cResultat.tValeur = SoustractionMonodigitale(pNombre1.tValeur, pNombre2.tValeur) cResultat.tSignificande = cResultat.tValeur.Length - (pNombre1.tValeur.Length - (pNombre1.tSignificande + 1)) - 1 End If Return cResultat ' Renvoie du résultat End Function ' Fonction d'addition et soustraction Function AdditionMonodigitale(ByVal pNombre1 As String, ByVal pNombre2 As String) As String Dim cTemp As Byte, cTemp1 As Byte, cTemp2 As Byte Dim cResultat As String "", cRetenue As Byte 0 For i As Integer = pNombre1.Length To 1 Step -1 ' Addition monodigitale cTemp1 = Val(Mid(pNombre1, i, 1)) cTemp2 = Val(Mid(pNombre2, i, 1)) cTemp = cTemp1 + cTemp2 + cRetenue cRetenue = 0 ' Retenue If Len(cTemp.ToString) = 2 Then cRetenue = Val(Mid(cTemp.ToString, 1, 1)) cTemp = Val(Mid(cTemp.ToString, 2, 1)) End If cResultat = cTemp.ToString & cResultat ' Concaténation Next i Return cResultat End Function ' Renvoie l'addition de deux chaines Function SoustractionMonodigitale(ByVal pNombre1 As String, ByVal pNombre2 As String) As String Dim cTemp As Byte, cTemp1 As Byte, cTemp2 As Byte Dim cResultat As String "", cRetenue As Byte 0 For i As Integer = pNombre1.Length To 1 Step -1 ' Soustraction monodigitale cTemp1 = Val(Mid(pNombre1, i, 1)) cTemp2 = Val(Mid(pNombre2, i, 1)) If i < pNombre1.Length Then cTemp = (Val("1" & cTemp1) + cRetenue) - (cTemp2 + 1) Else cTemp = (Val("1" & cTemp1) + cRetenue) - cTemp2 End If cRetenue = 0 ' Retenue If Len(cTemp.ToString) = 2 Then cRetenue = Val(Mid(cTemp.ToString, 1, 1)) cTemp = Val(Mid(cTemp.ToString, 2, 1)) End If cResultat = cTemp.ToString & cResultat ' Concaténation Next i Return cResultat End Function ' Renvoie la soustraction de deux chaines
Le réel : -123,45 s'écrirait :
tSigne = "-"
tSignificande = 2
tValeur = "12345"