Làm cách nào để đảm bảo rằng các phép tính dấu chấm động trong một ứng dụng .NET (nói trong C#) luôn tạo ra cùng một kết quả chính xác bit? Đặc biệt khi sử dụng các phiên bản .NET khác nhau và chạy trên các nền tảng khác nhau (x86 vs x86_64). Không chính xác của các hoạt động điểm nổi không quan trọng.Điểm nổi bật xác định và .NET
Trong Java, tôi sẽ sử dụng strictfp. Trong C/C++ và các ngôn ngữ cấp thấp khác, vấn đề này về cơ bản được giải quyết bằng cách truy cập vào thanh ghi điều khiển FPU/SSE nhưng điều đó có lẽ không khả thi trong .NET.
Ngay cả khi kiểm soát đăng ký kiểm soát FPU, JIT của .NET sẽ tạo mã khác trên các nền tảng khác nhau. Một cái gì đó như HotSpot thậm chí còn tệ hơn trong trường hợp này ...
Tại sao tôi cần nó? Tôi đang nghĩ về việc viết một trò chơi chiến lược thời gian thực (RTS) mà phụ thuộc rất nhiều vào phép toán điểm nổi nhanh cùng với một mô phỏng bước khóa. Về cơ bản tôi sẽ chỉ truyền đầu vào của người dùng trên mạng. Điều này cũng áp dụng cho các trò chơi khác thực hiện replay bằng cách lưu trữ đầu vào của người dùng.
Không một tùy chọn là:
- thập phân (quá chậm)
- giá trị điểm cố định (quá chậm và cồng kềnh khi sử dụng sqrt, sin, cos, tan, atan ...)
- cập nhật trạng thái trên mạng như FPS: Gửi thông tin vị trí cho hàng trăm hoặc vài nghìn đơn vị không phải là một tùy chọn
Bất kỳ ý tưởng nào?
Nếu tôi viết phần quan trọng (mô phỏng) của trò chơi trong C/C++ thì tôi có thể viết toàn bộ trò chơi mà không cần .Net. Có lẽ đó là cách "đúng" ở đây. – user285934
Xem xét chức năng C/C++ IJW (Chỉ hoạt động) của trình biên dịch MSVC. Nó sẽ cho phép bạn viết những gì bạn cần để viết dưới dạng mã không được quản lý và thực hiện phần còn lại dưới dạng mã được quản lý để giao diện thuận lợi với phần còn lại của các phần được quản lý trong trò chơi của bạn. – Ants