Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.138.204.8] |
|
Сообщ.
#1
,
|
|
|
Я на С не пишу. Но увидел в инете код ГСЧ:
#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; } Вопрос: разве тут не возникнет в некий момент переполнение? next = next * 1103515245 + 12345; ведь по формуле когруэнтного ГСЧ X(n+1)=(a*Xn+c) mod m (где m у нас или 2^31 или 2^32, a=1103515245, c=12345 ) отсутствует "обрезание", т.е. взятие остатка от деления. Или на С результат автоматом урезается, если не влазит в размер переменной? |
Сообщ.
#2
,
|
|
|
Цитата BlackSun @ Или на С результат автоматом урезается, если не влазит в размер переменной? Да. Но правильнее говорить - усекается. |
Сообщ.
#3
,
|
|
|
В соответствие со Стандартом, беззнаковая арифметика априори не переполняется. Все вычисления идут по модулю 2N, где N количество значащих бит беззнакового целого типа. Однако на знаковую арифметику это не распространяется. Переполнения в знаковой арифметике возможны, реакция на них исполнительной системы не специфицируется и определяется реализацией. По факту большинство платформ всё равно просто игнорят "лишние" старшие биты, но возможны любые другие варианты, не исключая... э-э-э, исключений.
|
Сообщ.
#4
,
|
|
|
Цитата 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. |
Сообщ.
#5
,
|
|
|
Дайте, плиз, 4 первых числа от lrand() и 4 от rand(), но сначала сделайте инициализацию srand(0) перед каждым циклом вывода. И напишите, плиз, какой именно Си вы используете.
|
Сообщ.
#6
,
|
|
|
BlackSun
Ну, если считать переполнением превышение 2^31-1, то его ты точно превысишь. И ответ станет отрицательным. |