2011-01-28 12 views
17

Sto leggendo un libro di lingue C, ha detto %f, %e, %g, %a caratteri di printf utilizzati per i tipi di dati float e double. Attualmente posso capire completamente %f, %e, %g.L'identificatore di formato% a per printf() in C

Quando è necessario utilizzare %a per stampare i dati di tipo float e double?

Potete per favore mostrarmi un esempio.

risposta

30

Lo specificatore di formattazione %a è nuovo in C99. Stampa il numero in virgola mobile in formato esadecimale. Questo non è qualcosa che useresti per presentare i numeri agli utenti, ma è molto utile per casi di utilizzo tecnico/tecnico.

A titolo di esempio, questo codice:

printf("pi=%a\n", 3.14); 

stampe:

pi=0x1.91eb86p+1 

L'ottimo articolo collegato nei commenti spiega che questo deve essere letto "1.91EB86 * 2 "(ovvero, p corrisponde a power-of-two il numero in virgola mobile viene aumentato a). In questo caso, "1.91EB86 " è "1.5700000524520874 ". Moltiplicalo per "2 " e ottieni "3.140000104904175 ".

Si noti che questo ha anche la proprietà utile di conservare tutti i bit di precisione e presentarli in modo robusto.

+6

È possibile leggere ulteriori informazioni sulle costanti in virgola mobile esadecimali qui: http://www.exploringbinary.com/hexadecimal-floating-point-constants/. –

6

Per quanto riguarda il motivo per cui si desidera utilizzare la rappresentazione esadecimale, è possibile utilizzare% a per rappresentare con precisione un valore in virgola mobile inviato a un'altra macchina per l'elaborazione.

Attualmente stiamo utilizzando un'unità di test per un controller integrato inviando dati da un modello di impianto simulato che emula sensori e attuatori al processore incorporato tramite un UART in cui il processore incorporato esegue il controllo e restituisce feedback (di nuovo , float rappresentato come% a) di nuovo al modello di impianto per chiudere il ciclo.

+0

Solo un avviso su sistema embedded, almeno con Atmel SAME70% a e% A non funzionano – jjxtra

Problemi correlati