Option Explicit
Private Declare Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Function TxtDécimal(ByVal V As Double) As String
Dim E#, D#, Q#, R#, M#, Nég As Boolean
If V = 0 Then TxtDécimal = "0": Exit Function
Nég = V < 0: V = Abs(V)
E = Int(V): D = V - E
Do: M = Modulo10(E): TxtDécimal = M & TxtDécimal: E = (E - M) / 10: Loop Until E = 0
If Nég Then TxtDécimal = "-" & TxtDécimal
If D = 0 Then Exit Function
TxtDécimal = TxtDécimal & ","
Do While D > 0: M = Int(10 * D): TxtDécimal = TxtDécimal & M: D = (D - M / 10) * 10: Loop
Do While D > 0: M = Int(10 * D): TxtDécimal = TxtDécimal & M: D = D * 8 - M + D * 2: Loop
End Function
Private Function Modulo10(ByVal X As Double) As Long
Dim Y As Double, E10 As Long
Y = Int(X / 2): Modulo10 = X - 2 * Y: X = Y
E10 = 1: Do While X > 0: Y = Int(X / 2)
E10 = 2 * E10 Mod 10: Modulo10 = (Modulo10 + (X - 2 * Y) * E10) Mod 10
X = Y: Loop
End Function
Function TxtDécCodé(ByVal V As Double) As String
Dim E2 As Long, Nég As Boolean, D As Double
If V = 0 Then TxtDécCodé = "0": Exit Function
CalcMtE2 V, E2, V: Nég = V < 0: V = Abs(V)
While Int(V) <> V: V = 2 * V: E2 = E2 - 1: Wend
If E2 >= 0 Then D = V * 2 ^ E2: If D < 1E+16 Then V = D: E2 = 0
While V > 0: D = Int(V / 10): TxtDécCodé = V - 10 * D & TxtDécCodé: V = D: Wend
If Nég Then TxtDécCodé = "-" & TxtDécCodé
If E2 <> 0 Then TxtDécCodé = TxtDécCodé & " × 2": If E2 <> 1 Then TxtDécCodé = TxtDécCodé & "^" & E2
End Function
Function DblMtE2(ByVal Mt As Double, ByVal E2 As Long) As Double
Dim TIntg(0 To 3) As Integer
If Mt = 0 Then DblMtE2 = 0: Exit Function
MoveMemory TIntg(0), Mt, 8
TIntg(3) = TIntg(3) + E2 * &H10
MoveMemory DblMtE2, TIntg(0), 8
End Function
Private Sub CalcMtE2(Mt As Double, E2 As Long, ByVal V As Double)
Dim TIntg(0 To 3) As Integer
If V = 0 Then Mt = 0: E2 = 0: Exit Sub
MoveMemory TIntg(0), V, 8
E2 = (TIntg(3) And &H7FF0) \ &H10 - &H3FF
TIntg(3) = TIntg(3) And &H800F Or &H3FF0
MoveMemory Mt, TIntg(0), 8
End Sub