Насколько велики вариации вычислений с плавающей точкой на современных процессорах? - PullRequest
0 голосов
/ 07 апреля 2020

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

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

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

Однако мне интересно, поскольку мне нужно только 8 бит для дробной части числа, если этот полностью самодельный подход действительно мудр. Если различия между процессорами в отношении синуса, косинуса и т. Д. В любом случае всегда намного ниже моей точности 1/256, я мог бы просто использовать обычную функцию синуса, которая возвращает число с плавающей запятой, и преобразовать его в мое фиксированное значение. номер точки. Разговор будет такой для примера синуса:

const double factor = pi/512;
int x = 512; //example which is equal to pi
int q = round(256*sin(factor*x)); //= 0

Я нацеливаюсь на компьютеры, которые могут запускать 3d-игры и не старше 15 лет. Я намереваюсь сделать многопоточность, если это также имеет значение.

Но для этого мне нужно знать худшие случаи того, насколько синус / косинус может варьироваться. В идеале включение графических процессоров в качестве потенциального вычислительного устройства. Может кто-нибудь указать мне на полезные источники?


EDIT1:

Оставаясь на примере синуса, я вычислил все числа с фиксированной точкой в ​​пределах 0 <= x < = 256 (то есть от 0 до pi / 2) и посмотрите, как близко результирующее, незаземленное число находится к краю, где округление будет «опрокидываться». </p>

Наихудший случай случается при x = 108, что приводит к q = ~ 157.4992872 на процессоре Intel i5-3470. Может ли вариация быть достаточно большой, чтобы опрокинуть ее до 157,5?

Я также рассматриваю возможность использования пользовательской функции округления для каждой математической функции. В случае синуса и косинуса я бы округлил до 0,465972289906148 вместо 0,5, потому что это значение находится в пределах одного из самых больших пробелов из всех возможных значений. Без коэффициента 256 вне синуса значение находится в интервале ± 0,00004324, что намного более терпимо, чем при 0,5. (Который находится в интервале +0,00000273 / -0,00000139)

...