2016-08-23 5 views
-1

ランダムな32ビットの文字列をとり、このビット文字列をfloatにしてC++と宣言します。C++のバイナリ文字列から浮動小数点数を作る

例えば、文字列0.0111 1111.1000 0000 0000 0000 0000 000は、1.5に対応する浮動小数点数を私に与える必要があります。これは、IEEE 754-2008の1.5のF32定義です。最初の0平均+ ve、次の8は127-127 = 0の指数を与え、23ビットの仮数は.5を与えます。

文字列がこれに適したデータ形式でない場合、私は提案を聞いてうれしいです。

実際、C++でランダムな浮動小数点数を作成したいのですが、どうすればよいか分かりません。私が見つけたソリューション(例えば、C++ random float number generation)は、ランダム整数ジェネレータを使ってRAND_MAXで除算し、次にFLOAT_MAXで乗算するか、何らかの方法で浮動小数点数を生成することを提案していますある一定の分布に従って。値が均等に分布している間は、これは私には良くないことです。これは大きな指数を持つより多くの浮動小数点を生成します。

基本的に、この質問が、C++のために:あなただけの指数分布山車を出してくれるRNGをしたい場合はConvert Double to Binary representation?

+1

これを行うことができますあなたが望むすべてがランダムな浮動小数点数である場合は、参照します。http:/ /images/686353/c-random-float-number-generation – NathanOliver

+2

'int32_t x =/*ランダム値* /; float f = *(float *)&x; '。これはいいアイデアだと言っているわけではなく、ルールを破ったりもしません。しかし、それを行うことができます。 –

+0

std :: bitset、多分?また、全く別の2つの質問をしているようです。明確にできますか? – JETM

答えて

1

、あなたはバイナリ表現を心配する必要はありません。ちょうど数学を使う。

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

あなたが任意にfloatとして解釈バイトを生成したい場合は、あなたが...代わりに

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

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

これは完全にランダムではないということに問題があるかもしれないと心配しています。たとえば、10進数で数値を2乗すると、最後の数字は2、3、または7になることはありません(正方形の最下位桁は入力の最下位桁で完全に決まるため)。私はこれがここには当てはまらないことが分かっています。特に私のボックス 'rand()'は31ビットの整数を与えるので、2^32の異なるF32番号(2^23はNaNを表します)と比較して、この関数からの出力は最大2^31です。 –

+1

私は自分の答えを 'int'のバイト数だけ取り出して' float'に変換するコードスニペットで更新しました。どのようだ? – QuestionC

関連する問題