2016-08-23 59 views
-1

我想取一個32位隨機字符串並將此位字符串聲明爲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++中創建一個隨機浮點數,但我不知道如何。隨機我的意思是每個位獨立爲0或1.解決方案(例如:C++ random float number generation)我發現建議使用隨機整數發生器,然後除以RAND_MAX,然後乘以FLOAT_MAX或以某種其他方式創建浮點數根據一些統一的分佈。這對我來說並不好,因爲價值會平均分配,這會產生更多的浮動指數。

基本上這個問題,但對於C++:Convert Double to Binary representation?

+1

如果你想要的是一個隨機浮點數看到:HTTP:/ /stackoverflow.com/questions/686353/c-random-float-number-generation – NathanOliver

+2

'int32_t x =/*隨機值* /; float f = *(float *)&x;'。不要說這是個好主意,或者不會違反任何規則。但這是可以完成的。 –

+0

std :: bitset,也許?另外,你似乎在問兩個完全不同的問題。你能澄清嗎? – JETM

回答

1

如果你只是想那吐出指數分佈浮動的RNG,您不必擔心二進制表示。只需使用數學。

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

如果你想隨意生成視爲浮點字節,你可以做到這一點,而不是...

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

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

我擔心這可能會有問題,這意味着它不會完全隨機。例如,如果用十進制數表示一個數字,它的最後一位數字不能是2,3或7(因爲平方的最低位完全由輸入的最低位數決定)。我知道這不適用,這裏可能有類似的東西。特別是在我的盒子裏,rand()給出了一個31位整數,因此與2^32個不同的F32數字(儘管其中的2^23個代表NaN)相比,該函數至多有2^31個輸出。 –

+1

我用一個代碼片段更新了我的答案,它只需要一個'int'的字節並將其放入一個'float'中。怎麼樣? – QuestionC

相關問題