precisão do ponto flutuante
-
05-07-2019 - |
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?
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.