2009-07-29 9 views
3

J'ai un programme écrit en C# et certaines parties écrivent en C/C++ natif. J'utilise des doubles pour calculer certaines valeurs et parfois le résultat est faux en raison d'une trop petite précision. Après quelques recherches, j'ai compris que quelqu'un définissait la précision en virgule flottante sur 24 bits. Mon code fonctionne bien, quand je réinitialise la précision à au moins 53 bits (en utilisant _fpreset ou _controlfp), mais j'ai encore besoin de savoir qui est responsable de la définition de la précision à 24 bits en premier lieu.précision à virgule flottante

Toutes les idées que je pourrais réaliser ceci?

Répondre

13

Ceci est dû à l'initialisation par défaut du périphérique Direct3D. Vous pouvez dire à Direct3D de ne pas jouer avec la précision de la FPU en passant le drapeau D3DCREATE_FPU_PRESERVE à CreateDevice. Il existe également un code managé équivalent à ce drapeau (CreateFlags.FpuPreserve) si vous en avez besoin.

Plus d'informations peuvent être trouvées à Direct3D and the FPU.

+1

Je suggérerais de changer ceci pour être la réponse "bénie". – akauppi

0

Votre code utilise-t-il DirectX ou XNA? J'ai certainement entendu dire qu'il y avait des problèmes à cause de cela - un code d'initialisation DirectX (peut-être seulement dans l'encapsuleur géré?) Réduit la précision.

+0

J'utilise DirectX dans mon programme. Pouvez-vous me dire quelle fonction DX réduirait la précision? Ou un lien vers la documentation? –

+0

Je ne l'ai pas utilisé moi-même, donc c'est juste ouï-dire - mais je crois que c'est dans le code d'initialisation pour DirectX. Tout ce qui va mal si vous le changez, je ne sais pas ... –

+0

Oui, vous avez absolument raison. Vous devez spécifier D3DCREATE_FPU_PRESERVE lorsque vous initialisez le périphérique DX. –

1

Qu'en est-il d'une recherche binaire par partitions dans votre programme et de déterminer quels appels réduisent la précision?

+0

Je pense que la recherche binaire pourrait être utilisée dans certaines parties, mais cela ne devrait affecter que lorsque les flottants ou les doubles sont utilisés dans les clés de recherche. –

+1

Je pense que vous vous méprenez, Andreas. Il vous suggère de commenter des bribes de code et d'appels existants jusqu'à ce que vous trouviez l'appel qui vous a valu votre précision. Une bonne façon de commencer est de commenter la moitié de votre code. Si cela échoue toujours, c'est dans les appels non commentés. Continuez à le réduire jusqu'à ce que vous soyez à un appel. –

+0

Suivez une valeur dans votre programme pour voir où il perd de sa précision. La recherche binaire signifie commencer à un point à peu près au milieu du flux de données et le réduire à partir de là. – starblue

Questions connexes