num icon indicating copy to clipboard operation
num copied to clipboard

Support in-place negation/reciprocal operations

Open mozhewen opened this issue 1 year ago • 1 comments

Big numbers are often stored in some data structure such as values of a BTreeMap. When I want to do some local change on the data structure, I usually get a &mut of the number. In this case, if I'm taking a neg(), a clone() of the number is needed, which is inefficient since it's essentially only a flip of sign. Similar for recip().

A new function like

fn set_neg(&mut self) {
    self.sign = -self.sign;
}

may be helpful. In fact, I even think it should be a method of the Neg trait.

mozhewen avatar Aug 22 '24 21:08 mozhewen

If this is for a type that you control, you can certain add such a method directly. The num traits are mostly for generics where you don't know or control the particular numeric type.

Even for generics, you can already write something like this:

fn foo<T: Zero + Neg<Output = T>>(x: &mut T) {
    *x = -mem::replace(x, T::zero());
}

This assumes that zero is cheap to create and drop, but that's usually true.

In fact, I even think it should be a method of the Neg trait.

That would have to be a proposal for the standard library. When extending an existing trait, we also need a default implementation, and in that context I'd probably write it similar to what I wrote above, but add where Self: Default to the method and use mem::take instead of Zero.

cuviper avatar Sep 06 '24 21:09 cuviper