Function AGN(ByVal Nb1 As String, ByVal Nb2 As String) As String 'ADDITION SIGNEE DE 2 GRANDS NOMBRES 'Info sur les longueurs des termes Dim L1 As Long, L2 As Long L1 = Len(Nb1): L2 = Len(Nb2) 'Recherche des signes et conversion en nombre positif Dim S1 As Long, S2 As Long S1 = 1: S2 = 1 If Left$(Nb1, 1) = "-" Then S1 = -1: Nb1 = Right$(Nb1, L1 - 1): L1 = L1 - 1 If Left$(Nb2, 1) = "-" Then S2 = -1: Nb2 = Right$(Nb2, L2 - 1): L2 = L2 - 1 'Recherche de la décimale et conversion en entier Dim P1 As Long, P2 As Long, Virgule As Long, PS1 As Long, PS2 As Long Dim Z As String 'optimisation pour les string$ qui suivent Z = "0" 'Recherche emplacement de la virgule P1 = InStr(1, Nb1, ",") + InStr(1, Nb1, ".") P2 = InStr(1, Nb2, ",") + InStr(1, Nb2, ".") 'Recompose en entier Dim Nb1Prov As String, Nb2Prov As String PS1 = 0: PS2 = 0 If P1 > 0 Then PS1 = L1 - P1 Nb1Prov = Left$(Nb1, P1 - 1) End If If P2 > 0 Then PS2 = L2 - P2 Nb2Prov = Left$(Nb2, P2 - 1) End If If PS1 > PS2 Then Nb1 = Nb1Prov & Right$(Nb1, L1 - P1) Nb2 = Nb2Prov & Right$(Nb2, L2 - P2) & String$(PS1 - PS2, Z) ElseIf PS1 < PS2 Then Nb1 = Nb1Prov & Right$(Nb1, L1 - P1) & String$(PS2 - PS1, Z) Nb2 = Nb2Prov & Right$(Nb2, L2 - P2) Else Nb1 = Nb1Prov & Right$(Nb1, L1 - P1) & String$(PS2 - PS1, Z) Nb2 = Nb2Prov & Right$(Nb2, L2 - P2) & String$(PS1 - PS2, Z) End If 'Retrouve les bonnes longueurs L1 = Len(Nb1): L2 = Len(Nb2) 'Trouve la bonne position de la décimale du résultat Virgule = IIf(PS2 > PS1, PS2, PS1) 'Comparaison des termes si soustraction If S1 <> S2 Then Dim Pgdd As Long, Lmax As Long 'Renvoi 1 si Nb1>Nb2, sinon -1 ou Revoi 0 si égalité avec Nb1 et Nb2 >=0 Lmax = L1 If L1 < L2 Then Lmax = L2 Pgdd = StrComp(String$(Lmax - L1, Z) & Nb1, String$(Lmax - L2, Z) & Nb2) If Pgdd = 0 Then AGN = "0": Exit Function 'égalité End If 'Transformation en longueur multiple de Multiple Dim Multiple As Long Multiple = 14 Dim lgmul As Long lgmul = (IIf(L1 < L2, L2, L1) \ Multiple + 1) * Multiple Nb1 = String$(lgmul - L1, Z) & Nb1 Nb2 = String$(lgmul - L2, Z) & Nb2 'Variables Dim Total As String Dim t As Long Dim V1 As Double, V2 As Double, R As Double, Ret As Long Dim lr As Long Dim ln10 As Double ln10 = Log(10) 'Déclare le résultat à la longueur maxi Total = String$(lgmul, Z) 'Fait l'opération puis met en forme If S1 = S2 Then '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 'Replacement de la virgule If Virgule <> 0 Then Total = Left$(Total, Len(Total) - Virgule) & "," & Right$(Total, Virgule) 'Mise en forme AGN = ZeroGN(Total) 'Règle des signes If S1 = -1 And AGN <> "0" Then AGN = "-" & AGN Else 'Soustraction Dim Base As Double Base = 10 ^ (Multiple + 1) For t = lgmul - Multiple + 1 To 1 Step -Multiple V1 = Mid$(Nb1, t, Multiple) V2 = Mid$(Nb2, t, Multiple) R = V1 - V2 + Ret Ret = 0 If Sgn(R) <> Pgdd And R <> 0 Then R = Pgdd * Base + R Ret = -Pgdd End If lr = Fix(Log(Abs(R) + 0.11) / ln10) + 1 Mid$(Total, t - lr + Multiple, lr) = CStr(Abs(R)) Next t 'Replacement de la virgule If Virgule <> 0 Then Total = Left$(Total, Len(Total) - Virgule) & "," & Right$(Total, Virgule) 'Mise en forme AGN = ZeroGN(Total) 'Règle des signes If Pgdd * S1 = -1 Then AGN = "-" & AGN End If End Function