11

.NET 응용 프로그램 (예 : C#)의 부동 소수점 계산이 항상 동일한 비트 결과를 생성하도록 보장 할 수 있습니까? 특히 다른 버전의 .NET을 사용하고 다른 플랫폼에서 실행될 때 (x86 대 x86_64). 부동 소수점 연산의 부정확성은 중요하지 않습니다.결정 론적 부동 소수점 및 .NET

자바에서는 strictfp를 사용합니다. C/C++ 및 다른 저수준 언어에서이 문제는 기본적으로 FPU/SSE 제어 레지스터에 액세스하여 해결되지만 .NET에서는 가능하지 않습니다. 심지어 FPU 제어의 제어

다른 플랫폼에서 서로 다른 코드를 생성합니다 .NET의 JIT를 등록합니다. 내가 필요한 이유는 무엇 핫스팟처럼 뭔가 ...

이 경우 더 악화 될 것이라고? 저는 잠금 단계 식 시뮬레이션과 함께 빠른 부동 소수점 연산에 크게 의존하는 실시간 전략 (RTS) 게임을 작성하려고합니다. 본질적으로 나는 네트워크를 통해서만 사용자 입력을 전송할 것입니다. 이는 사용자 입력을 저장하여 재생을 구현하는 다른 게임에도 적용됩니다.

하지 옵션은 다음과 같습니다

  • 소수 (너무 느린)
  • 고정 소수점 값 (SQRT, 죄, COS, 황갈색, ATAN를 사용할 때 너무 느리고 성가신 ...)
  • 갱신 FPS와 같은 네트워크에서 상태 : 수백 또는 수천 개의 단위에 대한 위치 정보 전송은 옵션이 아닙니다.

아이디어가 있습니까?

답변

2

나는 당신의 질문에 대한 정확한 답변 모르겠어요하지만 당신은 C를 사용 ++와 C++ DLL의 모든 플로트 작업을 수행 한 다음 interopt을 통해 .NET으로 결과를 반환 할 수 있습니다.

+0

C/C++에서 게임의 중요한 부분 (시뮬레이션)을 작성한다면 닷넷없이 전체 게임을 작성할 수 있습니다. 어쩌면 여기가 "옳은"길일 것입니다. – user285934

+0

MSVC 컴파일러의 C/C++ IJW (It-Just-Works) 기능을 살펴보십시오. 관리되지 않는 코드로 작성해야하는 내용을 작성하고 나머지는 관리되는 코드로 처리하여 게임의 나머지 관리되는 부분과 원활하게 인터페이스 할 수 있습니다. – Ants

1

다른 플랫폼에 대한 Bitexact 결과는 a **에있는 고통입니다. x86 만 사용하는 경우 FPU가 32에서 64bit로 변경되지 않기 때문에 중요하지 않습니다. 그러나 문제는 새로운 프로세서에서 초월 함수가 더 정확할 수 있다는 것입니다.

네 가지 기본 작업은 서로 다른 결과를 제공하지 말아야하지만 VM은 표현을 최적화 할 수 있으며, 그 다른 결과를 제공 할 수 있습니다. Ant가 제안한대로 add/mul/div/sub 루틴을 비보안 코드로 작성하여 안전한쪽에 보관하십시오. 초월 함수의

난 당신이 보증 비트 정확성에 조회 테이블을 사용해야합니다 두렵다. 예를 들어의 결과를 계산하십시오. 4096 값을 저장하고 을 상수로 저장하고 두 값 사이에 값이 필요할 경우 보간합니다. 이것은 큰 정확성을 제공하지는 않지만, bitexact가 될 것입니다.

+0

SSE 장치와 FPU가 제대로 구성되지 않은 경우 단일 프로세서에서 네 가지 기본 작업이 서로 다른 결과를 생성합니다. 최대 정밀도 대신 fpu에서 32 비트 또는 64 비트 값을 사용합니다. 초월 기능은 C/C++에서 제어 된 환경을 사용하여 소프트웨어로 구현 될 수 있습니다. – user285934

0

부동 소수점 결정 성을 원하면 모든 변수를 제거해야합니다. 범위를 어느 정도 제한하면 가능합니다.

  1. 64 비트 전용 응용 프로그램합니다. 이렇게하면 x87 대 SSE (x86 JIT는 여전히 x87 fp 코드를 내보내고 다른 JIT는 SSE를 방출 함)를 처리 할 필요가 없습니다.
  2. .NET 코어 및 bundle the runtime with your application을 사용하십시오. 이 방법을 사용하면 주어진 버전의 응용 프로그램에 대해 동일한 codegen을 보장 할 수 있습니다. 이것은 매우 중요합니다. 코드 겐 차이가 아주 작 으면 fp 계산 결과가 달라질 수 있습니다.
  3. 하나의 운영 체제가있는 스틱. 진지하게, 크로스 플랫폼 RTS가 얼마나 많은가? 예, 스타 크래프트 2가 있습니다. AFAIK입니다. 블리자드는이 예술을 오랜 시간 마스터 링했으며 극히 일부만이 위업을 재현 할 수있었습니다. Mac-PC 멀티 플레이어를 진정으로 지원하려면 .NET 런타임이 두 플랫폼 모두에서 동일한 fp 코드를 생성했는지 정중하게 검증해야합니다. 그리고 그렇지 않으면 너는 운이 없어.

위의 제한 사항이 주어지면 일관된 결과를 제공하기 위해 수학 수업을 신뢰할 수 있는지 여부는 확실하지 않습니다. 그러나 나는 그것이해야한다고 생각한다.