2009-07-29 13 views
3

나는 C#으로 작성된 프로그램을 가지고 있으며 일부는 네이티브 C/C++로 작성하고있다. 일부 값을 계산할 때는 double을 사용하고 너무 작은 정밀도 때문에 결과가 잘못된 경우가 있습니다. 몇 가지 조사 후 나는 누군가가 24 비트로 부동 소수점 정밀도를 설정하고 있다는 것을 알아 냈습니다. 내 코드는 정밀도를 적어도 53 비트 (_fpreset 또는 _controlfp 사용)로 리셋 할 때 잘 동작하지만, 먼저 24 비트 정밀도를 누가 설정해야하는지 파악해야합니다.부동 소수점 정밀도

나는 이것을 얻을 수있는 아이디어가 있습니까?

답변

13

이 오류는 기본 Direct3D 장치 초기화로 인해 발생합니다. Direct3D에 D3DCREATE_FPU_PRESERVE 플래그를 CreateDevice으로 전달하여 FPU 정밀도로 엉망이되지 않도록 할 수 있습니다. 필요한 경우이 플래그 (CreateFlags.FpuPreserve)와 동일한 관리 코드도 있습니다.

자세한 내용은 Direct3D and the FPU에서 확인할 수 있습니다.

+1

나는 이것을 "축복받은"대답으로 바꾸라고 제안합니다. – akauppi

0

DirectX 또는 XNA를 사용하는 코드가 있습니까? 확실히 그 때문에 문제가 있다는 말을 들었습니다 - 일부 DirectX 초기화 코드 (관리되는 래퍼에서만 가능)가 정밀도를 떨어 뜨립니다.

+0

내 프로그램에서 DirectX를 사용하고 있습니다. DX 기능이 정밀도를 떨어 뜨릴 수 있다는 힌트를 줄 수 있습니까? 또는 문서에 대한 링크가 있습니까? –

+0

저는 이것을 직접 사용하지 않았기 때문에 이것은 단지 소문입니다 -하지만 DirectX의 초기화 코드에 있다고 생각합니다. 당신이 그것을 되돌려 놓으면 잘못 될 것입니다. 나는 모른다 ... –

+0

예, 정말로 옳습니다. DX 장치를 초기화 할 때 D3DCREATE_FPU_PRESERVE를 지정해야합니다. –

1

파티션을 프로그램에 이진 검색하고 어떤 호출이 정밀도를 떨어 뜨리는 지 어떻게 결정합니까?

+0

저는 바이너리 검색이 일부 부분에서 사용될 수 있다고 생각합니다. 그러나 이것은 float 또는 double이 검색 키에 사용될 때만 영향을 미쳐야합니다. –

+1

나는 당신을 오해한다고 생각합니다, 안드레아스. 그는 당신이 당신에게 정밀함을 입히고있는 하나의 전화를 찾을 때까지 당신이 기존의 코드와 통화의 일부를 주석으로 처리 할 것을 제안합니다. 한 가지 좋은 방법은 코드의 절반을 주석 처리하는 것입니다. 그래도 실패하면 주석 처리되지 않은 호출에 있습니다. 한 번 통화 할 때까지 그런 식으로 계속 좁 힙니다. –

+0

프로그램을 통해 가치를 추적하여 정확도를 잃는 부분을 확인하십시오. 이진 검색은 데이터 흐름의 중간에있는 지점에서 시작하여 거기에서 좁히는 것을 의미합니다. – starblue

관련 문제