4

J'imprime des données d'un programme C++ à traiter/visualiser par ParaView, mais j'ai un problème avec les nombres à virgule flottante. Paraview prend en charge les types de données Float32 et Float64. Float64 équivaut à doubler avec les limites typiques +/- 1.7e +/- 308. Mais, mon code imprime des nombres comme 6.5e-318. C'est jeter des erreurs dans ParaView lors de la lecture des données. J'ai vérifié que l'arrondi de ces petits nombres à zéro fait disparaître les erreurs dans ParaView. Je ne suis pas sûr de savoir pourquoi j'ai une telle "haute précision" de sortie, peut-être parce que certains nombres sont stockés dans une plus grande précision que le double. Par exemple, le code suivant reproduit le même comportement sur mon système:La précision de sortie est supérieure à la double précision

#include <iostream> 
int main(void) 
{ 
    const double var1 = 1.0e-318, var2 = 1.5e-318; 
    std::cout << 1.0e-318 << std::endl; 
    std::cout << var1 << std::endl; 
    std::cout << var1 - var2 << std::endl; 
    std::cout.setf(std::ios_base::fixed | std::ios_base::scientific, std::ios_base::floatfield); 
    std::cout << 1.0e-318 << std::endl; 
    std::cout << var1 << std::endl; 
    std::cout << var1 - var2 << std::endl; 

    return 0; 
} 

Ma sortie est:

9.99999e-319 
9.99999e-319 
-4.99999e-319 
9.99999e-319 
9.99999e-319 
-4.99999e-319 

Mon système est un Mac OS X Snow Leopard et j'ai testé ci-dessus avec GCC 4.2 et GCC 4.6 avec les drapeaux -m32, -m64 et -ffloat-store (je ne sais pas si c'est utile).

En fait la sortie pour moi est bien, mais pour ParaView ne l'est pas. Je veux juste savoir pourquoi j'ai cette différence. Je suis très probablement ignorer quelque chose lié à des nombres à virgule flottante qui pourrait être important. Pourriez-vous s'il vous plaît me donner quelques indices sur cette sortie/comportement numérique pour les doubles?

+1

Quel est exactement un problème ici? Je ne vois pas de différence entre avant et après. 1.0e-318 actuellement 'IS' 9.99999e-319 – GreenScape

+0

@ GreenScape: Le problème semble être que les doubles normaux ne descendent que vers ~ 2.2e-308, et que tous les autres résultats sont des flotteurs dénormalisés, descendant à ~ 4.9e- 324. Beaucoup de programmes voient de ne pas comprendre les flotteurs dénormalisés. – PlasmaHH

Répondre

11

Numéros sous-normaux, c'est-à-dire les nombres ayant l'exposant le plus petit possible et les zéros non significatifs dans la fraction, can be smaller than 1E-308, down to 1E-324. Vous pouvez probablement les filtrer en utilisant std :: numeric_limits.

+0

Oui, je pense que cela pourrait être la solution, en faisant une comparaison entre le double minimum actuel et le nombre actuel. Merci d'avoir signalé l'information sur les nombres subnormaux. – iluvatar