Это, вероятно, вопрос для эксперта x86 FPU:с плавающей точкой, когда округление усечения
Я пытаюсь написать функцию, которая генерирует случайное значение с плавающей точкой в диапазоне [мин], макс. Проблема в том, что мой алгоритм генератора (с плавающей точкой Mersenne Twister, если вам интересно) возвращает только значения в диапазоне [1,2) - то есть, я хочу инклюзивную верхнюю границу, но мое «исходное» генерируемое значение от исключительной верхней границы. Ловушка здесь заключается в том, что базовый генератор возвращает 8-байтовый двойной, но мне нужен только 4-байтовый float, и я использую режим округления 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, измените ответ на этот вопрос?
Редактировать: Ответ да, усечение в этом случае от double до float является достаточным, чтобы результат включал максимум. См. Ответ Crashworks для получения дополнительной информации.
Теперь почему я не подумал запустить этот тест среди других, с которыми я работал :) Я обнаружил, что с усечением, 1.99999 будет округлять до двух с и без/arch: SSE2. Благодаря! –
Рад помочь - мне было любопытно, какой результат теста будет сам. – Crashworks