На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Переполнению быть или не быть?
    Я на С не пишу. Но увидел в инете код ГСЧ:

    ExpandedWrap disabled
      #define RAND_MAX 32767
       
      static unsigned long int next = 1;
       
      int rand(void)
      {
        next = next * 1103515245 + 12345;
        return (unsigned int)(next/65536) % (RAND_MAX + 1);
      }
       
      void srand(unsigned int seed)
      {
        next = seed;
      }


    Вопрос: разве тут не возникнет в некий момент переполнение?
    ExpandedWrap disabled
      next = next * 1103515245 + 12345;


    ведь по формуле когруэнтного ГСЧ X(n+1)=(a*Xn+c) mod m (где m у нас или 2^31 или 2^32, a=1103515245, c=12345 ) отсутствует "обрезание", т.е. взятие остатка от деления. Или на С результат автоматом урезается, если не влазит в размер переменной?
      Цитата BlackSun @
      Или на С результат автоматом урезается, если не влазит в размер переменной?

      Да. Но правильнее говорить - усекается.
        В соответствие со Стандартом, беззнаковая арифметика априори не переполняется. Все вычисления идут по модулю 2N, где N количество значащих бит беззнакового целого типа. Однако на знаковую арифметику это не распространяется. Переполнения в знаковой арифметике возможны, реакция на них исполнительной системы не специфицируется и определяется реализацией. По факту большинство платформ всё равно просто игнорят "лишние" старшие биты, но возможны любые другие варианты, не исключая... э-э-э, исключений.
          Цитата Qraizer @
          но возможны любые другие варианты, не исключая... э-э-э, исключений

          Упс :-? А можно пример такой ситуации (платформы, компиляторы)? Тупо чтобы оценить глубину глубин.

          Добавлено
          Нашел сам :)

          Цитата
          MIPS I has instructions to perform addition and subtraction. These instructions source their operands from two GPRs (rs and rt), and write the result to a third GPR (rd). Alternatively, addition can source one of the operands from a 16-bit immediate (which is sign-extended to 32 bits). The instructions for addition and subtraction have two variants: by default, an exception is signaled if the result overflows; instructions with the "unsigned" suffix do not signal an exception. The overflow check interprets the result as a 32-bit two's complement integer.
            Дайте, плиз, 4 первых числа от lrand() и 4 от rand(), но сначала сделайте инициализацию srand(0) перед каждым циклом вывода. И напишите, плиз, какой именно Си вы используете.
            Сообщение отредактировано: BlackSun -
              BlackSun
              Ну, если считать переполнением превышение 2^31-1, то его ты точно превысишь. И ответ станет отрицательным.
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0243 ]   [ 17 queries used ]   [ Generated: 28.03.24, 10:35 GMT ]