BUG: Prevent power(uint64, int64) casting to float #8853
Closed
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Partials resolves #8809
Previously, the signatures were:
power(int, int) -> int
power(uint, uint) -> uint
So when we pass a mixture of
int
anduint
, we find a common typet = common(int, uint)
, and invokepower(t, t) -> t
.This is bad, because
common(int64, uint64)
isfloat64
This PR defines:
power(int, uint) -> int
same as
power(int, int)
, without an error checkpower(uint, int) -> uint
:same as
power(uint, uint)
, with an error checkObviously, there is a cost associated with reducing the size of the output type - overflows happen sooner.
But what we have right now is inconsistent - from a mathematical perspective
power(uint, int)
has a strictly smaller range of values that can be produced thanpower(uint, uint)
- so why do we allocate a larger output type for it?