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+