Erreur systématique de conversion mais 200% c'est trop
Publié : lun. 17/août/2009 18:50
Il y a toujours des erreurs dues à la conversion d’un type .Q entier
dans un type .D double précision flottant
Et enfin retour vers un type .Q Cette double conversion donne pour la plupart du temps des différences qui sont systématiques
mais ces types d’erreurs relatives (Dfin-Dorigine)/Dorigine donnent des % très petits.
Par contre ce que je viens de découvrir c’est un changement de signe
ce qui donne des erreurs de 200% oui vous avez bien lu 200% car le changement de signe garde la valeur absolue exemple :
en type .Q
$7FFFFFFFFFFFFFFF donne $8000000000000000 en double conversion on passe de la valeur max positive à la valeur min négative.
Ce qui représente bien 200% d’erreur
Il y a 511 ou 512 valeurs de ce type à partir de la valeur $7FFFFFFFFFFFFFFF et en diminuant cette valeur.
Il ya aussi 511 ou 512 valeurs avec de petites erreurs acceptables
Voici le prg qui donne ces valeurs <0 pour les valeurs fausses et >0 pour les valeurs acceptables
Ou en regardant les erreurs relatives 200% pour les fausses et <0,000001% pour celles acceptables
Faut-il prévenir l'équipe de purebasic? Cette erreur est aussi sur PB431!
dans un type .D double précision flottant
Et enfin retour vers un type .Q Cette double conversion donne pour la plupart du temps des différences qui sont systématiques
mais ces types d’erreurs relatives (Dfin-Dorigine)/Dorigine donnent des % très petits.
Par contre ce que je viens de découvrir c’est un changement de signe
ce qui donne des erreurs de 200% oui vous avez bien lu 200% car le changement de signe garde la valeur absolue exemple :
en type .Q
$7FFFFFFFFFFFFFFF donne $8000000000000000 en double conversion on passe de la valeur max positive à la valeur min négative.
Ce qui représente bien 200% d’erreur
Il y a 511 ou 512 valeurs de ce type à partir de la valeur $7FFFFFFFFFFFFFFF et en diminuant cette valeur.
Il ya aussi 511 ou 512 valeurs avec de petites erreurs acceptables
Voici le prg qui donne ces valeurs <0 pour les valeurs fausses et >0 pour les valeurs acceptables
Ou en regardant les erreurs relatives 200% pour les fausses et <0,000001% pour celles acceptables
Code : Tout sélectionner
Macro _q_
"
EndMacro
Macro symb(S)
_q_ S = _q_
EndMacro
Macro _Fn(n)
_q_#n#=_q_ + Str(n) + " "
EndMacro
Macro _Fs(S)
_q_#S#=_q_ + S + " "
EndMacro
Macro _Ff(F, nv=8)
_q_#F#=_q_ + StrF(f,nv) + " "
EndMacro
Macro _Fd(D,nv=16)
_q_#D#=_q_ + StrD(D,nv) + " "
EndMacro
Macro _FQ(Q)
_q_#Q#=_q_ + StrQ(Q) + " "
EndMacro
Macro _FH(H)
_q_#H#=_q_ + Hex(H) + " "
EndMacro
Macro _FU(U,typ=4)
_q_#U#=_q_ + StrU(U,typ) + " "
EndMacro
Macro szf(aa_)
aa_=0
Debug _q_ type= aa_ = _q_ +Str(SizeOf(aa_))
EndMacro
Define d.d,difd.d,q.q,tq.q,mtq.q
q.q=$7FFFFFFFFFFFFFFF
For i=0 To $FFFF Step 1
tq=q-i
d.d=tq
mtq=d
difd=mtq-tq
If tq <> mtq ; pour toute différence dans la conversion q0=>D=>q1 mais surtout avec changement de signe ce qui est très très génant
msg$="<0 "+ _FN(i)+_FN(tq)+_FH(TQ)+_FN(mtq)+_FH(mtq)+_Fd(difd)+"err%="+_fd(difd/d*100,18)
Else
Break
EndIf
If mtq >0
msg$=">0 "+ _FN(i)+_FN(tq)+_FH(TQ)+_FN(mtq)+_FH(mtq)+_Fd(difd)+"err%="+_fd(difd/d*100,18)
EndIf
Debug msg$
Next
Debug "********* ci dessus la dernière valeur différente ***********"
difd=mtq-tq
Debug _FN(i)+_FN(tq)+_FH(TQ)+_FN(mtq)+_FH(mtq)+_Fd(difd)+"err%="+_fd(difd/d*100,18)