IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Conseil pour le calcul scientifique en C++.


Sujet :

C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut Conseil pour le calcul scientifique en C++.
    Bonjour,
    commençant bientôt un nouveau projet contenant différents calculs qui devront être très précis, je voulais avoir quelques conseils.

    Typiquement, certaines variables seront de l'ordre 1e-20. Est-ce que l'utilisation du double est suffisante*? Faut-il prévoir (si besoin) passer par une lib qui permet de faire des calculs plus précis? y as t'il quelques règle à connaitre sur l'ordre des opérations?

    Voilà, si vous avez quelques astuces ou un peu de littérature ça m'intéresse.


  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Deux articles sur le sujet :
    http://docs.sun.com/source/806-3568/ncg_goldberg.html (assez théorique)
    http://www.eecs.berkeley.edu/~wkahan/JAVAhurt.pdf (plus "grand public")
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par yan Voir le message
    Typiquement, certaines variables seront de l'ordre 1e-20.
    L'ordre de grandeur importe peu (dans un intervalle assez grand). La precision relative est d'une quinzaine de chiffres.

    (Pour le reste, voir les liens de Loic).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Comme d'autres l'ont dit, les double sont presque toujours suffisants, en terme de précision.

    Pour les calculs, il y a en général trois choses à regarder :

    1- les grosses erreurs d'arrondi surviennent quand on ajoute ou retranche un petit nombre à un grand (1e20+1-1e20 : ca fait zéro!), si on a des additions ou des soustractions dans lesquels entrent des nombres d'ordres de grandeurs différents, il est généralement utile d'additionner les grands à part, les petits à part, et de faire la somme à la fin. Ceci dit, la précision des double fait que cela arrive rarement. Les multiplications et les divisions, en général, provoquent moins de problèmes.
    2- les nombres qu'on obtient dans des calculs sont toujours approchés, attention aux tests. L'égalité à zéro, ca ne s'écrit pas if(x==0.0) mais if(fabs(x)<EPSILON)
    3- certains algorithmes de calcul sont susceptibles d'erreurs d'arrondi. En gros, dès que tu fais un calcul compliqué ne l'écris pas toi même mais cherche dans des librairies ou des livres (et fais leur confiance s'ils semblent suivre une méthode étrange...). Même des calculs simples comme des équations du second degré peuvent mal tourner si on n'y prend garde. Et les solutions "classiques", celles des cours du lycée, sont assez souvent mauvaises... (deux exemples souvent cités : l'équation du second degré par la méthode classique; qui peut donner des résultats horribles si le discriminant est voisin du coefficient du premier ordre, et le calcul "basique" des suites de cosinus dans l'expression de la transformée de Fourier)

    En termes de référence, pour les livres, Numerical Recipes. Pour les sites netlib.org. Si le sujet t'interesse, je te conseille aussi Handbook of Mathematical Functions, d'Abramowitz et Stegun (j'adore ce livre!)

    Francois

  5. #5
    Membre confirmé

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Points : 527
    Points
    527
    Par défaut
    Pourquoi vos calculs doivent-ils être précis? Si c'est pour qu'ils soient "seulement" précis, les conseils ci-dessus sont excellents. Si c'est pour qu'on déduise de ces résultats des assertions robustes, alors cela ne suffit pas. Robustesse numérique et précision sont deux choses distinctes, qui doivent être traités différemment. Voir http://www.mpi-inf.mpg.de/department...sroomExamples/ pour une présentation du problème, et http://www.cgal.org/philosophy.html pour un exemple de solution.
    "Maybe C++0x will inspire people to write tutorials emphasizing simple use, rather than just papers showing off cleverness." - Bjarne Stroustrup
    "Modern C++11 is not your daddy’s C++" - Herb Sutter

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par ac_wingless Voir le message
    Pourquoi vos calculs doivent-ils être précis? Si c'est pour qu'ils soient "seulement" précis, les conseils ci-dessus sont excellents.
    En gros, je doit retrouve l'altitude (de manière très précise) d'un pixel d'un image satélitaire. Y as beaucoup de petit calcul de transformation de repère. Et avec de petits coef par-çi, par-là.

    Ma question est surtout de me préparer au cas où j'ai de trop grande erreur de calcul et de commencer à réfléchir sur une solution. Et aussi pour moi, pour me documenter sur ces problèmes.

    de vos réponses, j'ai de quoi faire

Discussions similaires

  1. [PC portable] pc puissant pour calcul scientifique
    Par anizlewan dans le forum Ordinateurs
    Réponses: 6
    Dernier message: 09/09/2013, 10h01
  2. Technique adéquate pour du calcul scientifique
    Par delire8 dans le forum API graphiques
    Réponses: 3
    Dernier message: 10/12/2008, 15h45
  3. Conseils pour serveur calculs de maths en C
    Par smithofmatrix dans le forum Réseau
    Réponses: 1
    Dernier message: 08/11/2006, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo