<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">As someone mentioned earlier, we are trying to square a circle here. We can’t have everything at once… we will have to prioritize. &nbsp;I feel like the precedent in Swift is to prioritize safety/correctness with an option ignore safety and regain speed.<div class=""><br class=""></div><div class="">I think the 3 point solution I proposed is a good compromise that follows that precedent. &nbsp;It does mean that there is, by default, a small performance hit for floats in generic contexts, but in exchange for that, we get increased correctness and safety. &nbsp;This is the exact same tradeoff that Swift makes for optionals! &nbsp;Any speed lost can be regained by providing a specific override for FloatingPoint that uses ‘&amp;==‘.</div><div class=""><br class=""></div><div class="">For example, if someone wants to write a generic function that works both on Integer and FloatingPoint, then they would have to use the new protocol which would force them to correctly handle cases involving NaN. &nbsp;If speed is super important in that particular case, then they can write overrides for the FloatingPoint case which uses &amp;==, and for Equatable which uses ==.</div><div class=""><br class=""></div><div class="">Because Float’s Equatable conformance is just being depreciated (with a warning/fixit), authors have at least a version to decide whether speed or correctness (or hopefully both) is most important to them.</div><div class=""><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div><div class=""><br class=""></div><div class="">P.S. We really should not be comparing against the speed of algorithms which don’t correctly handle NaN. Let’s compare Apples to Apples.</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Oct 25, 2017, at 6:36 PM, Xiaodi Wu &lt;<a href="mailto:xiaodi.wu@gmail.com" class="">xiaodi.wu@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">On Wed, Oct 25, 2017 at 8:26 PM, Jonathan Hull<span class="Apple-converted-space">&nbsp;</span><span dir="ltr" class="">&lt;<a href="mailto:jhull@gbis.com" target="_blank" class="">jhull@gbis.com</a>&gt;</span><span class="Apple-converted-space">&nbsp;</span>wrote:<br class=""><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;"><span class="">&gt; On Oct 25, 2017, at 9:01 AM, David Sweeris via swift-dev &lt;<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>&gt; wrote:<br class="">&gt;<br class="">&gt; That said, I fully acknowledge that this is all above my pay grade (also I hadn't realized that the issue was as settled as it apparently is). If splitting the protocols is a no-go from the get go, I'll go back to trying to figure out a better way to handle it without doing that.<br class=""><br class=""><br class=""></span>I don’t think it is settled.&nbsp; The issue that Xiaodi mentioned was a PartiallyEq protocol which still had a signature of (T,T)-&gt;Bool.&nbsp; People just used that protocol instead of Equatable without taking into account the difference in behavior.&nbsp; The signature of (T,T)-&gt;Bool? changes things because people are forced to deal with the optional.<br class=""><br class="">Currently, I think we should do 3 things:<br class=""><br class="">1) Create a new protocol with a partial equivalence relation with signature of (T, T)-&gt;Bool? and automatically conform Equatable things to it<br class="">2) Depreciate Float, etc’s… Equatable conformance with a warning that it will eventually be removed (and conform Float, etc… to the partial equivalence protocol)<br class="">3) Provide an '&amp;==‘ relation on Float, etc… (without a protocol) with the native Float IEEE comparison<br class=""><br class="">I think this provides several benefits.&nbsp; #3 allows pure speed when needed, but not in a generic context (and is appropriately scary to cause some thought).&nbsp; #1 forces correct handling in generic contexts.&nbsp; #2 gives people time to make the adjustment, but also eventually requires them to switch to using #1 or #3.<br class=""><br class="">I think it will cause A LOT of currently incorrect code to be fixed.<br class=""></blockquote><div class=""><br class=""></div><div class="">One issue which occurred to me only recently, which I hadn't considered, renders my `&amp;==` idea and all similar schemes untenable:</div><div class=""><br class=""></div><div class="">Useful algorithms can and are written which operate on both floating-point and integer numeric types. In fact, the whole point of laboriously designing `Numeric` as part of SE-0104 was to make it possible to do so. If IEEE comparison is relegated to `FloatingPoint` and the only operator remaining on `Numeric` is `==`, then not only will there be a mandatory performance hit, but currently correct algorithms can be broken with absolutely no way to express a fix.</div></div></div></div></div></blockquote></div><br class=""></div></div></body></html>