[swift-evolution] [Review] SE-0113: Add integral rounding functions to FloatingPoint
scanon at apple.com
Fri Jul 1 06:59:06 CDT 2016
> On Jul 1, 2016, at 7:44 AM, Joseph Lord via swift-evolution <swift-evolution at swift.org> wrote:
>> The review of "SE-0113: Add integral rounding functions to FloatingPoint" begins now and runs through July 5. The proposal is available here:
>> * What is your evaluation of the proposal?
> It is an improvement but would it be even better if the return type was Int (or possibly type inferred to Int16 etc.). If a float is really desired it can be initialised from the Int (or it could even infer float result is required).
This is a common thought, but it's precisely backwards from a numerics and pragmatics perspective. The result is always representable as `Self`, and generally not representable in any fixed-width integer type. If you have the version that produces `Self`, getting an integer falls out trivially:
let y = Int(x.rounded(.up)) 
But if you only have the version that produces an integer result, you’re stuck with a much more complex workaround when you actually need the result as `Self` (which is more common than you think). In the best case scenario, where `Int` is bigger than the significand of `Self`, it’s not *too* bad, but still requires at least a conditional and two conversions. In the bad scenario, a floating-point type whose significand doesn’t fit in `Int`, you end up needing to write all the rounding logic yourself.
The idea of also having a set of Integer inits that round has been mentioned once or twice in the past:
let y = Int(roundedUp: x)
I’m not sure if that’s really any cleaner than , but it could certainly be considered as another proposal.
More information about the swift-evolution