Avoid using the uint64_t as an intermediate cast since it complicates
behavior for signed types (which first need to be cast to an int64_t).
Assign both old_value_i & old_value_f from the original value to avoid the need for different handling of signed/unsigned types.
When looking into integer overflow (see rB9d674d9852db07ade16b521d1c0864b494d232e5), it seems there isn't any advantage in using uint64_t as intermediate storage for signed values.
Added in rB51befa4108128a7bacf7a201046cf7ede999833a.