2013-12-18 10 views
6

Ich habe versucht, folgende:Dump Hex-Schwimmer in C++

std::cout << std::hex << 17.0625; 

Aber es abgeladen es in dezimal. Ich würde gerne 11.01 (17.0625 in Hex) sehen. Wie kann ich einen Gleitkommawert in Hex ausgeben?

Bitte nicht bieten Lösungen wie:

void outhexdigits(std::ostream& out, fp_t d, int max_chars=160) 
{ 
    while(d > 0. && max_chars) 
    { 
     while(d < 1. && max_chars){ 
      out << '0'; 
      --max_chars; 
      d*=16; 
     } 

     if (d>=1. && max_chars) { 
      int i = 0; 
      while (d>=1.) 
       ++i, --d; 
      out << std::hex << i; 
      --max_chars; 
     } 
    } 
} 

Gibt es eine Möglichkeit Float-Zahlen in hex in STL-Dump/steigern?

+0

Ehrlich gesagt finde ich, dass C++ bei der Ausgabe solcher formatierter Formulare ziemlich nervig ist. In diesen Fällen verwende ich formatierten Druck im C-Stil. – Xephon

+0

Sie müssen 'memcpy' in ein' int' und die hexadezimale Darstellung davon ausdrucken. 'memcpy' ist die einzige sichere Möglichkeit, die Bits, die ein Objekt eines Typs bilden, als einen anderen Typ zu betrachten, ohne Undefined Behavior zu treffen (Sie treffen stattdessen ein unspezifiziertes Verhalten und es liegt an Ihnen zu wissen, dass die Bits ein gültiges int bilden "Repräsentation". – BoBTFish

+1

Möchten Sie die hexadezimale Darstellung des Speicherlayouts eines "double" oder einen lesbaren FP-Wert in der Basis 16 drucken? –

Antwort

4

Andere haben bereits eine C++ 11-Lösung vorgeschlagen, aber Ihre Frage enthält nicht das C++ 11-Tag. Hier ist eine ISO C99 Lösung, die die Formatbezeichner %a und %la aus dem ISO C99 Standard verwendet.

I'd like to see 11.01 (17.0625 in hex).

folgende Programm druckt 0X1.11P+4.

#include <stdio.h> 

int main() { 

    double x = 17.0625; 

    printf("17.0625 in hexadecimal is: %A\n", x); 

} 

Hier ist ein Beispiel dafür, wie in Hexadezimal-Format Gleitkommazahlen lesen und zu schreiben.

#include <stdio.h> 

int main() { 

    double x = 0.1; 

    char* str = "0X1.999999999999AP-4"; 

    printf("0.1 in hexadecimal is: %A\n", x); 

    printf("Now reading %s\n", str); 

    /* in a production code I would check for errors */ 
    sscanf(str, "%lA", &x); /* note: %lA is used! */ 

    printf("It equals %g\n", x); 

} 

Wenn Portabilität Fragen oder Sie mit einem älteren Compiler stecken geblieben sind, ist es ein sinnvoller Ansatz meiner Meinung nach.

+0

Danke, es ist nett Lösung.Ich denke jedoch nicht, dass es jemals mit boost :: multicrecision funktionieren würde. Ich werde einige boost :: tr1 Lösungen versuchen, bevor Sie dies als Antwort markieren. – Sergei

+0

@Sergei Ich glaube nicht, dass es eine Standardlösung gibt, die mit boost :: multiprecision funktionieren würde. [Eine schnelle Google-Suche] (https://groups.google.com/forum/#!topic/boost-list/68ftUb1XRoM) scheint darauf hinzudeuten, dass die Unterstützung der Serialisierung für boost :: multicrecision zwar geplant, aber noch nicht in Boost verfügbar ist. – Ali

3

std::hexfloat ist ein Formatmanipulator zum Drucken von Fließkommawerten in hexadezimaler Darstellung. Es existiert seit dem Standard 2011.

+1

Es funktioniert nicht in GCC 4.8.1, dass ich versuchte – Sergei

6

Versuchen Sie cout << std::hexfloat << 1.0625; Dies erfordert C++ 11.

+0

nach diesem http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html # status.iso.2011 es wurde noch nicht in GCC implementiert.Jede plattformübergreifende Analogie? boost :: tr1? – Sergei

+0

Versucht auf GCC 5.3, es funktioniert. Aber immer noch nicht mit boost :: multicrecision. – Sergei