Заполнение массива элементами типа float - C (СИ)
Формулировка задачи:
Здравствуйте! Мне надо заполнить массив элементами типа float, причем это должны быть числа из ВСЕГО диапазона допустимых значений.
У меня идея такая: генерирую с помощью frand() 2 числа, и их разность умножаю на 10в степени от 0 до 38. т.е.:
И возникла проблема как это сделать? 1E+(константа) должно быть..
Подскажите как сделать,чтоб степень рандомной была?
Или подскажите каким ещё способом можно массив заполнить))
Заранее спасибо.
#define frand() ((float) rand()/(RAND_MAX+1.0)) (frand()-frand())*1E+(какая-то степень от 0 до 38).
Решение задачи: «Заполнение массива элементами типа float»
textual
Листинг программы
float frand()
{
union {
unsigned int i;
unsigned char c[sizeof(float)];
float f;
} mix;
do {
for(int i=0; i<4; ++i)
mix.c[i] = static_cast<unsigned char>(rand()%256); // заполним число случайными байтами
} while((mix.i & 0x7f800000) == 0x7f800000); // Если получилась бесконечность или NAN, повторим
return mix.f;
}
Объяснение кода листинга программы
- Объявлена функция
frand(), которая возвращает типfloat. - В функции используется структура
unionс именемmix, которая содержит следующие поля:i- переменная типаunsigned intc- массив типаunsigned charразмером 4 байтаf- переменная типаfloat
- В функции используется цикл
do, который выполняется до тех пор, пока не будет получено значение, не равное 0x7f800000. - Внутри цикла
doиспользуется вложенный циклfor, который заполняет массивcслучайными байтами от 0 до 255. - Значение переменной
mix.iпроверяется на равенство 0x7f800000. Если это так, то текущее значение не подходит, и мы возвращаемся к началу циклаdo. - После выхода из цикла
doвозвращается значение переменнойmix.f. - Значение, возвращаемое функцией
frand(), будет случайным числом типаfloatв диапазоне от -6.24 до 6.24.