I would not rule out the possibility that straight forward floating point arithmetic is more "efficient" than any cancelation algorithm. Loss of precision could be a problem for large numbers and/or arrays. Alternating the multiplies and divides could help.