Как я могу гарантировать, что вычисления с плавающей запятой в .NET-приложении (скажем, на С#) всегда дают один и тот же бит-точный результат? Особенно при использовании разных версий .NET и запуске на разных платформах (x86 vs x86_64). Неточности операций с плавающей запятой не имеют значения.
В Java я бы использовал strictfp. В языках C/С++ и других языках низкого уровня эта проблема существенно решена путем доступа к управляющим регистрам FPU/SSE, но это, вероятно, невозможно в .NET.
Даже с управлением регистром управления FPU JIT.NET будет генерировать другой код на разных платформах. Что-то вроде HotSpot было бы еще хуже в этом случае...
Зачем мне это нужно? Я думаю о написании игры в реальном времени (RTS), которая сильно зависит от быстрой математики с плавающей запятой и симуляции с блокировкой. По сути, я буду передавать только пользовательский ввод по сети. Это также относится к другим играм, которые реализуют повторы, сохраняя ввод пользователя.
Не вариант:
- десятичные знаки (слишком медленные)
- значения фиксированной точки (слишком медленные и громоздкие при использовании sqrt, sin, cos, tan, atan...)
- Состояние обновления по сети, например, FPS: информация о местоположении для сотен или нескольких тысяч единиц не является вариантом
Любые идеи?