Seems fine to me. One addition though: some sort of round(withPrecision: Int)<br><div class="gmail_quote"><div dir="ltr">On Mon, Jun 27, 2016 at 12:23 Stephen Canon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On Jun 27, 2016, at 12:34 PM, Karl &lt;<a href="mailto:razielim@gmail.com" target="_blank">razielim@gmail.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><br><div><blockquote type="cite"><div>On 27 Jun 2016, at 16:23, Stephen Canon &lt;<a href="mailto:scanon@apple.com" target="_blank">scanon@apple.com</a>&gt; wrote:</div><br><div><div style="word-wrap:break-word"><div><br><blockquote type="cite"><div dir="auto"><div>On Jun 25, 2016, at 05:06, Karl via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br><br></div><blockquote type="cite"><div>Proposal: <a href="https://gist.github.com/karwa/273db66cd8a5fe2c388ccc7de9c4cf31" target="_blank">https://gist.github.com/karwa/273db66cd8a5fe2c388ccc7de9c4cf31</a></div></blockquote></div></blockquote><div><br></div><div>Karl, thanks for writing this up.  It should be extended to include not only floor( ) and ceiling( ), but also:</div><div><br></div><div><span style="white-space:pre-wrap">        </span>/// Returns the integral value closest to `self` whose magnitude is not greater than that of `self`.</div><div><span style="white-space:pre-wrap">        </span>func truncate( ) -&gt; Self</div><div><br></div><div><span style="white-space:pre-wrap">        </span>/// Returns the integral value closest to `self`.  If two integrers are equally close, the even one</div><div><span style="white-space:pre-wrap">        </span>/// is returned.</div><div><span style="white-space:pre-wrap">        </span>//  NOTE: The name of this function requires bike-shedding.  I’ve chosen a deliberately poor</div><div><span style="white-space:pre-wrap">        </span>//  name as a straw-man.</div><div><span style="white-space:pre-wrap">        </span>func roundToNearestTiesToEven( ) -&gt; Self</div><div><br></div><div><div><span style="white-space:pre-wrap">        </span>/// Returns the integral value closest to `self`.  If two integrers are equally close, the one with</div><div><span style="white-space:pre-wrap">        </span>/// greater magnitude is returned.</div><div><span style="white-space:pre-wrap">        </span>//  NOTE: The name of this function requires bike-shedding.  I’ve chosen a deliberately poor</div><div><span style="white-space:pre-wrap">        </span>//  name as a straw-man.</div></div><div><span style="white-space:pre-wrap">        </span>func roundToNearestTiesAway( ) -&gt; Self</div><div><br></div><div>and mutating versions of those.</div><div><br></div></div></div></div></blockquote><div><br></div><div>I was trying to add these, but working out the names of the mutating functions is difficult. How is truncate different to floor if it returns an integral value and can never round up?</div></div></div></div></blockquote><blockquote type="cite"><br></blockquote><blockquote type="cite"><div><div style="word-wrap:break-word"><div><div>Perhaps for the other functions, we could have a general `round` function with a tiebreak-enum parameter (it would be great if we could embed enums in protocols, but I’m not sure if that’s even on the roadmap):</div><div><br></div><div>enum FloatingPointRoundingStrategy {   // or something to that effect</div><div>    case preferEven</div><div>    case preferGreatest</div><div>}</div><div><br></div><div>func rounded(inTiebreak: FloatingPointRoundingStrategy) -&gt; Self</div><div><br></div><div>I think `(4.5).rounded(inTiebreak: .preferGreatest) == 5.0` looks quite nice.</div></div></div></div></blockquote><br></div></div><div style="word-wrap:break-word"><div>Yes, something along these lines might work, though `FloatingPointRoundingStrategy` isn’t quite right; after all, round-towards-infinity (aka ceiling) is also a rounding strategy.</div><div><br></div><div>One option (which I don’t totally love, but which simplifies the API surface quite a bit, and avoids adding more formXXXX constructions) would be to fold all the rounding rules into a single member function (very strawman):</div><div><br></div><div><span style="white-space:pre-wrap">        </span>/// Describes a rule for rounding to an integral value.</div><div><span style="white-space:pre-wrap">        </span>enum RoundingRule {</div><div><span style="white-space:pre-wrap">                </span>/// The result is the closest representable value greater than or equal to the source.</div><div><span style="white-space:pre-wrap">                </span>case upwards</div><div><span style="white-space:pre-wrap">                </span>/// The result is the closest representable value less than or equal to the source.</div><div><span style="white-space:pre-wrap">                </span>case downwards</div><div><span style="white-space:pre-wrap">                </span>/// The result is the closest representable value whose magnitude is less than or equal to that of the source.</div><div><span style="white-space:pre-wrap">                </span>case towardZero</div><div><span style="white-space:pre-wrap">                </span>/// The result is the closest representable value; if two values are equally close, the even one is chosen.</div><div><span style="white-space:pre-wrap">                </span>case toNearestTiesToEven</div><div><span style="white-space:pre-wrap">                </span>/// The result is the closest representable value; if two values are equally close, the one with greater magnitude is chosen.</div><div><span style="white-space:pre-wrap">                </span>case toNearestTiesAway</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">        </span>/// Rounds to an integral value according to the specified rounding rule.</div><div><span style="white-space:pre-wrap">        </span>mutating func round(_ rule: RoundingRule = toNearestTiesAway)</div><div><br></div><div><span style="white-space:pre-wrap">        </span>func rounded(_ rule: RoundingRule = toNearestTiesAway) -&gt; Self</div><div><br></div><div>That gives us e.g.:</div><div><br></div><div><span style="white-space:pre-wrap">        </span>let x = -2.5</div><div><span style="white-space:pre-wrap">        </span>x.round(.upwards)<span style="white-space:pre-wrap">        </span>// -2</div><div><span style="white-space:pre-wrap">        </span>x.round(.downwards)<span style="white-space:pre-wrap">        </span>// -3</div><div><span style="white-space:pre-wrap">        </span>x.round(.towardZero)<span style="white-space:pre-wrap">        </span>// -2</div><div><span style="white-space:pre-wrap">        </span>x.round(.toNearestTiesToEven)<span style="white-space:pre-wrap">        </span>// -2</div><div><span style="white-space:pre-wrap">        </span>x.round()<span style="white-space:pre-wrap">        </span>// -3</div><div><br></div><div>We might also provide free functions that implement the most common operations under the familiar libc names (I realize that free-functions are not broadly considered “swifty”, but they may be appropriate here; we would effectively simply be moving these free functions from Darwin/Glibc into the stdlib, and making them available for all FloatingPoint types).</div><div><br></div><div><span style="white-space:pre-wrap">        </span>func ceil&lt;T: FloatingPoint&gt;(_ x: T) -&gt; T {</div><div><span style="white-space:pre-wrap">                </span>return x.rounded(.upwards)</div><div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">        </span>func floor&lt;T: FloatingPoint&gt;(_ x: T) -&gt; T {</div><span style="white-space:pre-wrap">                </span>return x.rounded(.downwards)<div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><span style="white-space:pre-wrap">        </span>func trunc&lt;T: FloatingPoint&gt;(_ x: T) -&gt; T {</div><span style="white-space:pre-wrap">                </span>return x.rounded(.towardZero)<div><span style="white-space:pre-wrap">        </span>}</div><div><br></div><div><br></div></div>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">-Saagar Jha</div></div>