2010-04-02 3 views
7

HI,précision en virgule flottante dans Visual C++

Je tente d'utiliser la robust predicates pour la géométrie computationnelle de Jonathan Richard Shewchuk.

Je ne suis pas un programmeur, donc je ne suis même pas sûr de ce que je dis, je peux faire une erreur de base. Le point est que les prédicats devraient permettre une précision arithmétique avec une précision en virgule flottante adaptative. Sur mon ordinateur: Asus pro31/S (Core Due Centrino Processor), ils ne fonctionnent pas. Le problème peut rester dans le fait que mon ordinateur peut utiliser des améliorations dans la précision en virgule flottante en conflit avec celle utilisée par Shewchuk. L'auteur dit:

/* On some machines, the exact arithmetic routines might be defeated by the */ 
/* use of internal extended precision floating-point registers. Sometimes */ 
/* this problem can be fixed by defining certain values to be volatile, */ 
/* thus forcing them to be stored to memory and rounded off. This isn't */ 
/* a great solution, though, as it slows the arithmetic down.    */ 

Maintenant, ce que je voudrais savoir est qu'il ya un moyen, peut-être une option de compilateur, pour désactiver la précision étendue interne des registres à virgule flottante.

Je vraiment appriaciate votre aide

Répondre

0

Si vous utilisez GCC, la réponse pourrait aider ici SO:

Si vous utilisez un autre compilateur, vous pourrait être en mesure de trouver des indices dans cet exemple (ou peut-être poster un commentaire à cette réponse pour voir si Mike Dinsdale pourrait savoir.)

3

L'option Complier que vous voulez pour Visual Studio est /fp:strict qui est exposée dans l'EDI comme Project->Properties->C/C++->Code Generation->Floating Point Model

3

Oui, vous devrez changer le mot de contrôle FPU pour éviter cela. Il est bien expliqué pour les compilateurs les plus populaires dans ce web page. Attention, ceci est dramatiquement incompatible avec ce que la plupart des bibliothèques attendent de la FPU, ne pas mélanger et faire correspondre. Toujours restaurer le mot de contrôle FPU après que vous avez terminé.

1

_control87(_PC_53, _MCW_PC) ou _control87(_PC_24, _MCW_PC) fera l'affaire. Ceux-ci définissent la précision à double et single respectivement avec MSVC. Vous pouvez utiliser _controlfp_s(...), car cela vous permet de récupérer le mot de contrôle actuel après l'avoir défini.

+0

Vous voulez travailler avec des builds x64 – Gabriel

+0

Soyez averti L'appel de _control87 dans les builds x64 peut générer une exception. Programme: ... Fichier: amd64 \ ieee.c Ligne: 109 Expression: (mask & ~ (_MCW_DN | _MCW_EM | _MCW_RC)) == 0 – Damian

1

Comme d'autres l'ont noté, vous pouvez résoudre ce problème en définissant le mot de contrôle x87 pour limiter la précision en virgule flottante. Cependant, un meilleur moyen serait d'obtenir MSVC pour générer le code SSE/SSE2 pour les opérations en virgule flottante; Je suis surpris qu'il ne le fasse pas par défaut de nos jours, étant donné les avantages en termes de performances (et le fait qu'il empêche l'utilisation de bogues agaçants comme ce que vous voyez), mais il n'y a pas de comptabilité pour MSVC. idiosyncrasies.

Déclenchement à propos de MSVC, je crois que l'indicateur /arch:SSE2 obligera MSVC à utiliser les instructions SSE et SSE2 pour l'arithmétique simple et double précision, ce qui devrait résoudre le problème.

+1

Tout le point de l'arithmétique de précision étendue de x87 est d'éviter d'avoir recours à ces bibliothèques ridicules pour les opérations matricielles en premier lieu. Qui voudrait que la plus faible précision soit le * défaut *? – Gabe

+1

@gabe: Le 'x87' ne fournit pas assez de précision pour faire de l'arithmétique exacte, ce que fournissent ces primitives géométriques. Dans des cas comme celui-ci, tout ce qu'il fait est de casser les algorithmes qui se comportent correctement sur * toutes les autres architectures *. Il introduit également toutes sortes de bogues difficiles à prédire dans lesquels les résultats numériques sont affectés par des calculs sémantiquement indépendants. Il y a des avantages certains à l'arithmétique étendue 'x87', mais pas autant que cela devrait être utilisé sans considération critique des alternatives. –

+0

Wow. Êtes-vous également contre les opérations de multiplication-ajout fusionnées? Rappelez-vous, x87 était la première mise en œuvre de l'IEEE 754, et presque certainement le plus populaire. Considérant que les processeurs Itanium et i960 d'Intel, ainsi que les 68881 et 88110 de Motorola, ont tous une arithmétique de précision étendue, ce n'est pas le seul. – Gabe

Questions connexes