Publié : mar. 12/févr./2008 23:05

Forums PureBasic - Français
http://forums.purebasic.com/french/
Un log connu est celui à base 10, en fait log10(x)=ln(x)/ln(10)
Exemple(à essayer avec la calculatrice)
(a) log10(45677)=4.6596976....
(b) ln(45677)=10.72935
(c) ln(10)=2.3025....
(b)/(c)=(a)
Ben ça marche avec n'importe quelle base :
En base 2
log2(x)=ln(x)/ln(2)
Cette fonction log2(x) (logarithme à base 2) et l'inverse de 2^x.
2^56=7.205759...10^16
log2(7.205759...10^16)=56
Imaginons A^B=C (A=15 ; B=12 et C=1297.......)Si 15^12 = 129746337890625
et si je ne connais que 129746337890625
Comment fais-je pour trouver 15 et 12 ou bien deux autres chiffres qui donnent le même resultat.
Syntaxe
Resultat.f = Log(Nombre.f)
Description
Renvoie le logarithme naturel du nombre.
Code : Tout sélectionner
A = 15
B = 23
Debug "A = " + Str(A)
Debug "B = " + Str(B)
Debug ""
Debug "******************************************************************************************************"
Debug " LOGARITHMES RETROUVER LE PARAMETRE B"
Debug "******************************************************************************************************"
Debug ""
; Si A^B = C Alors B = Log(C) / Log(A)
C.f = Pow(A, B)
B = Log(C) / Log(A)
Debug "Si A^B = C Alors B = Log(C) / Log(A)"
Debug "-------------------------------------------------------------------"
Debug " "
Debug "C = Pow(A, B) = Pow(" + Str(A) + ", " + Str(B) + ") = " + Str(C)
Debug " "
Debug "B = Log(C) / Log(A) = Log(" + Str(C) + ") / Log(" + Str(A) + ") = " + Str(B)
Debug ""
Debug "******************************************************************************************************"
Debug " EQUIVALENCE PRODUIT / SOMME DES LOG"
Debug "******************************************************************************************************"
Debug ""
Debug "Le logarithme du produit de deux nombres est egal à la somme des deux logarithmes de chacun de ces nombres"
Debug ""
; C = Log(AB) = Log(A) + Log(B)
Procedure.f Exp(x.f)
Protected i.l
!NewCW equ p.v_i+0
!OldCW equ p.v_i+2
;charge x sans s'occuper du signe
!FLD dword [p.v_x]
!FABS
;n = x / Log(2)
!FLDLN2
!FDIVR st0, st1
;récupère le CW
!FNSTCW word [NewCW]
!FNSTCW word [OldCW]
;crée le CW pour arrondi par défaut
!AND word [NewCW], $F3FF
!OR word [NewCW], $0400
!FLDCW word [NewCW]
;n = Floor(n)
!FRNDINT
;restore le CW
!FLDCW word [OldCW]
;u = x - n * Log(2)
!FXCH
!FLD st1 ;charge n
!FLDLN2
!FMULP
!FSUBP
;m = Exp(u)
!FLD1 ;m
!FLD1 ;t
!MOV dword [p.v_i], 1
exp_loop:
;tant que t > 0
!FLDZ
!FCOMP
!FNSTSW ax
!TEST ah, $40
!JNE l_exp_end_loop
;t * u / i
!FMUL st0, st2
!FIDIV dword [p.v_i]
;i + 1
!INC dword [p.v_i]
;m + t
!FADD st1, st0
!JMP l_exp_loop
exp_end_loop:
!FSTP st0 ;retire t
!FSTP st1 ;retire u
!FSCALE ;r = m * Pow(2, n)
!FSTP st1 ;retire n
;si x négatif
!TEST dword [p.v_x], $80000000
!JE l_exp_end
;r = 1.0 / r
!FLD1
!FDIVRP
exp_end:
!ADD esp, 4
!RET 4
EndProcedure
Debug "C = Log(AB) = Log(A) + Log(B)"
Debug "------------------------------------------------"
Debug " "
Debug "C = Log(A * B) = Log(" + Str(A) + " * " + Str(B) + ") = Log(" + Str(A * B) + ") = " + StrF(Log(A * B))
Debug " "
Debug "C = Log(A) + Log(B) = Log(" + Str(A) + ") + Log(" + Str(B) + ") = " + StrF(Log(A) + Log(B))
Debug ""
Debug "******************************************************************************************************"
Debug " EXPONENTIELLES DES LOGS"
Debug "******************************************************************************************************"
Debug ""
Debug "L'exponentielle est la fonction inverse du logarithme neperien d'un produit de deux nombres"
Debug ""
; Exp(Log(A * B)) = A * B
Debug "Exp( Log( A * B ) ) = A * B et Exp( Log(A) + Log(B) ) = A * B"
Debug "----------------------------------------------------------------------------------------------------------"
Debug ""
Debug "A * B = " + Str(A * B)
Debug "Exp( Log(A) + Log(B) ) = Exp( Log(" + Str(A) + ") + Log(" + Str(B) + ") ) = " + StrF(Exp(Log(A) + Log(B)))
Debug "Exp( Log(A * B) ) = Exp( Log(" + Str(A) + " * " + Str(B) + " ) = " + StrF(Exp(Log(A * B)))
Debug ""
Debug "Ou bien :"
Debug ""
Debug "A * B = " + Str(A * B)
Debug "Log(A * B) = " + StrF(Log(A * B))
Debug "Exp(Log(A * B)) = " + StrF(Exp(Log(A * B)))
Code : Tout sélectionner
Si A^B = C comment retrouver A et B en ne connaissant que C
En fait c'est le codeur qui fait l'arrondiResultat.f = Round(11.5, 0) ; Renvoie 11
Resultat.f = Round(11.5, 1) ; Renvoie 12
Code : Tout sélectionner
x=8
tirage.d=Pow(Random(x),Random(x))
While tirage <1000
tirage=Pow(Random(x),Random(x))
Wend
c.d=tirage
Debug "c = "+StrD(c)
a.d=1
b.d=0
While a<x+1
a=a+1
b=Int(Log(c)/Log(a))
If c-Pow(a,b)<0.01
Debug "****************"
Debug "solution possible :"
Debug "a="+StrD(a)+" b="+StrD(b)+" c-a^b="+StrD(c-Pow(a,b))
Debug "****************"
Else
Debug "a="+StrD(a)+" b="+StrD(b)+" c-a^b="+StrD(c-Pow(a,b))
EndIf
Wend
Depuis la 4.20 ce n'est plus le codeur qui fait l'arrondiHuitbit a écrit : A propos de ça, pourquoi dans PB il n'y a pas de vrai fonction "arrondi"?
Parce que round () ou rien du tout, c'est la même chose!
Aide pb :Resultat.f = Round(11.5, 0) ; Renvoie 11
Resultat.f = Round(11.5, 1) ; Renvoie 12
En fait c'est le codeur qui fait l'arrondi![]()
Autant utiliser int() !
Code : Tout sélectionner
Debug Round(11.4999,#PB_Round_Nearest)
Debug Round(11.5000,#PB_Round_Nearest)
Debug Round(11.5001,#PB_Round_Nearest)
Il est trop fort ce FRED, Y pense presque à toutDepuis la 4.20 ce n'est plus le codeur qui fait l'arrondi
Code : Tout sélectionner
Procedure TestEgaliter(a.s, b.s)
If a = b
Debug "Deux nombres égaux"
ElseIf a > b
Debug "A supérieur à B"
ElseIf a < b
Debug "A inférieur à B"
EndIf
EndProcedure
A.s = "127373873735746873487843783783738743738738773738737343435"
B.s = "127373873735746873487843783783738743738738773738737343435"
TestEgaliter(A, B)
A = "127373873735746873487843783783738743738738773738737343434"
B = "127373873735746873487843783783738743738738773738737343435"
TestEgaliter(A, B)
A = "127373873735746873487843783783738743738738773738737343435"
B = "127373873735746873487843783783738743738738773738737343434"
TestEgaliter(A, B)
Code : Tout sélectionner
Procedure TestEgaliter(a.s, b.s)
If a = b
Debug "Deux nombres égaux"
ElseIf a > b
Debug "A supérieur à B"
ElseIf a < b
Debug "A inférieur à B"
EndIf
EndProcedure
A.s = "40"
B.s = "40"
TestEgaliter(A, B)
A.s = "4"
B.s = "60"
TestEgaliter(A, B)
A.s = "4"
B.s = "30"
TestEgaliter(A, B)