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.
It really depends on the purpose of the whole thing. For some uses, floating point arithmetic is probably just good enough, and may very well be the most efficient solution; for example, it would probably be just good enough is the final aim is to compute probabilities.
For some others purposes, you may need accurate integer arithmetic.