Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Integer midpoint #293

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

Open
stephentyrone wants to merge 3 commits into apple:main
base: main
Choose a base branch
Loading
from stephentyrone:midpoint
Open

Integer midpoint #293

stephentyrone wants to merge 3 commits into apple:main from stephentyrone:midpoint

Conversation

Copy link
Member

@stephentyrone stephentyrone commented Jul 1, 2024
edited
Loading

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.

xwu and markuswntr reacted with hooray emoji
Copy link
Member Author

@swift-ci test

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.
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

Reviewers

1 more reviewer

@glessard glessard glessard approved these changes

Reviewers whose approvals may not affect merge requirements

At least 1 approving review is required to merge this pull request.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

AltStyle によって変換されたページ (->オリジナル) /