PureBasic

Forums PureBasic
Nous sommes le Lun 23/Sep/2019 0:16

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 16 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: Tronque(nombre flottant)
MessagePosté: Ven 06/Avr/2018 9:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
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:

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

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Dernière édition par Zorro le Ven 06/Avr/2018 20:30, édité 5 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Ven 06/Avr/2018 16:19 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
Code:
floating.d = 15.256457899
integer.i = Int(floating)
decimal.d = floating - integer

Debug integer
Debug decimal


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Ven 06/Avr/2018 17:19 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8750
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:



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 :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Ven 06/Avr/2018 17:38 
Hors ligne

Inscription: Dim 10/Jan/2010 5:29
Messages: 3426
j'avais compris, une simple multiplication suffit :

Code:
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 ;)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Ven 06/Avr/2018 20:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
ç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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Lun 09/Avr/2018 11:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Ven 13/Fév/2004 0:57
Messages: 3702
une variante qui trouve le multiplicateur:

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


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mar 10/Avr/2018 21:29 
Hors ligne

Inscription: Mar 09/Déc/2014 20:02
Messages: 74
Salut,
sans passer par les string (curieux de savoir si ca marche avec tous les procs) :

Code:
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 édition par zaphod_b le Mer 11/Avr/2018 4:44, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mar 10/Avr/2018 21:50 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
chez moi renvoi (I7)
Citation:
-2147483648

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 4:45 
Hors ligne

Inscription: Mar 09/Déc/2014 20:02
Messages: 74
oups, ca marchait en x64 et pas en x86...
j'ai corrigé et ca devrait le faire.
merci d'avoir testé.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 9:37 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 9:57 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1628
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:
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

_________________
Image

Image

Image Official site of PureBasic
Image Official site of SpiderBasic

Configuration : Tower: Windows 7 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.62 (x86 et x64)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 11:41 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6650
Localisation: Isere
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:
000888.7800 = 888.78

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 16:51 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
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"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Mer 11/Avr/2018 18:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Lun 17/Déc/2007 12:44
Messages: 1628
Moi aussi va falloir que je me repose. ^^

_________________
Image

Image

Image Official site of PureBasic
Image Official site of SpiderBasic

Configuration : Tower: Windows 7 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.62 (x86 et x64)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Tronque(nombre flottant)
MessagePosté: Jeu 12/Avr/2018 9:27 
Hors ligne

Inscription: Sam 23/Fév/2008 17:58
Messages: 556
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:
; 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.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 16 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye