Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integer midpoint #293

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open

Integer midpoint #293

wants to merge 3 commits into from

Conversation

stephentyrone
Copy link
Member

@stephentyrone stephentyrone commented Jul 1, 2024

Overflow-safe integer midpoint with rounding control

Draft because I am not sold on the free-function spelling midpoint(a, b). It is desirable by symmetry with min(a, b) and max(a, b), and because it correctly captures that this is a commutative operation; neither operand is privileged. But Swift generally eschews free functions. This could equally be a static member (Int.midpoint(a, b)), or possibly use some other spelling.


Declaration:

public func midpoint<T: FixedWidthInteger>(
   _ a: T,
   _ b: T,
   rounding rule: RoundingRule = .down
 ) -> T

Usage:

let dn = midpoint(start, end)
let up = midpoint(start, end, rounding: .up)

Unlike commonly seen expressions such as (a+b)/2 or (a+b) >> 1 or a + (b-a)/2 (all of which may overflow for fixed-width integers), this function never overflows, and the result is guaranteed to be representable in the result type.

The default rounding rule is .down, which matches the behavior of (a + b) >> 1 when that expression does not overflow. Rounding .towardZero matches the behavior of (a + b)/2 when that expression does not overflow. All other rounding modes are supported.

@stephentyrone
Copy link
Member Author

@swift-ci test

@glessard
Copy link
Contributor

glessard commented Jul 2, 2024

@swift-ci please test

Also corrects a typo and makes the deprecated toNearestOrAwayFromZero rule public for migration purposes, and removes the BinaryInteger.midpoint function in favor of the FixedWidthInteger overload. I'm open to reinstating the BI implementation in the future, but let's start with just FWI.
@stephentyrone
Copy link
Member Author

@swift-ci test

@stephentyrone stephentyrone marked this pull request as ready for review July 23, 2024 17:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants