<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="">I just wanted to ask for more detail on why this is a non-starter (it seems like most of my ideas are dismissed as “non-starters”, but I am rarely given a detailed reason why).<div class=""><br class=""></div><div class="">Migration would be a renaming from ‘Double' to ‘Double?’, but it wouldn’t be cosmetic. &nbsp;It would free us to use a non-optional Double, where we can guarantee the answer wouldn’t be NaN/nil. &nbsp;We would, as you say, have functions like ‘cos(Double?)-&gt;Double?’ which propagate the optional, but we could also add a ‘cos(Double)-&gt;Double’ overload which guarantees an actual result. &nbsp;For something like Tan, we would only have the optional version because the answer may actually be undefined, even when the input isn't.</div><div class=""><br class=""></div><div class="">In short, it would actually make people consider conditions which result in NaN because of Swift’s machinery which makes people consider nil.</div><div class=""><br class=""></div><div class="">It also allows non-optional Double to easily conform to Comparable, and removes the gotchas around Collections… &nbsp;Pretty big wins for a “cosmetic rename”. &nbsp;The only thing we lose is 'NaN != Nan' (because nil == nil), but then algorithms that had relied on that would be forced to consider the NaN/nil case explicitly because of the optionals.</div><div class=""><br class=""></div><div class="">It would also inter-op well with C/ObjC code by just having the compiler overlay Double? for Double…</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Jon</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 16, 2017, at 11:44 AM, 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 Sun, Apr 16, 2017 at 1:14 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;"><div style="word-wrap: break-word;" class=""><span class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Apr 16, 2017, at 10:42 AM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_5034690051034842618Apple-interchange-newline"><div class=""><span 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; float: none; display: inline !important;" class="">The point is that, when you manipulate two real numbers, sometimes there is no numeric result. You cannot simply wish this away with a new numeric type because it is not an artifact of _modeling_ real numbers but rather intrinsic to mathematics itself.</span></div></blockquote></div><br class=""></span><div class="">I agree with the rest of what you said, but I have to disagree on this point.&nbsp; What I think he is saying is that, in Swift, we really should be representing the NaN case as an optional instead of a magic value on the type itself (similar to how swift uses an optional instead of NSNotFound).</div><div class=""><br class=""></div><div class="">In fact, that might be an actual option here.&nbsp; For ‘Double?’ the compiler could use the bit pattern for NaN internally to represent .none (I believe it does similar tricks to save space with other optional types).&nbsp; Then disallow reference to NaN within swift code.&nbsp; Functions or operations which could produce NaN would either have to produce an optional or trap in case of NaN. (e.g. the trig functions would likely return an optional, and 0/0 would trap).</div><div class=""><br class=""></div><div class="">I think it would actually lead to much better code because the compiler would force you to have to explicitly deal with the case of optional/NaN when it is possible.&nbsp; Migration would be tricky though...</div></div></blockquote><div class=""><br class=""></div><div class="">This is essentially a cosmetic renaming from `Double` to `Double?`. There are rules for propagating NaN which numeric algorithms expect. For example, `cos(.nan)` returns a value. If your design is to work, every function that takes a `Double` will need to take a `Double?`.</div><div class=""><br class=""></div><div class="">Just as Swift String conforms to Unicode standards, FloatingPoint conforms to IEEE standards. You'd have to come up with enormous benefits to justify breaking that. Doing so for Swift 4 is plainly a non-starter.</div><div class=""><br class=""></div><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;"><div style="word-wrap: break-word;" class=""><div class=""></div><div class="">Thanks,</div><div class="">Jon</div></div></blockquote></div></div></div></div></blockquote></div><br class=""></div></body></html>