Есть ли у Actionscript математическая спецификация? - PullRequest
0 голосов
/ 09 июня 2018

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

Это заставляет меня задуматься, имеет ли ActionScript плавающийточечная математическая спецификация? Если это так, что она говорит о точности и детерминизме вычислений?

Я сравниваю с Java, в котором проводится различие между обычной математикой с плавающей точкой с классом Math и детерминированным плавающимуказать классом StrictMath и ключевым словом strictfp.Оба всегда находятся в пределах 1 ulp от точного результата, это также подразумевает, что обычная математика и строгая математика всегда дают результаты в пределах 1 ulp друг от друга для одной операции или вызова функции.Документы очень ясно об этом.Я ожидаю, что другие респектабельные языки будут иметь что-то похожее, скажем, насколько точны их вычисления с плавающей запятой и если они дают одинаковые результаты везде.


Обновление, так как некоторые люди говорят, что игра нечестная:

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

Что касается того, что мы знаем до сих пор, это результаты на тестовом уровне:

Large table showing 5 different results for various users.

Например, если я использую 32-разрядную версию Chrome на своем настольном компьютере (AMD A10-5700 в качестве процессора), я всегда получу результат «946 тиков».Но если я вместо этого запускаю Firefox или Internet Explorer, я всегда получаю результат «794 тиков».

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Согласно документам , Actionscript имеет универсальный Number тип данных в дополнение к int и uint типам:

Тип данных Numberиспользует 64-битный формат двойной точности, как указано в стандарте IEEE для двоичной арифметики с плавающей точкой (IEEE-754).Этот стандарт диктует, как числа с плавающей запятой хранятся с использованием 64 доступных битов.Один бит используется для обозначения, является ли число положительным или отрицательным.Одиннадцать бит используются для показателя степени, который сохраняется как основание 2. Остальные 52 бита используются для хранения значения и (также называемого мантиссой), числа, которое возводится в степень, указанную показателем степени.

Используя некоторые из своих битов для хранения показателя степени, тип данных Number может хранить числа с плавающей запятой значительно больше, чем если бы он использовал все свои биты для значимости.Например, если тип данных Number использует все 64 бита для хранения значения, он может хранить число, равное 265 - 1. Используя 11 бит для хранения показателя степени, тип данных Number может повысить свое значение до степени21023.

Хотя этот диапазон чисел огромен, он достигается ценой точности.Поскольку тип данных Number использует 52 бита для хранения значений, числа, для точного представления которых требуется более 52 бит, например дробь 1/3, являются лишь приблизительными.Если вашему приложению требуется абсолютная точность с десятичными числами, используйте программное обеспечение, которое реализует десятичную арифметику с плавающей точкой, а не двоичную арифметику с плавающей точкой.

Это может учитывать различные результаты, которые вы видите.

0 голосов
/ 11 июня 2018

Actionscript на самом деле не имеет математической спецификации в этом смысле.Это самое близкое, что вы получите:

https://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Math.html

В нижней части верхней части написано:

Математические функции acos, asin,atan, atan2, cos, exp, log, pow, sin и sqrt могут приводить к немного различным значениям в зависимости от алгоритмов, используемых процессором или операционной системой.Среда выполнения флэш-памяти вызывает ЦП (или операционную систему, если ЦП не поддерживает вычисления с плавающей запятой) при выполнении вычислений для перечисленных функций, и результаты показывают небольшие различия в зависимости от используемого ЦП или операционной системы.

Итак, чтобы ответить на два наших вопроса:

Что это говорит о точности?На самом деле ничего.Ни в коем случае не упоминается предел неточности результата.

Что это говорит о детерминизме?Оборудование и операционная система, безусловно, являются факторами, поэтому они зависят от платформы.Нет подтверждения другим факторам.

Если вы хотите посмотреть глубже, вы сами.

...