2016-08-23 6 views
-1

Ich möchte eine zufällige Zeichenfolge von 32 Bits nehmen und diese Bit-Zeichenfolge zu einem Float in C++ deklarieren.Machen Sie eine Fließkommazahl aus einer Binärzeichenfolge in C++

Zum Beispiel sollte die Zeichenfolge 0.0111 1111.1000 0000 0000 0000 0000 000 mir den Float entsprechend 1.5 geben, da dies die F32-Definition von 1,5 nach IEEE 754-2008 ist. Die erste 0 bedeutet + ve, die nächsten 8 geben Ihnen einen Exponenten von 127-127 = 0, und die 23-Bit-Mantisse gibt Ihnen die .5.

Wenn ein String kein gutes Datenformat dafür ist, würde ich mich freuen, Vorschläge zu hören.

Eigentlich möchte ich eine zufällige Fließkommazahl in C++ erstellen, aber ich weiß nicht wie. Wo per Zufall ich meine jedes Bit ist unabhängig 0 oder 1. Die Lösungen (zum Beispiel hier: C++ random float number generation) Ich habe vorgeschlagen, mit einem zufälligen ganzzahligen Generator dann dividiert durch die RAND_MAX und dann mit FLOAT_MAX multiplizieren oder auf andere Weise einen float erstellen nach einer einheitlichen Verteilung. Das ist nicht gut für mich, während die Werte gleichmäßig verteilt werden, dies wird mehr Floats mit großen Exponenten erzeugen.

Grundsätzlich ist diese Frage aber für C++: Convert Double to Binary representation?

+1

Wenn alles, was Sie wollen eine zufällige Gleitkommazahl ist zu finden unter: http://stackoverflow.com/questions/686353/c-random-float-number-generation – NathanOliver

+2

'int32_t x =/* Zufallswert * /; float f = * (float *) & x; '. Nicht zu sagen, das ist eine gute Idee oder wird keine Regeln brechen. Aber es kann getan werden. –

+0

std :: bitset, vielleicht? Außerdem scheint es, als würden Sie zwei völlig verschiedene Fragen stellen. Könnten Sie das klären? – JETM

Antwort

1

Wenn Sie nur ein RNG wollen, dass ein exponentiell verteilte Schwimmer ausspuckt, müssen Sie sich keine Gedanken über binäre Darstellung sorgen. Benutze einfach Mathe.

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <assert.h> 
#include <math.h> 

int main (void) { 
    int i; 

    srand (time(NULL)); 

    // Make 10 'random' floats 
    for (i = 0; i < 10; ++i) 
    { 
     // Float exponents go from -128 to 127 
     float exponent = -128 + 256 * (float) rand()/RAND_MAX; 

     float result = pow(2, exponent); 

     printf ("%g\n", result); 
    } 

    return 0; 
} 

Wenn Sie möchten, willkürlich Bytes als float interpretiert generieren, können Sie diese stattdessen tun ...

int i = rand(); 
float result = *((float *)&i); 

printf ("%g\n", result); 
+0

Ich mache mir Sorgen, dass es Probleme damit geben könnte, was bedeuten würde, dass es nicht völlig zufällig wäre. Wenn Sie zum Beispiel eine Zahl in Dezimalzahlen quadrieren, kann die letzte Ziffer niemals eine 2, 3 oder 7 sein (da die niedrigste Ziffer des Quadrats vollständig von der niedrigsten Ziffer der Eingabe bestimmt wird). Ich weiß, dass das hier nicht gilt, da könnte etwas Ähnliches sein. Speziell auf meiner Box 'rand()' gibt eine 31-Bit-Ganzzahl, so gibt es höchstens 2^31 Ausgänge von dieser Funktion im Vergleich zu den 2^32 verschiedenen F32-Nummern (obwohl 2^23 von ihnen NaN darstellen). –

+1

Ich habe meine Antwort mit einem Code-Snippet aktualisiert, der nur die Bytes eines 'int' und in ein' float' schiebt. Wie ist das? – QuestionC

Verwandte Themen