<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 24, 2016 at 12:12 AM, Max Moiseev <span dir="ltr">&lt;<a href="mailto:moiseev@apple.com" target="_blank">moiseev@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Nicola,<br>
<br>
&gt; For these reasons, I think it would make sense to explicitly request that<br>
&gt; the remainder operation never traps, and remove the overflow variants.<br>
It will still trap when you divide by 0. But in that case falling back to the same generic overflow logic is not the best idea.<br>
I agree that remainder is special, let me see what I can do about it.<br>
<br></blockquote><div><br></div><div>LOL, yes of course, I forgot about the obvious trapping case.<br><br></div><div>However,
 division by 0 isn&#39;t an overflow: it&#39;s an undefined operation. I find it
 somewhat surprising that dividedWithOverflow/remainderWithOverflow 
allow attempting this operation.<br><br></div><div>To me, the intuitive 
semantics of the WithOverflow methods are &quot;perform the operation, and if
 the result doesn&#39;t fit in the given type, return a truncated result and
 an overflow flag&quot;. This is not what happens when dividing by 0, because
 the result simply doesn&#39;t exist.<br></div><div><br></div><div>I think I would prefer if rhs != 0 was documented as an explicit precondition of the division and remainder operations, and dividedWithOverflow/remainderWithOverflow trapped because of precondition failure.<br><br></div><div>If it is desirable that the WithOverflow methods never trap, then I think it would be better to add a `divisionByZero` case to the ArithmeticOverflow enum and return that instead of the generic `overflow`.<br><br></div><div>Thanks,<br></div><div>Nicola<br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Thanks,<br>
Max<br>
<br>
<br>
&gt; On Jun 23, 2016, at 2:38 PM, Nicola Salmoria via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Max Moiseev via swift-evolution &lt;swift-evolution@...&gt; writes:<br>
&gt;<br>
&gt;&gt;&gt; For FixedWidthInteger#dividedWithOverflow/remainderWithOverflow, under<br>
&gt; what situations would<br>
&gt;&gt; you have an overflow? I could only come up with something like<br>
&gt; Int.min.dividedWithOverflow(-1).<br>
&gt;&gt; If you look at the prototype here:<br>
&gt;&gt;<br>
&gt; <a href="https://github.com/apple/swift/blob/master/test/Prototypes" rel="noreferrer" target="_blank">https://github.com/apple/swift/blob/master/test/Prototypes</a><br>
&gt; /Integers.swift.gyb#L789<br>
&gt;&gt; there is<br>
&gt;&gt; exactly the check that you’ve mentioned, but for all signed integers.<br>
&gt; Besides, it is very convenient to<br>
&gt;&gt; have all the arithmetic operations be implemented the same way, even if<br>
&gt; there were no real overflows for division.<br>
&gt;<br>
&gt; I agree with this for the four basic operations, but not for the remainder<br>
&gt; operation.<br>
&gt;<br>
&gt; By definition, the remainder is always strictly smaller (in absolute value)<br>
&gt; than the divisor, so even if the division itself overflows, the remainder<br>
&gt; must be representable, so technically it never overflow.<br>
&gt;<br>
&gt; In the only actual case where the division overflow, that is Int.min / -1,<br>
&gt; the remainder is simply 0.<br>
&gt;<br>
&gt; For these reasons, I think it would make sense to explicitly request that<br>
&gt; the remainder operation never traps, and remove the overflow variants.<br>
&gt;<br>
&gt; Nicola<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
</blockquote></div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jun 24, 2016 at 12:12 AM, Max Moiseev <span dir="ltr">&lt;<a href="mailto:moiseev@apple.com" target="_blank">moiseev@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Nicola,<br>
<br>
&gt; For these reasons, I think it would make sense to explicitly request that<br>
&gt; the remainder operation never traps, and remove the overflow variants.<br>
It will still trap when you divide by 0. But in that case falling back to the same generic overflow logic is not the best idea.<br>
I agree that remainder is special, let me see what I can do about it.<br>
<br>
Thanks,<br>
Max<br>
<br>
<br>
&gt; On Jun 23, 2016, at 2:38 PM, Nicola Salmoria via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Max Moiseev via swift-evolution &lt;swift-evolution@...&gt; writes:<br>
&gt;<br>
&gt;&gt;&gt; For FixedWidthInteger#dividedWithOverflow/remainderWithOverflow, under<br>
&gt; what situations would<br>
&gt;&gt; you have an overflow? I could only come up with something like<br>
&gt; Int.min.dividedWithOverflow(-1).<br>
&gt;&gt; If you look at the prototype here:<br>
&gt;&gt;<br>
&gt; <a href="https://github.com/apple/swift/blob/master/test/Prototypes" rel="noreferrer" target="_blank">https://github.com/apple/swift/blob/master/test/Prototypes</a><br>
&gt; /Integers.swift.gyb#L789<br>
&gt;&gt; there is<br>
&gt;&gt; exactly the check that you’ve mentioned, but for all signed integers.<br>
&gt; Besides, it is very convenient to<br>
&gt;&gt; have all the arithmetic operations be implemented the same way, even if<br>
&gt; there were no real overflows for division.<br>
&gt;<br>
&gt; I agree with this for the four basic operations, but not for the remainder<br>
&gt; operation.<br>
&gt;<br>
&gt; By definition, the remainder is always strictly smaller (in absolute value)<br>
&gt; than the divisor, so even if the division itself overflows, the remainder<br>
&gt; must be representable, so technically it never overflow.<br>
&gt;<br>
&gt; In the only actual case where the division overflow, that is Int.min / -1,<br>
&gt; the remainder is simply 0.<br>
&gt;<br>
&gt; For these reasons, I think it would make sense to explicitly request that<br>
&gt; the remainder operation never traps, and remove the overflow variants.<br>
&gt;<br>
&gt; Nicola<br>
&gt; _______________________________________________<br>
&gt; swift-evolution mailing list<br>
&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br>
</blockquote></div><br></div>