Комментарии 7
Из-за ошибки переполнения датчик выдавал такие случайные числа, что если очередную их тройку считать за три координаты, то все точки оказываются на графике в семи параллельных плоскостях.
Дело не в ошибке переполнения - это принципиальное свойство датчиков ПСЧ, использующих линейный конгруэнтный метод (по Кнуту). Обычно для них вычисления выполняются по модулю, равному размеру слова ЦП, соответственно, переполнения игнорируются. И может оказаться, например, что если выбирать ПСЧ тройками и использовать как координаты точек в единичном кубе, то все полученные точки лежат в нескольких плоскостях вместо того, чтобы более-менее равномерно заполнять куб.
Такая неприятная особенность была обнаружена в ПСЧ из библиотеки IBM для числового моделирования для Фортрана, откуда, вероятно, и пошла эта байка.
"Но я все-таки решил использовать вариант, при котором условные переходы по переполнению не выполняются, хотя, может быть, он и чаще будет длиннее по кодам." - вы сравнивали оба варианта по быстродействию? (в нормальном без переполнения виде). навскидку - должно быть примерно одинаково, предсказание переходов по идее будет работать так же для 100% случившихся и не случившихся jump.
Здесь все-таки говориться о командах x64, а у них и длинна самих команд в своей совокупности больше и требования к конвейеру больше и сами конвейеры больше и так далее и тому подобное, поэтому делать вместо INTO, JNO INT 4 думаю не так страшно.
Но даже так все регистры 64 битные, а не 32 по умолчанию, поэтому переполнение уже не будет тем что было раньше.
Вы должны быть счастливы, что хотя бы оставили JO. В WebAssembly тупо нет этих флагов, и приходится полагаться на AdaMagic standard.h:
/* Subtraction overflows iff x and y have different signs,
and the result and x have different signs. */
#define s_32_minus_v(result, x, y) /* result = x - y; */ \
do { \
const int32 _xcopy = (x); \
const int32 _ycopy = (y); \
const int32 _diff_sign = _xcopy ^ _ycopy; \
/* The sign bit of _diff_sign is set iff x and y have \
different signs. */ \
(result) = _xcopy - _ycopy; \
if ((_diff_sign & ((result) ^ _xcopy)) < 0) rts_overflow(); \
/* The sign bit of "((result) ^ _xcopy)" is set iff result and x have \
different signs. Overflow if that and _same_sign both have \
sign bits set. */ \
} while (0)
А WebAssembly сегодня понужнее будет amd64
Контроль переполнения. Как уменьшить длину, увеличивая путь