My research tackles different topics:
- computer arithmetic: the way computers compute, in particular floating-point and fixed-point arithmetic. This includes for instance new algorithms and properties, compilation issues, and
- formal methods: to obtain high guarantees, in particular proof assistants and especially Coq, and deductive verification for proving programs. See below my gallery of proved programs.
- formalization of numerical analysis to apply
our methods to mathematical problems and programs. See the
FOST project I lead for
the verification of a program implementing a 1D-wave equation
approximation scheme. See also Coq proof
of the Lax-Milgram theorem as we are going towards the finite
element methods.
A 2014 version of my research can be found in my habilitation manuscrit. It is mostly dedicated to the formal verification of numerical programs. The most recent reference (in French) is my invited talk at Collège de France in the course of Xavier Leroy. The video is here.
Gallery of proved programs:
Floating-point tricks
This means floating-point arithmetic specificities are heavily used in these programs.
- Sterbenz
This function computes the exact subtraction if the inputs are near enough one to another.
C code - Malcolm
This function computes the radix of the computations. Here in IEEE-754 double precision, the result is 2. But I like the while (A != (A+1)) loop.
C code - Dekker
This function computes the exact error of the multiplication (with Underflow restrictions). There are also Overflow restrictions so that no infinity will be created.
C code
Floating-point handling
This means that these programs would give the correct answer if real arithmetic was used, but floating-point properties are needed to prove their accuracy and that no exceptional behavior occur.
- Average, Sterbenz's version
This function computes an approximation of the average of two floating-point numbers. It was written using hints given by Sterbenz in order to prevent overflow. Accuracy is 3/2 ulp.
C code - Average, correct version
This function computes the correct rounding of the average of two floating-point numbers. It gives the perfect value, while preventing overflows.
C code - Discriminant
This function computes an accurate discriminant using Kahan's algorithm. The result is proved correct within 2 ulps. Overflow and Underflow restrictions are given.
C code - Triangle
This function computes the area of a triangle, even if the triangle is needle-like. The algorithm is due to Kahan. The error bound is improved on Goldberg's and overflow and underflow restrictions are given.
C code
Numerical analysis
- rec_lin2
This example was developed among the FOST project. This very simple code is a linear recurrence of order 2.
C code - dirichlet
This example was developed among the FOST project. It is a finite difference numerical scheme for the resolution of the one-dimensional acoustic wave equation. A reasonable bound on the rounding error requires a complex property that expresses each rounding error. The bound on the method error of this scheme has also been formally certified in Coq. For this proof, we also require the Coquelicot Coq library.
C code
Avionics
- eps_line1
This example is part of KB3D, an aircraft conflict detection and resolution program. The aim is to make a decision corresponding to value -1 and 1 to decide if the plane will go to its left or its right. Note that KB3D is formally proved correct using PVS and assuming the calculations are exact. However, in practice, when the value of the computation is small, the result may be inconsistent or incorrect. The proofs are here fully automatic.
C code - eps_line2
This is the same example as eps_line1 except that we are independent from the execution hardware and the compilation choices (extended registers, FMA).
C code
- Sterbenz