Perhaps you could make use of TSingleRec and/or TDoubleRec ? Not saying it is better/faster.
No, this returns the dual exponent (base 2), but Stephan wants the decadic exponent (base 10).
Stephan, in order to be able to handle negative numbers, I use the absolute value in the log10. The sign of the value would show up in the mantissa, but not in the exponent.
exponent:= floor(log10(abs(fp_number)));
Another method which I've seen sometimes takes advantage of a string conversion:
var st: String;
Str(fp_number, st);
exponent := StrToInt(copy(st, pos('E', st)+1, MaxInt));