Tronque(nombre flottant)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Tronque(nombre flottant)

Message par Zorro »

Je ne sais plus si ça a deja été fait ...


voici une petite procedure qui recupere la partie decimal d'un nombre
par exemple le nombre flottant "155.256457899"
ça renvoi "256457899"

le contraire de INT() :)

Code : Tout sélectionner


floating.d =  8.788999557

Procedure Tronque(floating.d )
		;G-Rom
		integer.i = Abs(Int(floating))
		decimal.d = (Abs(floating) - integer) * 1000000000
		final.i = decimal
		ProcedureReturn final.i
EndProcedure

Debug " 8.788999557"
Debug  Tronque(floating.d)

en theorie on pourrai le faire avec un MOD(nombre,1)
mais ça ne renvoie pas la meme chose chez moi ... peut etre une histoire d'arrondis
Dernière modification par Zorro le ven. 06/avr./2018 20:30, modifié 5 fois.
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Tronque(nombre flottant)

Message par G-Rom »

Code : Tout sélectionner

floating.d = 15.256457899
integer.i = Int(floating)
decimal.d = floating - integer

Debug integer
Debug decimal
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Tronque(nombre flottant)

Message par Ar-S »

G-Rom : il récupère la partie de droite après la virgile en fait, x.yyyy sans le x.

Zorro : note qu'avec 888.7889995575 ça chie aussi

En fusionnant les 2

Code : Tout sélectionner




Procedure Tronque(number.d)
integer.i = Int(number)
decimal.d = number - integer
String.s=StringField(StrD(decimal),2,".")

ProcedureReturn Val(String)
EndProcedure


Debug tronque(15.256457899)
Debug tronque(888.7889995575)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Tronque(nombre flottant)

Message par G-Rom »

j'avais compris, une simple multiplication suffit :

Code : Tout sélectionner

floating.d = 15.256457899
integer.i = Abs(Int(floating))
decimal.d = (Abs(floating) - integer) * 1000000000
final.i = decimal


Debug integer
Debug final
Ca doit surement déconner avec des arrondis sur d'autres nombre.
faut surement jouer avec les bit pour avoir un resultat plus proche certainement , mais c'est une piste ;)
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Tronque(nombre flottant)

Message par Zorro »

ça marche pas mal

j'adopte !
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Tronque(nombre flottant)

Message par nico »

une variante qui trouve le multiplicateur:

Code : Tout sélectionner

floating.d = 158758.285214789
integer.i = Abs(Int(floating))
decimal.d = (Abs(floating) - integer) * Pow(10, Len(StrD((Abs(floating) - integer)))-2)
final.i = decimal


Debug integer
Debug final
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Tronque(nombre flottant)

Message par zaphod_b »

Salut,
sans passer par les string (curieux de savoir si ca marche avec tous les procs) :

Code : Tout sélectionner

Procedure nb_deci(n.d) ;nombre de décimales
  Protected f.d,i
  For i=1 To 15
    f=n*Pow(10,i) 
    If f-IntQ(f)=0
      Break
    EndIf   
  Next 
  ProcedureReturn i
EndProcedure


n.d=888.7889995575  ;45.10100002
d=nb_deci(n)
Debug "décimales :"+d
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64     
  f=Mod(n*Pow(10,d),Pow(10,d)) 
CompilerElse
  f.q=(n-Int(n))*Pow(10,d)  
CompilerEndIf

Debug "résultat :"+f

Code corrigé, qui fonctionne en x86 et x64.
Dernière modification par zaphod_b le mer. 11/avr./2018 4:44, modifié 1 fois.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Tronque(nombre flottant)

Message par Zorro »

chez moi renvoi (I7)
-2147483648
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
zaphod_b
Messages : 76
Inscription : mar. 09/déc./2014 20:02

Re: Tronque(nombre flottant)

Message par zaphod_b »

oups, ca marchait en x64 et pas en x86...
j'ai corrigé et ca devrait le faire.
merci d'avoir testé.
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Tronque(nombre flottant)

Message par Zorro »

ha oui , tres fort ! :)

les gars , le zaphod_b c'est pas un manchot :)

j'adopte .... ce serai bien que Fred ajoute cette fonction a Purebasic
on ne s'en sert pas tout les jours, mais ça peut etre utile quelques fois :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Tronque(nombre flottant)

Message par GallyHC »

Bonjour,

Je ne sais pas si cela est une erreur ou moi qui fait fausse route. mais si je mets "888.7800", comme valeur, je devrais avoir en résultat 7800 et pas 78 (qui ne sont pas les mêmes choses non?). Il ne faudrait pas confondre 0.0078 et 0.7800, je penses ?

Code : Tout sélectionner

Procedure nb_deci(n.d) ;nombre de décimales
  Protected f.d,i
  For i=1 To 15
    f=n*Pow(10,i) 
    If f-IntQ(f)=0
      Break
    EndIf   
  Next 
  ProcedureReturn i
EndProcedure


n.d=888.7800  ;45.10100002
d=nb_deci(n)
Debug "décimales :"+d
CompilerIf #PB_Compiler_Processor=#PB_Processor_x64     
  f=Mod(n*Pow(10,d),Pow(10,d)) 
CompilerElse
  f.q=(n-Int(n))*Pow(10,d)  
CompilerEndIf

Debug "résultat :"+f
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Tronque(nombre flottant)

Message par Kwai chang caine »

Bah mathématiquement parlant les derniers zéros après la virgule sont aussi utile que ceux avant la partie entière :wink:
Essaie sur une calculatrice elle va te virer tout ça vite fait

Code : Tout sélectionner

000888.7800 = 888.78
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Tronque(nombre flottant)

Message par Zorro »

oui 0.7800 ou 0.78 c'est pareil ! :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Tronque(nombre flottant)

Message par GallyHC »

Moi aussi va falloir que je me repose. ^^
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Tronque(nombre flottant)

Message par PAPIPP »

Bonjour à tous

Le format *.d est le format ayant la plus grande amplitude en option de base des processeurs X86

±2.2250738585072013e-308 à ±1.7976931348623157e+308, 15 Chiffres significatifs

Voici un test des principales options je fais varier vd.d de #pi * 10^-10 à #pi*10^10 on est loin de l’amplitude offerte par le format *.d

Pour être cohérent en 32 et 64 bits avec le format *.d il suffit d’utiliser le format *.q et intq valq.q=intd(val.d) pour la partie entière

Et voici le prg de test. A vous de juger des résultats.

Code : Tout sélectionner

; Procedure.S formf(val.D,sig=0)
;   If val<0
;     sign$=""
;     expo10.l=Int(Log10(val*(-1)))+1
;   Else
;     sign$="+"
;     expo10.l=Int(Log10(val))+1
;   EndIf
;   ms.d=val/Pow(10,expo10)
;   If sig=0
;     ProcedureReturn StrD(ms,18)+"E"+Str(Expo10)
;   Else
;     ProcedureReturn sign$+StrD(ms,18)+"E"+Str(Expo10)
;   EndIf
; EndProcedure
; Procedure.s Float_64_bits_Valu(D.D,SIG=0)
;   M.d
;   E.w
;   !fninit                 ;Or Not ;-)
;   !fld qword[p.v_D]         ;Load Value
;   !fxtract                ;Extract Value in Mantissa (st0) and Exponent (st1)
;   !fstp qword[p.v_M]        ;Mantissa
;   !fistp word [p.v_E]            ;Exponent
;   ;   val.d=m*Pow(2,E)
;   mant$=formf(m)
;   expo$=Str(e)
;   ProcedureReturn mant$+"*"+expo$
; EndProcedure

; procedure.d G_rom1(vd.d)
;   integer.q = Intq(Vd)
;   final.d=VD-integer
;  ProcedureReturn  final
; endprocedure 
procedure.d G_rom1(vd.d)
  integer.i = Int(Vd)
  final.d=VD-integer
 ProcedureReturn  final
endprocedure 
procedure.d G_rom2(vd.d)
  integer.q = Intq(Vd)
  final.d=VD-integer
 ProcedureReturn  final
endprocedure 
Procedure.q G_rom3(vd.d)
integer.Q = Abs(Intq(VD))
decimal.d = (Abs(vd) - integer) * 1000000000
final.q = decimal
 ProcedureReturn  final
endprocedure 
Procedure.q zaphod(n.d) ;nombre de décimales
  Protected f.d,i,fin.q
  For i=1 To 15
    f=n*Pow(10,i)
    If f-IntQ(f)=0
      Break
    EndIf   
  Next
  fin.q=(n-Intq(n))*Pow(10,i)  
  ProcedureReturn fin
EndProcedure

for i=-10 to 10
  Vd.d=#pi*pow(10,i)
  ;   debug _n(i)+_d(vd,18)+"  "+formf(vd)+"  "+Float_64_bits_Valu(vd)
  debug "Valeur flot ="+strd(vd,18) ;; avec 18 décimales
   debug "G-rom1="+strd(G_rom2(vd),18)
  debug "G-rom="+G_rom3(vd)
  debug "Zaphod="+zaphod(vd)
next  

A+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Répondre