54 votes

Comment les flottants dénormalisés sont-ils gérés dans les applications C #?

Il suffit de lire cet article fascinant sur les 20x-200x slowdowns vous pouvez obtenir sur les processeurs Intel avec des flotteurs dénormalisés (nombres à virgule flottante très proches de 0).

Il existe une option avec SSE pour les arrondir à 0, rétablissant ainsi les performances lorsque de telles valeurs en virgule flottante sont rencontrées.

Comment les applications C # gèrent-elles cela? Existe-t-il une option pour enable/disable _MM_FLUSH_ZERO?

48voto

Hans Passant Points 475940

Il n'y a pas une telle option.

La FPU mot de commande dans une application en C# est initialisé par le CLR au démarrage. Changer n'est pas une option fournie par le cadre. Même si vous essayez de le changer par pinvoking _control87_2() , alors il ne va pas durer longtemps; toute exception sera la cause du mot de contrôle, de réinitialiser l'exception de la manipulation de la mise en œuvre à l'intérieur de la CLR. Ce qui a été écrit pour faire face à un autre aspect de la FPU mot de contrôle, il permet de démasquer les exceptions de virgule flottante. Il sera également préjudiciable à tout autre code managé qui ne s'attendent pas à l'état global du être changé comme ça.

Ayant pas de contrôle direct sur le matériel est implicite de restriction lorsque vous exécutez le code dans une machine virtuelle. Non pas que cela est facile à faire en code natif soit, les bibliothèques ont tendance à mal se conduire quand ils ont trop attendre de la FPU pour avoir l'initialisation par défaut. Un problème particulier à l'exception de masquage des drapeaux, des Dll créé avec les outils Borland avoir un talent pour le tournage des exceptions, ce qui rend d'autres ne respectent pas ce code n'est pas écrit pour faire face à une telle exception. Une très laid problème à résoudre, le FPU mot de contrôle est la pire variable globale que vous pouvez imaginer.

Ce n'mettre le fardeau sur vous pour ne pas laisser vos calculs en virgule flottante ne veulent plus rien dire comme ça. Le calcul denormals presque toujours produit des résultats non-sens, si ce n'est de la radicalement les petites valeurs, alors, au moins, de la rapidité de la perte de chiffres significatifs. Tronquer les valeurs inférieures à 2,2 E-308 à 0 est à vous. Oui, pas très pratique. Peut-être que c'est correct pour un programme de livraison de l'absurdité des résultats un peu plus lent que d'habitude :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X