> On May 3, 2016, at 11:26 PM, Gwendal Roué via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
>> The review of "SE-0080: Failable Numeric Conversion Initializers" begins now 
>> and runs through May 9. The proposal is available here:
>> 
>>      
>> https://github.com/apple/swift-evolution/blob/master/proposals/0080-failable-numeric-initializers.md
> 
> Hello,
> 
> I'm all for it, but I'd like a clarification about... the Integer / Floating 
> point interface.
> 
> I once had to write a function that compares Int64 to Double for strict 
> equality, with all the sweats that come whenever you deal with floating point 
> representations and have to introduce two-complements representation of 
> integers as a mandatory precondition:
> 
>       /// Returns true if i and d hold exactly the same value, and if 
> converting one
>       /// type into the other does not lose any information.
>       private func int64EqualDouble1(_ i: Int64, _ d: Double) -> Bool {
>           return (d >= Double(Int64.min))
>               && (d < Double(Int64.max))
>               && (round(d) == d)
>               && (i == Int64(d))
>       }
> 
> As I understand well the proposal, I could write instead:
> 
>       private func int64EqualDouble2(_ i: Int64, _ d: Double) -> Bool {
>           guard let j = Int64(exact: d) else { return false }
>           return i == j
>       }
> 
> But I may be wrong!
> 
> The "without loss of information" in the proposal means that -0.0 (minus 
> zero) would *not* be convertible to Int64 (which would lose the sign). And 
> we'd get:
> 
>       int64EqualDouble1(0, -0.0) // true
>       int64EqualDouble2(0, -0.0) // false
> 
> No problem with that. To know if int64EqualDouble1 has a bug, or if 
> int64EqualDouble2 should handle -0.0 explicitly, one needs to know how -0.0 
> should be handled.

This is a good example to consider.  I am not a numerics expert and hadn’t 
thought to consider -0.0.  Intuitively I would expect that to convert to 0 when 
converted to an integer type, however your are right that this is technically a 
loss of information about the sign bit.  

I am happy to defer to those with more numerics expertise than I have about 
what an implementation should do in this case.  I am also happy to defer to 
numerics experts about how to precisely define “loss of information” in 
general.  

As noted in the proposal, the primary use case I am concerned with is reading 
data from semi-structured sources such as JSON where there is only a single 
“number” type.  In these cases the value will be received as a Double but our 
model may specify an Int, Uint, Int8, etc.  Any implementation that allows for 
validating the conformance of a value to expectations of our model and 
extracting the valid value with the correct type will be sufficient for the use 
cases I can imagine.

> 
> So I think that the proposal should make it very clear how it wants to handle 
> all the funny Float and Double values. Without such a clarification, as handy 
> as they look like, those functions would remain surprising, which means very 
> hard to use well, and we'll keep on sweating.

Are there any values other than -0.0 we need to worry about?  Clearly NaN, 
Infinity, and -Infinity cannot be represented by integer types and integer 
initializers would return nil when called with these floating point values.



> 
> Gwendal Roué
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to