2013-02-06 5 views
5

siamo capitati http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html, che comprende la lineaDefinizione valori virgola mobile di basamento e esponente esplicitamente

#define TWO5  0x1.0p5  /* 2^5  */ 

Apparentemente, two5 è definito come un doppio con il valore esplicito 1<<5. Tuttavia, questa è la prima volta che vedo questa notazione. Come è stato utilizzato questo formato e qual è il vantaggio rispetto alla semplice scrittura di 2.5?

+0

È costante di virgola mobile esadecimale C99. – nhahtdh

+0

Correlati: [collegamento] (http://stackoverflow.com/q/2427034/335858). – dasblinkenlight

risposta

6

Questa notazione è stata introdotta in C99. Il vantaggio è che il valore è espresso in forma esadecimale, quindi non è soggetto all'arrotondamento, ecc., Che si verifica quando si converte un valore a virgola mobile tra la rappresentazione sottostante e una forma decimale.

Ci sono un sacco di pagine che descrivono questa notazione, ad esempio:

http://www.exploringbinary.com/hexadecimal-floating-point-constants/

3

Questa è la notazione in virgola mobile esadecimale fornita con C99 (credo). Il vantaggio è che consente di specificare tali costanti con il loro valore rappresentativo esatto. (beh, questo suppone che la base in virgola mobile sia 2, 4, 8 o 16 :)

2

Questa è la grammatica di esadecimale virgola mobile costante, come definito nella C99 draft, scritto come espressione regolare:

0[xX]([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?)[pP][+-]?[0-9]+[flFL]? 

che si compone di 4 parti:

  • 0[xX]: prefisso esadecimale, uno di questi 2:

     
    0x 
    0X 
    
  • ([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?): esadecimale costante frazionata, per esempio:

     
    34.2f 
    .de 
    b3. 
    

    o esadecimale sequenza di cifre (numero intero esadecimale), ad esempio:

     
    2f4 
    10 
    

    la seconda parte descrive fondamentalmente la mantissa.

  • [pP][+-]?[0-9]+: parte esponente binario (specificato in decimale), ad esempio:

     
    p-4 
    p20 
    

    Specifichiamo un'esadecimale costante punto floating specificando la mantissa in esadecimale, e l'esponente b (per la base 2) in decimale.

  • [flFL]?: suffisso galleggiante opzionale, per indicare il tipo (float, double o long double).