We limited atomic
If we were to add support for more operations, I would be inclined to add some kind of template that allowed any STL unary function object to be used to specify an atomic update. E.g., x.apply( std::negate ) to atomically negate a location. Binders (20.3.6 in ISO C++ standard) could be used for creating useful unary functions from binary functions. It would be implemented using a compare-and-swap loop. We' have to restrict the argument type to a POD type that fits in an integer.
Perhaps such a template should not even be a member of class atomic, but a separate template algorithm.
It's not available on x86 or Itanium. IBM's Power does atomic operations via a special load instruction followed by a later special conditional store, and so can emulate fetch-and-add for floating-point (and just about anything else). But in general, fetch-and-add for floating-point is not widely supported.