Skip to content

Consider adding public PyLong_FlipSign() function #120446

Closed as not planned
Closed as not planned
@skirpichev

Description

@skirpichev

Feature or enhancement

Proposal:

Currently there is only a slow way (i.e. PyNumber_Negative()) to invert the sign of a big integer. Direct manipulation of the sign value is available only via private function, e.g. _PyLong_SetSignAndDigitCount():
https://github.com/aleaxit/gmpy/blob/1c0d4f38d4f1093df0e9460d82e4331d3d3946b6/src/gmpy2_convert_gmp.c#L153

I propose this interface:

int PyLong_FlipSign(PyObject *obj);

For small integers it will fallback to PyLong_FromLong() (like _PyLong_Negate() does), for the rest - just _PyLong_FlipSign() to change sign in place.

Alternatively, we could just expose a direct wrapper of _PyLong_FlipSign() and warn users to not use this function for small ints (that doesn't make sense for me anyway).

In both variants, on success - flip the sign of obj and return 0. On failure - return -1 with exception set. Shouldn't fail on PyLongObject or it's subtype.

I'll work on a patch if this proposal does make sense.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions