Floating-point without FPU
As I said in my comment, all float operations are implemented in
software. As a simple test, I compiled the following program:

volatile float x, y, z;

int main(void)
{
    z = x + y;
    return 0;
}


The compiler translated the sum operation into a call to __addsf3.
This function extends its arguments to flt40_t format (non-standard 40
bits float), calls __addsf3x to do the 40-bit addition, then calls
__fp_round to convert the result into the standard float format.
__addsf3x also makes a few library calls of its own. In the end, the
addition pulled the following functions into the compiled program:
__subsf3, __addsf3, __addsf3x, __fp_inf, __fp_nan,
__fp_pscA, __fp_pscB, __fp_round, __fp_split3, __fp_splitA,
__fp_zero and __fp_szero.

All these functions are provided by the avr-libc. You can find them in
the libm/fplib directory. See for example the files:


addsf3.S
addsf3x.S
fp_round.S