Избегайте автоматического преобразования из Fixnum в Bignum в Ruby - PullRequest
3 голосов
/ 27 июня 2011

Я портирую алгоритм с C # на Ruby. Этот алгоритм имеет один метод, который возвращает int, который иногда переполняется.

    private static int NextRandom(int n)
    {
        return 1234567890 * n + 12345;
    }

Алгоритм использует переполнение, чтобы избежать выхода значений, возвращаемых этой функцией. Тем не менее, Ruby ведет себя по-другому, и он автоматически преобразует значения в Bignum, который, кажется, не имеет ограничения ... Как я могу добиться того же в Ruby?

Ответы [ 2 ]

6 голосов
/ 27 июня 2011

Если вы хотите, чтобы число обернулось на определенном уровне, вам может потребоваться ограничить его вручную:

def next_random(n)
  (1234567890 * n + 12345) % 0x7FFFFFFF
end

Вы можете выбрать любой желаемый лимит, где этот пример имеет 32-битную подпись.

Не думаю, что вы можете зафиксировать численные расчеты в произвольном диапазоне.

0 голосов
/ 27 июня 2011

Одним из возможных решений является написание оболочки OverflowingInteger и переполнение вручную, как и ожидалось. Недостатком является то, что вам нужно конвертировать все целые числа в OverflowingInteger, по крайней мере, во время вычислений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...