> On Oct 20, 2017, at 7:36 AM, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> 
> On Fri, Oct 20, 2017 at 07:21 David Zarzycki <d...@znu.io 
> <mailto:d...@znu.io>> wrote:
> 
> 
>> On Oct 20, 2017, at 07:51, Xiaodi Wu via swift-dev <swift-dev@swift.org 
>> <mailto:swift-dev@swift.org>> wrote:
>> 
>> On Fri, Oct 20, 2017 at 1:22 AM, Jonathan Hull <jh...@gbis.com 
>> <mailto:jh...@gbis.com>> wrote:
>> +1 for trapping unless using &==.  In the case of ‘Float?’ we could also map 
>> to nil.
>> 
>> This is probably a more appropriate discussion for evolution though...
>> 
>> 
>>> On Oct 19, 2017, at 9:48 PM, Brent Royal-Gordon via swift-dev 
>>> <swift-dev@swift.org <mailto:swift-dev@swift.org>> wrote:
>>> 
>>>> On Oct 19, 2017, at 4:29 PM, Xiaodi Wu via swift-dev <swift-dev@swift.org 
>>>> <mailto:swift-dev@swift.org>> wrote:
>>>> 
>>>> D) Must floating-point IEEE-compliant equivalence be spelled `==`?
>>>> 
>>>> In my view, this is something open for debate. I see no reason why it 
>>>> cannot be migrated to `&==` if it were felt that `==` *must* be a full 
>>>> equivalence relation. I believe this is controversial, however.
>>> 
>>> I actually got partway through writing up a pitch on this yesterday, but my 
>>> opinion is that NaNs are so exceptional, and so prone to misuse, that we 
>>> ought to treat them like integer arithmetic overflows: trap when they're 
>>> detected, unless you use an `&` variant operator which indicates you know 
>>> what you're doing.
>>> 
>>> I strongly suspect that, in practice, most float-manipulating code is not 
>>> prepared to handle NaN and will not do anything sensible in its presence. 
>>> For example, Apple platforms use floating-point types for geometry, color 
>>> components, GPS locations, etc. Very little of this code will do anything 
>>> sensible in the presence of a NaN. Arguably, it'd be better to exclude them 
>>> through the type system, but I don't think that's a realistic 
>>> possibility—we would need to have done that in a more source-break-friendly 
>>> era. But that doesn't have to mean we're completely stuck.
>> 
>> 
>> Built-in floating point operators, as well as libc/libm math functions, are 
>> designed to propagate NaN correctly. This is not meant to be a thread about 
>> NaN, and we need to be cautious to define the scope of the problem to be 
>> solved from the outset. The tendency of having ever-expanding discussion 
>> where issues such as method names turn into discussions about the entire 
>> standard library go nowhere.
>> 
>> The question here is about `==` specifically and how to accommodate partial 
>> equivalence relations. For sanity, we start with the premise that NaN will 
>> forever be as it is.
> 
> I support Jonathan’s argument. If Swift wants to trap on NaN to improve 
> self-consistency and simplicity, then the tradeoff might be worth it. The 
> alternative, teaching the Equality protocol about NaNs, feels like “the tail 
> wagging the dog".
> 
> In short: what IEEE requires of floating-point hardware is separable from 
> IEEE’s opinions about language/library design.
> 
> IEEE 754 requires certain behaviors of conforming implementations and is 
> meant to allow for portable use of floating point. Swift’s floating point 
> facilities are conformant to that standard, and breaking IEEE 754 conformance 
> has been repeatedly stated to be a non-starter.
> 
> The essential idea behind quiet NaN is that it can be used as input in 
> operations that take floating point values without raising errors. Since 
> breaking IEEE 754 conformance is a non-starter, trapping on NaN is outside 
> the realm of available solutions.
> 
> It has been pointed out, however, that IEEE does not require a specific 
> syntax for floating point equivalence, hence the question of whether it can 
> be spelled differently. However, trapping on NaN is emphatically not an 
> option.
> 
> But I really don’t want to discuss this at all here. The topic of this thread 
> is about the semantics of Equatable.


I don’t know about Brent, but I was only speaking about the semantics/behavior 
of == with respect to NaN.  Trap on NaN for ‘==‘, but restore full IEEE 
behavior by using ‘&==‘.  For ‘Float?’ we could treat NaN as nil for ‘==‘.  
‘&==‘ would still have the IEEE behavior.

This restores reflexivity and we can count on == being a true equivalence 
relation in our generic algorithms.  Lack of proper handling of NaN is almost a 
stereotypical cause of bugs. Looking at code written for Floats, seeing &== 
will be a sign that the original programmer considered the possibility of NaN.

Thanks,
Jon



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

Reply via email to