Как стать автором
Обновить

Комментарии 7

Из-за ошибки переполнения датчик выдавал такие случайные числа, что если очередную их тройку считать за три координаты, то все точки оказываются на графике в семи параллельных плоскостях.

Дело не в ошибке переполнения - это принципиальное свойство датчиков ПСЧ, использующих линейный конгруэнтный метод (по Кнуту). Обычно для них вычисления выполняются по модулю, равному размеру слова ЦП, соответственно, переполнения игнорируются. И может оказаться, например, что если выбирать ПСЧ тройками и использовать как координаты точек в единичном кубе, то все полученные точки лежат в нескольких плоскостях вместо того, чтобы более-менее равномерно заполнять куб.

Такая неприятная особенность была обнаружена в ПСЧ из библиотеки IBM для числового моделирования для Фортрана, откуда, вероятно, и пошла эта байка.

А мне очень интересно откуда автор взял про 7 плоскостей.

"Но я все-таки решил использовать вариант, при котором условные переходы по переполнению не выполняются, хотя, может быть, он и чаще будет длиннее по кодам." - вы сравнивали оба варианта по быстродействию? (в нормальном без переполнения виде). навскидку - должно быть примерно одинаково, предсказание переходов по идее будет работать так же для 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

Да-да. Я счастлив, что хоть трусы флаг А "тетрадного переноса" еще оставили в регистре флагов, поскольку кроме эмуляции целочисленного переполнения, я еще использую и эмуляцию команд DAA и DAS

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации