Why not use the "double-double" representation, in which one extends a regular double precision value with another double that estimates its error (and then maybe a third that estimates its error, and so on...)? Double-double operations are fast in terms of floating-point operations, conversions to other floating types are free, and the precision (107.5 bits asymptotically) is nearly as good as 128-bit (112 bits).