If Num < 0 Then Num = -Num
Num = Abs(Num)ça évite un if, c'est un peu plus rapide
while(num>=1.0) { num/=2.0; exp++; } while(num<0.5) { num*=2.0; exp--; }
dbl2zx81.Exp = Int(Log(Num) / Log(2))
if(exp<-128 || exp>127) return(0);
If dbl2zx81.Exp < -129 Or dbl2zx81.Exp > 126 Then Exit Function
' ZX81 floating point number. Type Zx81_Long exp As Integer ' - Exponent man As String ' - Mantissa End Type Function dbl2zx81(Num As Double) As Zx81_Long 'int exp; 'unsigned long man; Dim exp As Integer 'ça commence mal, il semble ne pas y avoir de unsigned long en VBA Dim man As Long ' 'if(num==(long)num && num>=-65535.0 && num<=65535.0) '{ 'long tmp=(long)fabs(num); 'exp=0; 'man=((tmp%256)<<16)|((tmp>>8)<<8); '} 'else If Num = Int(Num) And Num >= -65535 And Num <= 65535 Then 'en vrai ce ne ce sont pas des And mais des AndAlso pour éviter de tester la condition suivante si c'est déjà Faux, mais apparemment il n'y en a pas en VBA Dim tmp As Long tmp = Abs(Num) exp = 0 man = ShiftLeft(tmp Mod 256, 16) Or ShiftLeft(ShiftRight(tmp, 8), 8) Else 'int f; 'num=fabs(num); 'exp=0; 'while (Num >= 1.0) '{ ' num/=2.0; exp++; '} 'while (Num < 0.5) '{ 'num*=2.0; exp--; '} Dim f As Integer exp = 0 While Num >= 1 Num = Num / 2 exp = exp + 1 Wend While Num < 0.5 Num = Num * 2 exp = exp - 1 Wend 'if(exp<-128 || exp>127) return(0); 'exp=128+exp; 'num*=2.0; If exp < -128 Or exp > 127 Then Exit Function 'Ici cela auriat être OrElse, pour la même raison que AndAlso exp = 128 + exp Num = Num * 2 'man=0; 'for(f=0;f<32;f++) '{ 'man<<=1; 'man|=(int)num; 'num-=(int)num; 'num*=2.0; '} man = 0 For f = 1 To 32 man = ShiftLeft(man, 1) Dim x As Integer x = Int(Num) man = man Or x Num = (Num - x) * 2 Next 'if((int)num && man!=0xFFFFFFFF) man++; If Not (Int(Num) = 0) And Not (man = &HFFFFFFFF) Then man = man + 1 'man&=0x7FFFFFFF; '} man = man And &H7FFFFFFF End If '*pexp=exp; *pman=man; 'return(1); dbl2zx81.exp = exp dbl2zx81.man = man End Function 'Je suis allé cherché ShiftLeft et ShiftRight ici https://forum.hardware.fr/hfr/Programmation/VB-VBA-VBS/decallage-et-vb-sujet_33399_1.htm#t328274 Public Function ShiftLeft(ByVal m_Value As Long, ByVal m_Step As Long) As Long Dim m_Counter As Long ShiftLeft = m_Value For m_Counter = 1 To m_Step ShiftLeft = ShiftLeft * 2 Next End Function Public Function ShiftRight(ByVal m_Value As Long, ByVal m_Step As Long) As Long Dim m_Counter As Long ShiftRight = m_Value For m_Counter = 1 To m_Step ShiftRight = ShiftRight \ 2 Next End Function
'man=0; 'for(f=0;f<32;f++) '{ 'man<<=1; 'man|=(int)num; /* le caractère ' / ' a changé !!! */ 'num-=(int)num; 'num*=2.0; '} man = 0 For f = 1 To 32 man = ShiftLeft(man, 1) Dim x As Integer x = Int(Num) man = man Or x Num = (Num - x) * 2 Next
Sub DecodeLngZX(Char_STR As String, Lng_Val As Double) 'Sub from ZxList 43 - David Gonzales, Renton , WA (Jan 15, 1995) Dim NulCHR As String Dim GetChar1 As Variant Dim cmpt As Variant Dim ExpEnd As Variant Dim Enum_Mant As String Dim lMant As Variant Dim Expon As Byte Dim ExpRes As Variant Dim multi As Variant NulCHR = Chr$(0) + Chr$(0) + Chr$(0) + Chr$(0) + Chr$(0) If Char_STR$ = NulCHR Then Lng_Val = 0: Exit Sub GetChar1 = Asc(Mid(Char_STR$, 2, 1)) ExpEnd = GetChar1 And 128 Mid(Char_STR$, 2, 1) = Chr$(GetChar1 Or 128) For cmpt = 5 To 2 Step -1 If Asc(Mid(Char_STR$, cmpt, 1)) Then Exit For Next Enum_Mant$ = Mid(Char_STR$, 2, cmpt - 1) lMant = Len(Enum_Mant$) * 8 Expon = Asc(Mid(Char_STR$, 1, 1)) ExpRes = Expon And 127 Lng_Val = 0 multi = 0 For cmpt = Len(Enum_Mant$) To 1 Step -1 Lng_Val = Lng_Val + (Asc(Mid(Enum_Mant$, cmpt, 1)) * (256 ^ multi)) multi = multi + 1 Next cmpt Lng_Val = Lng_Val * (2 ^ (ExpRes - lMant)) Lng_Val = (Round(Lng_Val)) If ExpEnd Then Lng_Val = -Lng_Val End Sub
tmpint2 = IntNum - (Int(IntNum / 65536#) * 65536#)puisque IntNum est positif.
tmpint2 = IntNum - (Fix(IntNum / 65536#) * 65536#) - 28
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questiontmpint2 = IntNum - (Int(IntNum / 65536#) * 65536#)