I can support that.
> On Oct 20, 2017, at 10:21 AM, Xiaodi Wu <xiaodi...@gmail.com> wrote: > > > On Fri, Oct 20, 2017 at 10:10 Matthew Johnson <matt...@anandabits.com > <mailto:matt...@anandabits.com>> wrote: >> On Oct 20, 2017, at 9:36 AM, Xiaodi Wu via swift-dev <swift-dev@swift.org >> <mailto:swift-dev@swift.org>> 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. > > On the other hand, changing the spelling of IEEE `==` was option in your > opening post represented by demand 4 and question D. > >> 4) IEEE-compliant floating-point equivalence must be spelled `==` and not >> some alternative such as `&==`. > >> 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. > > > What you call the "proximate issue” goes away if the solution to what you > call the “distal issue” involves requiring `Equatable` conforming types to > provide an implementation of `==` that represents a full equivalence > relation. It looks to me like many people are suggesting that this is > exactly what we should do. > > I not a numerics expert by any means and am therefore cautious to offer my > opinion, but rejecting demand 4 appears to be the best option to me. One > advantage of this approach in addition to providing a full equivalence > relation for floating point’s equatable conformance is that it makes it clear > when an algorithm was written with IEEE semantics in mind or when the > programmer did not desire or may not be aware of IEEE semantics. > > I agree. > > IMO, the more general issue of partial equivalence relations should be > orthogonal. I don’t believe NaN should drive the semantic requirements of > `Equatable` and I don’t believe IEEE should prevent floating point types from > providing an Equatable conformance. > > I think this is reasonable as well. > > Perhaps this is a sign of my ignorance of numerics, but that’s the solution > this seems to make the best tradeoffs. I am happy to let others decide > whether `NaN == NaN` should trap or return `true`. > > Trapping violates the requirements of Equatable and, I think, also IEEE > edicts; NaN == NaN would be the only solution if we dispense with demand 4. > >> _______________________________________________ >> swift-dev mailing list >> swift-dev@swift.org <mailto:swift-dev@swift.org> >> https://lists.swift.org/mailman/listinfo/swift-dev >> <https://lists.swift.org/mailman/listinfo/swift-dev>
_______________________________________________ swift-dev mailing list swift-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-dev