Page 1 sur 1
arrondi ...
Publié : ven. 30/juin/2006 17:31
par jerexgrz
quand on divise par ex: (valeurs reelles)
480 / 32 = 15
478 / 32 = 14.93
464 / 32 = 14.5
460 / 32 = 14.375
Serait il possible que la division renvoie un arrondi plus pres :
comme ca : (valeurs arrondies)
480 / 32 = 15
478 / 32 = 15
464 / 32 = 14 ou 15 (suivant le mode choisi)
460 / 32 = 14
et pourrait on avoir plus de choix dans les arrondis avec Round! Merci.
Publié : sam. 01/juil./2006 10:17
par Sehka
Salut Jerexgrz,
Voici un petit bout de code qui peut t'aider
Code : Tout sélectionner
Procedure.f GetFloatRounded(Value.f,nbDecimal.l,Rounded.f)
Protected pFactor.l
Protected pSgn.l
pSgn = Sgn(Value)
Value = Abs(Value)
pFactor =Pow(10,nbDecimal)
Result.f = pSgn*Int((Value*pFactor)+Rounded)/pFactor
ProcedureReturn Result
EndProcedure
Debug "GetFloatRounded Upper 0.5 : " + StrF(GetFloatRounded(464 / 32 ,0,0.5))
Debug "GetFloatRounded Lower 0.5 : " + StrF(GetFloatRounded(464 / 32 ,0,-0.5))
Par contre si quelqu'un maîtrise l'assembleur, il pourrait surement réaliser une fonction optimisée et rapide

Publié : sam. 01/juil./2006 10:36
par Flype
il y a une discussion intéressante à ce sujet sur le forum anglais.
personne n'y a trouvé LA solution mais çà peut donner des idées.
http://www.purebasic.fr/english/viewtop ... ight=round
Publié : sam. 01/juil./2006 10:40
par jerexgrz
*sehka ! Merci je vais regarder ca !
Autrement un autre bon truc à ajouter (option) dans le debugger, ce serait de visualiser un tableau de cette maniere (c + visuel!):
00,10,20,30,00
00,10,00,00,10
10,00,20,30,00
00,10,10,10,00
Comme ca, on voit immediatement la colonne, la ligne et le resultat.
Par exemple, quand on a une structure avec un tableau à l'interieur du style source (cf ex), ce serait bien de ne pas afficher son contenu dans le debugger. Sinon, avoir la possibilite d'afficher seulement les variables qu'on a besoin. EX: j'ai besoin de connaitre la valeur de source mais pas de X ou de Y.
structure pt1
x.l
y.l
source.l [10]
endstructure
Publié : sam. 01/juil./2006 11:30
par tonton
deux instructions SSE2 sont specialisé pour ca...
Code : Tout sélectionner
x1.f = 14.322
x2.f = 14.522
arrondi1.l
arrondi2.l
!cvttss2si eax,[v_x1] ; (conversion du flotant en entier avec troncature des décimales)
!mov [v_arrondi1],eax
!cvtss2si eax,[v_x2] ; (conversion du flotant en entier le plus proche)
!mov [v_arrondi2],eax
Debug arrondi1 ; 14
Debug arrondi2 ; 15
Publié : lun. 03/juil./2006 17:18
par Sehka

, je viens de voir une coquille de ma part, j'ai oublié la fonction suivante :
Code : Tout sélectionner
Procedure Sgn(x.l)
ProcedureReturn (x > 0 Or #False) - (x < 0 Or #False)
EndProcedure