English version

Programmes de test de l'arithmétique flottante

Voici quelques programmes C pour tester l'arithmétique flottante de votre machine:

tst-ieee754.c

Divers tests de l'arithmétique flottante: test de l'évaluation des expressions flottantes en C (montrant un bug dans gcc lorsque le processeur est configuré en précision étendue, par exemple sous Linux/x86), test de l'addition et de la multiplication avec des zéros signés, test de la fonction puissance pow. Les résultats sur diverses machines (archive compressée) et un résumé partiel (fichier texte).

nearestint.c

Test des fonctions d'arrondi à l'entier le plus proche, dans les quatre modes d'arrondi IEEE 754: cast en type int, trunc, floor, ceil, round, nearbyint, rint. Ces tests montrent un bug de l'implémentation de la fonction rint dans la glibc sur PowerPC (corrigé dans le CVS le 6 janvier 2005).

testatan.c

Test de la fonction arc tangente atan (voir le bug Debian 210613).

testlog.c

Test de la fonction logarithme log (voir le bug Debian 210400).

testsin.c

Test de la fonction sinus sin.

overflow.c

Test du comportement de l'overflow avec gcc et une précision étendue intermédiaire (par exemple, sous Linux/x86).

testlgamma.c

Test des fonctions gamma tgamma, lgamma et lgamma_r.

remquo.c

Test de la fonction remquo.

fma-tests.c

Test de la fonction fma (voir le bug 3268 de la glibc et le bug Debian 372544).

contract2fma.c

Test de l'effet de la contraction en FMA en calculant sqrt (a * a - b * b) avec a = b (le code est écrit de telle manière que cette égalité ne devrait pas être utilisée pour optimiser au moment de la compilation). La norme ISO C99 autorise, sous certaines conditions, la contraction d'expressions flottantes: par exemple, l'expression x * y + z peut être contractée en une seule opération (avec un seul arrondi) sur les processeurs qui ont un FMA. En général, cela améliore la précision des calculs, mais cela peut aussi avoir l'effet inverse, voire produire des effets secondaires, comme dans le code ci-dessus, où la symétrie est cassée par l'introduction d'un FMA. C'est pour cela que la contraction d'expressions flottantes peut être désactivée par le pragma FP_CONTRACT; dans ce cas, le résultat de ce programme devrait toujours être 0. Mais comme gcc ignore le pragma FP_CONTRACT mis à OFF, le programme donne des résultats incorrects sur les processeurs PowerPC et IA-64 (Itanium). Pire, même dans le cas général (non trivial et éventuellement utile en pratique) a >= b ? sqrt (a * a - b * b) : 0, on peut obtenir un NaN.

Par exemple, en faisant tourner contract2fma (compilé avec gcc sur l'une des deux architectures mentionnées) sur 1, 1.1 et 1.2, on obtient:

Test of a >= b ? sqrt (a * a - b * b) : 0 with FP_CONTRACT OFF
test(1) = 0
test(1.1000000000000000888) = 2.9802322387695326562e-09
test(1.1999999999999999556) = nan


webmaster@vinc17.org