use the bc* functions for floating point operations

The point is to minimize the chance of rounding errors that can occur between platforms, and to specify the way we handle floating point calculation