2016-08-23 3 views
-1

Я хочу взять случайную строку из 32 бит и объявить эту битовую строку как float в C++.Сделать число с плавающей точкой из двоичной строки в C++

Например, строка 0.0111 1111.1000 0000 0000 0000 0000 000 должна дать мне поплавок, соответствующий 1.5, поскольку это определение F32 в соответствии с IEEE 754-2008. Первый 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 :: bitet, может быть? Кроме того, похоже, вы задаете два совершенно разных вопроса. Не могли бы вы уточнить? – 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; 
} 

Если вы хотите, чтобы произвольно генерировать байты истолкованы как поплавок, вы можете сделать это вместо того, чтобы ...

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

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

Я беспокоюсь, что могут быть проблемы с этим, что означало бы, что это не будет полностью случайным. Например, если вы набираете число в десятичном значении, конечная цифра никогда не может быть 2, 3 или 7 (так как самая низкая цифра квадрата полностью определяется младшей цифрой ввода). Я знаю, что это не применимо здесь, может быть что-то подобное. В частности, на моем ящике 'rand()' дает 31-битное целое число, поэтому из этой функции не более 2^31 выходов по сравнению с 2^32 разными номерами F32 (хотя 2 из 23 из них представляют NaN). –

+1

Я обновил свой ответ фрагментом кода, который просто берет байты 'int' и вставляет его в' float'. Как это? – QuestionC

Смежные вопросы