4.1.3 : Sécurité numérique et évaluation de la précision d'un calcul



Force est de reconnaître qu'au sein de la population des développeurs, même dans les domaines scientifiques et techniques, la fraction consciente des problèmes de calcul numérique (une des branches des mathématiques), et en particulier des problèmes de mise en œuvre informatique du calcul numérique est notoirement peu étoffée.

Conscient de ces deux aspects, les experts du calcul numérique préconisent une attitude d'autodéfense au béotien [192]What Every Computer Scientist Should Know About Floating-point Arithmetic, 1991, Goldberg, David[193]When Good Computers Make Bad Calculations: A Cautionary Tale, Meyer, Rob. Le cas échéant, en agitant (certes avec pédagogie) le spectre de suppressions catastrophiques [190]Prof. W. Kahan's web pages, Kahan, William. Cette approche est d'ailleurs commune à tout le génie logiciel : un ensemble de bonnes pratiques est là pour garantir la protection contre les échecs retentissants, même avec une compréhension partielle de leur justification ultime.

En pratique, la base de la sécurité numérique est de pouvoir faire le même calcul en simple précision et en double précision et d'obtenir des résultats compatibles (ou alors en double précision et en double précision étendue). Le cas de la quadruple précision est à part, car il n'en existe pas d'implémentation matérielle, ce qui réduit dramatiquement ses performances (au moins d'un ordre de grandeur) et restreint par suite son usage.

\paragraph Une première recommandation est donc de produire du code numérique aussi générique que possible, en notant bien que cette généricité ne saurait se résoudre à celle des types des variables mises en jeu dans le calcul.

Un premier obstacle vient généralement des constantes littérales: les constantes double précision étendue du C (long double) doivent être suffixée, de même qu'en Fortran chaque précision est spécifiée par un suffixe : E0, D0, Q0 ou \_4, \_8, \_10, \_16 en Fortran moderne. Sans quoi le compilateur procédera à des promotions de précision selon des règles obscures. Ce dernier point parle en faveur d'un recours aux constantes nommées : les \#define du C/C++ n'échappent pas à cette obligation de suffixation, mais les const du C++ ou les parameter du Fortran permettent d'associer clairement un nom à une valeur et à sa précision.

Bien que la majorité des fonctions intrinsèques existent sous forme générique dans les bibliothèques associées au compilateur, la difficulté apparaît dès qu'on doit produire ses propres fonctions : au-delà de la taille des variables et de la précision des coefficients employés, c'est le nombre de ces coefficients qui doit changer (notamment s'ils correspondent à un développement). Si ce développement n'est pas en série entière, mais un approximant de Padé, les valeurs changeront du tout au tout d'une précision à l'autre. Enfin le nombre d'itérations requises pour atteindre une précision donnée est également sujet à fluctuation.

\paragraph Une autre recommandation est d'aller échanger avec la communauté quant au choix de ses algorithmes : parfois, on observe des recopies pures et simples tirées de «Numerical Recipes» [201]Numerical Recipes in C (2nd Ed.): The Art of Scientific Computing, 1992, Press, William H. and Teukolsky, Saul A. and Vetterling, William T. and Flannery, Brian P.[202]Numerical Recipes in FORTRAN; The Art of Scientific Computing, 1993, Press, William H. and Teukolsky, Saul A. and Vetterling, William T. and Flannery, Brian P. qui est certes un ouvrage très pédagogique, mais pas forcément à la pointe du progrès. Le choix des approximations est également important : un certain nombre de calculs peuvent être effectués exactement pour un coût assez modeste\footnoteon a trouvé dans une expérience de précision des reconstructions fondées sur une approximation de petits angles, là où on pouvait faire le calcul exact et stable.