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 :wink:

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 :idea:

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 !

:idea:
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.

:idea:
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
:oops: , 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