Вероятно, это вопрос к эксперту x86 FPU:
Я пытаюсь написать функцию, которая генерирует случайное значение с плавающей запятой в диапазоне [min, max]. Проблема в том, что мой алгоритм генератора (Mersenne Twister с плавающей точкой, если вам любопытно) возвращает только значения в диапазоне [1,2) - то есть я хочу включить верхнюю границу, но мое сгенерированное «исходное» значение из эксклюзивной верхней границы. Подвох в том, что базовый генератор возвращает 8-байтовое двойное число, но мне нужно только 4-байтовое число с плавающей запятой, и я использую режим округления FPU по умолчанию - Nearest.
Что я хочу знать, так это то, приведет ли само усечение в этом случае к тому, что мое возвращаемое значение будет включать в себя значение max, когда внутреннее 80-битное значение FPU достаточно близко, или я должен увеличить значение моего максимального значения до того, как умножение его на промежуточное случайное число в [1,2), или я должен изменить режимы FPU. Или любые другие идеи, конечно.
Вот код, который я сейчас использую, и я проверил, что 1.0f преобразуется в 0x3f800000:
float MersenneFloat( float min, float max )
{
//genrand returns a double in [1,2)
const float random = (float)genrand_close1_open2();
//return in desired range
return min + ( random - 1.0f ) * (max - min);
}
Если это имеет значение, это должно работать как на Win32 MSVC ++, так и на Linux gcc. Кроме того, использование каких-либо версий оптимизации SSE изменит ответ на этот вопрос?
Редактировать: Ответ - да, усечение в этом случае от двойного до плавающего достаточно, чтобы результат включал макс. См. Ответ Crashworks для более подробной информации.