Как быстро преобразовать однородное случайное целое число в значение с плавающей запятой с равным количеством положитель ⇐ C++
-
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]. (результат все еще может быть смещен двумя нулями, но это нормально)
Я не могу выполнить простое приведение, так как отрицательных значений на одно больше, чем положительных. Что еще хуже, минимальное значение имеет большее значение абс, чем максимальное значение. Не имеет значения, совпадает ли значение с исходным целым числом со знаком. Это просто должно быть одинаковое число, а 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]. (результат все еще может быть смещен двумя нулями, но это нормально)
Мобильная версия