Детерминированная плавающая точка и.NET

Как я могу гарантировать, что вычисления с плавающей точкой в приложении.NET (говорят в C#) всегда приводят к тому же разрядно-точному результату? Особенно при использовании различных версий.NET и работе различных платформ (x86 по сравнению с x86_64). Погрешности операций с плавающей точкой не имеют значения.

В Java я использовал бы strictfp. В C/C++ и других низкоуровневых языках эта проблема по существу решена путем доступа к FPU / регистры управления SSE, но это, вероятно, не возможно в.NET.

Даже с управлением регистра управления FPU JIT.NET сгенерирует другой код на различных платформах. Что-то как HotSpot было бы еще хуже в этом случае...

Почему мне нужен он? Я думаю о записи игры стратегии в реальном времени (RTS), которая в большой степени зависит от быстрых математических операций с плавающей точкой вместе со ступившим моделированием блокировки. По существу я только передам ввод данных пользователем по сети. Это также относится к другим играм, которые реализуют воспроизведения путем хранения ввода данных пользователем.

Не опция:

  • десятичные числа (слишком медленный)
  • значения фиксированной точки (слишком медленный и громоздкий при использовании sqrt, грех, потому что, загар, atan...)
  • обновите состояние по сети как кадр/с: Отправка информации о положении для сотен или нескольких тысяч единиц не является опцией

Какие-либо идеи?

11
задан mskfisher 9 May 2012 в 19:15
поделиться

2 ответа

Я не уверен в точном ответе на ваш вопрос, но вы могли бы использовать C ++ и выполнять всю свою работу с плавающей запятой в dll c ++, а затем возвращать результат в .Net через прерывание.

2
ответ дан 3 December 2019 в 12:05
поделиться

Результаты Bitexact для разных платформ - это головная боль **. Если вы используете только x86, это не имеет значения, потому что FPU не меняется с 32 на 64 бит. Но проблема в том, что трансцендентные функции могут быть более точными на новых процессорах.

Четыре базовые операции не должны давать разные результаты, но ваша виртуальная машина может оптимизировать выражения, и это может дать разные результаты. Итак, как предложил Муравей, напишите свои подпрограммы add / mul / div / sub как неуправляемый код на всякий случай.

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

1
ответ дан 3 December 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: