Pergunta

Eu tenho um programa escrito em C# e algumas peças estão escrevendo no C/C ++ nativo. Eu uso duplas para calcular alguns valores e, às vezes, o resultado está errado devido à precisão muito pequena. Depois de alguma investigação, descobri que alguém está definindo a precisão de ponto flutuante para 24 bits. Meu código funciona bem, quando redefinindo a precisão para pelo menos 53 bits (usando _fpreset ou _controlfp), mas ainda preciso descobrir quem é responsável por definir a precisão para 24 bits em primeiro lugar.

Alguma ideia que eu poderia conseguir isso?

Foi útil?

Solução

Isso é causado pela inicialização padrão do dispositivo Direct3D. Você pode dizer ao Direct3D para não mexer com a precisão da FPU, passando pelo D3DCREATE_FPU_PRESERVE bandeira para CreateDevice. Há também um código gerenciado equivalente a este sinalizador (CreateFlags.FpuPreserve) se você precisar.

Mais informações podem ser encontradas em Direct3D e a FPU.

Outras dicas

Que tal uma pesquisa binária por partições em seu programa e determinar quais chamadas reduzem a precisão?

Is your code using DirectX or XNA at all? I've certainly heard that there are problems due to that - some DirectX initialization code (possibly only in the managed wrapper?) reduces the precision.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top