Как быстро преобразовать однородное случайное целое число в значение с плавающей запятой с равным количеством положительC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как быстро преобразовать однородное случайное целое число в значение с плавающей запятой с равным количеством положитель

Сообщение Anonymous »


Я не могу выполнить простое приведение, так как отрицательных значений на одно больше, чем положительных. Что еще хуже, минимальное значение имеет большее значение абс, чем максимальное значение. Не имеет значения, совпадает ли значение с исходным целым числом со знаком. Это просто должно быть одинаковое число, а min и max должны иметь значение сохранения абс.

Я придумал два способа, но они в два раза медленнее, чем простой каст (который и так медленный)

double simple_cast(std::uint32_t u) { return (double)(std::int32_t)u; //пристрастный } двойной симметричный_cast_signed_mag(std::uint32_t u) { автоматический знак = u >> 31; auto val = (double) (u & 0x7ffffffff); если (знак == 1) { вернуть -вал; } вернуть значение; } двойной симметричный_cast_reject_min(std::uint32_t u) { авто я = (std::int32_t)u; if (i == std::numeric_limits::min()) { вернуть 0; } вернуть (двойной)u; } Вы можете предположить, что все возможные значения, которые может представлять целое число, являются возможными входными данными для функций приведения. Результат должен иметь тип double и находиться в диапазоне [-INT32_MAX, INT32_MAX]. (результат все еще может быть смещен двумя нулями, но это нормально)
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»