ftoa () attuazione

S

Stark

Guest
Ciao a tutti, ho bisogno di un C implentation standard ftoa () funzione.
Grazie

 
ftoa?

Non è una funzione standard.Se ho capito bene è come fare:

float dati;
char fresa [100];

Sprint (buf, "% f", dati);

Tom

 
Salve# include <stdlib.h>

typedef union (
lungo L;
float F;
LF_t);

char * ftoa (float f, int * status)
(
lungo mantissa, int_part, frac_part;
exp2 breve;
LF_t x;
char * p;
static char outbuf [15];

* status = 0;
if (f == 0,0)
(
outbuf [0] ='0 ';
outbuf [1] = '.';
outbuf [2] ='0 ';
outbuf [3] = 0;
outbuf andata e ritorno;
)
XF = f;

exp2 = (unsigned char) (XL>> 23) - 127;
mantissa = (XL & 0xFFFFFF) | 0x800000;
frac_part = 0;
int_part = 0;

if (exp2> = 31)
(
* status = _FTOA_TOO_LARGE;
return 0;
)
else if (exp2 <-23)
(
* status = _FTOA_TOO_SMALL;
return 0;
)
else if (exp2> = 23)
int_part = mantissa <<(exp2 - 23);
else if (exp2> = 0)
(
int_part mantissa =>> (23 - exp2);
frac_part = (mantissa <<(exp2 1)) & 0xFFFFFF;
)
else / * if (exp2 <0) * /
frac_part = (mantissa & 0xFFFFFF)>> - (exp2 1);

p = outbuf;

if (XL <0)
* p = '-';

if (int_part == 0)
* p ='0 ';
altro
(
ltoa (p, int_part, 10);
while (* p)
p ;
)
* p = '.';

if (frac_part == 0)
* p ='0 ';
altro
(
char m, max;

max = sizeof (outbuf) - (p - outbuf) - 1;
if (max> 7)
max = 7;
/ * Stampa BCD * /
for (m = 0; m <max; m )
(
/ * Frac_part *= 10; * /
frac_part = (frac_part <<3) (frac_part <<1);

* p = (frac_part>> 24) '0 ';
frac_part & = 0xFFFFFF;
)
/ * Eliminare zeri termina * /
per i (- p, p [0] =='0 '& & p [-1]! ='. '; - p)
;
p;
)
* p = 0;

outbuf andata e ritorno;
)ejoy
migliori riguardo cb30
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
Ciao a tutti questo file è per 24bit Modificato IEEE 754 24-bit.gustare
Siamo spiacenti, ma è necessario il login per visualizzare questo attaccamento

 
cb30,

Solo un amichevole promemoria, esistono variabili locali sullo stack, e "morire" in uscita di routine.la vostra routine, sarebbe un po 'più sicuri di voi utilizzato un buffer in passato dal chiamante:
)

char * ftoa (float f, int * status, char * buffer)

(
...;

return buffer;

)

Oppure si potrebbe usare malloc () troppo.

saluti,
Wenton

 
Giusto per chiarire ulteriormente, il codice si usa 'outbuf static char []', che non muore, come non è una variabile locale, è assegnato staticamente in memoria.Tuttavia, la successiva chiamata alla funzione sovrascrive il primo invito, quindi qualcosa di simile

printf ( "% s% s \ n", ftoa (...), ftoa (...));

non funzionerà.

E 'sempre una migliore idea di passare in un buffer, ma è sbagliato dire che il buffer' morire '.

 
Ciao, ho provato
il codice in ftoa compilatore C18 per PIC.Ma
didnt eseguire.Programma di ritorno da "if (exp2> = 31) * status = -1; / / _FTOA_TOO_LARGE;"

C18 Compilatore utilizza-754 IEEE floating-point standard.si 'che non supporta standard.

Come posso convertire i float (4 byte) di String in compilatore C18?
è urgente,

con i migliori saluti

 
Cb30 Grazie per la ftoa () attuazione.

Un bug è stato scoperto qui->exp2 = (0xFF & (XL>> 23)) - 127 / * Jeb fissato per 16-bit F2xxx char * /

Il cast a unsigned char sulla maggior parte dei processori sarebbe un E con 0xFF, ma sulla TI DSP a 16-bit, un char è a 16-bit ed è diventata uno E con 0xFFFF.Ciò ha causato errori durante la conversione numeri negativi.

Inoltre, gli utenti che desiderano passare un buffer di eliminare la static char msg [15], dovrebbe essere consapevole del fatto che ftoa () utilizza il sizeof (msg) e se questo non corrisponde, si verificheranno errori.

 

Welcome to EDABoard.com

Sponsor

Back
Top