2013-12-18 19 views
6

ho provato seguente:dump hex galleggiante in C++

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

Ma scaricato in decimale. Mi piacerebbe vedere 11.01 (17.0625 in hex). Come posso stampare un valore in virgola mobile in hex?

Si prega di non offrire soluzioni come:

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; 
     } 
    } 
} 

Esiste un modo per fare uscire numeri float in esadecimale in STL/aumentare?

+0

Onestamente, trovo che C++ sia piuttosto fastidioso durante l'emissione di tali moduli formattati. In questi casi, utilizzo la stampa in stile C formattata. – Xephon

+0

Dovrai 'memcpy' in un' int', e stampare la rappresentazione esadecimale di quello. 'memcpy' è l'unico modo sicuro per visualizzare i bit che costituiscono un oggetto di un tipo come un altro tipo senza colpire il comportamento non definito (si ottiene invece un comportamento non specificato, e spetta a te sapere che i bit costituiscono un' int valido 'rappresentazione). – BoBTFish

+1

Vuoi la rappresentazione esadecimale del layout di memoria di un 'double' o stampare un valore FP leggibile dall'uomo nella base 16? –

risposta

4

Altri hanno già suggerito una soluzione C++ 11 ma la tua domanda non ha il tag C++ 11. Ecco una soluzione ISO C99, che utilizza gli specificatori di formato %a e %la dello standard ISO C99.

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

I seguenti programma stampa 0X1.11P+4.

#include <stdio.h> 

int main() { 

    double x = 17.0625; 

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

} 

Ecco un esempio che mostra come leggere e scrivere numeri in virgola mobile in formato esadecimale.

#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); 

} 

Se questioni di portabilità o si è bloccato con un compilatore più vecchio, è un approccio ragionevole a mio parere.

+0

Grazie, è bello soluzione.Tuttavia, non penso che funzionerebbe mai con boost :: multiprecision. Proverò alcune soluzioni boost :: tr1 prima di contrassegnarlo come risposta. – Sergei

+0

@Sergei Non penso che esista una soluzione standard che possa funzionare con boost :: multiprecision. [Una rapida ricerca su google] (https://groups.google.com/forum/#!topic/boost-list/68ftUb1XRoM) sembra indicare che il supporto per la serializzazione per boost :: multiprecision è pianificato ma non ancora disponibile all'interno di boost. – Ali

3

std::hexfloat è un manipolatore di formato per stampare valori in virgola mobile in una rappresentazione esadecimale. È esistito dallo standard del 2011.

+1

Non funziona in GCC 4.8.1 che ho provato. – Sergei

6

Prova cout << std::hexfloat << 1.0625; Ciò richiede C++ 11.

+0

secondo questo http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html # status.iso.2011 non è ancora stato implementato in GCC. Any cross platform analog? boost :: tr1? – Sergei

+0

Provato su GCC 5.3, funziona, ma ancora non funziona con boost :: multiprecision – Sergei