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?
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
@ 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