2013-02-06 8 views
5

I eher zufällig auf http://sourceware.org/ml/glibc-cvs/2013-q1/msg00115.html, welche die Linie ScheinbarDefinieren von Gleitkommawerten durch basen und Exponent explizit

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

umfasst, two5 als Doppel mit dem expliziten Wert 1<<5 definiert ist. Dies ist jedoch das erste Mal, dass ich diese Notation sehe. Wie wurde dieses Format verwendet und was ist der Vorteil gegenüber dem Schreiben 2.5?

+0

Es ist C99 hexadezimale Gleitkommazahl. – nhahtdh

+0

Related: [Link] (http://StackOverflow.com/Q/2427034/335858). – dasblinkenlight

Antwort

6

Diese Notation wurde in C99 eingeführt. Der Vorteil besteht darin, dass der Wert in hexadezimaler Form ausgedrückt wird. Daher unterliegt er keiner Rundung usw., die auftritt, wenn Sie einen Gleitkommawert zwischen der zugrunde liegenden Darstellung und einer Dezimalform konvertieren.

Es gibt viele Seiten, die diese Art der Notation beschreiben, zum Beispiel:

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

3

Dies ist die hexadezimale Fließkomma-Notation, die mit C99 kam (glaube ich). Der Vorteil besteht darin, dass solche Konstanten mit ihrem exakt darstellbaren Wert spezifiziert werden können. (Nun, das setzt voraus, dass die Gleitkomma-Basis 2, 4, 8 oder 16 ist :)

2

Dies ist die Grammatik der hexadezimalen Gleitkommakonstante, wie definiert in C99 draft, als regulärer Ausdruck geschrieben:

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

Welche besteht aus 4 Teilen:

  • 0[xX]: Hexadezimal-Präfix, entweder von diesen 2:

     
    0x 
    0X 
    
  • ([a-fA-F0-9]*[.][a-fA-F0-9]+|[a-fA-F0-9]+[.]?): Hexadezimal Bruchkonstante, zum Beispiel:

     
    34.2f 
    .de 
    b3. 
    

    oder Hexadezimalziffer Sequenz (ganze Zahl hexadezimal), zum Beispiel:

     
    2f4 
    10 
    

    Der zweite Teil beschreibt im Grunde die Mantisse.

  • [pP][+-]?[0-9]+: Binäre Exponententeil (dezimal angegeben), zum Beispiel:

     
    p-4 
    p20 
    

    Wir einen hexadezimalen angeben Gleitkomma Konstante durch die Mantisse in hexadezimalen Angabe und den Exponenten B (für Basis 2) in Dezimal.

  • [flFL]?: Optional floating Suffix, den Typ anzuzeigen (float, double oder long double).