<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 15 March 2013 22:00, Johannes Pfau <span dir="ltr"><<a href="mailto:nospam@example.com" target="_blank">nospam@example.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Am Fri, 15 Mar 2013 20:20:14 +0000<br>
schrieb Iain Buclaw <<a href="mailto:ibuclaw@ubuntu.com">ibuclaw@ubuntu.com</a>>:<br>
<div class="im"><br>
> On 15 March 2013 18:35, Johannes Pfau <<a href="mailto:nospam@example.com">nospam@example.com</a>> wrote:<br>
><br>
</div><div><div class="h5">> > Forget what I've said, I somehow read that code as a<br>
> > bitwise/reinterpret cast but of course the code does an<br>
> > integer/float conversion so it's probably OK.<br>
> ><br>
> > This is more interesting:<br>
> ><br>
> > ---<br>
> >     float f = float.infinity;<br>
> >     float f2 = float.max;<br>
> >     int i = cast(int) f;<br>
> >     int i2 = cast(int) f2;<br>
> >     writefln("0x%x == int.min(0x%x)", i, int.min);<br>
> >     writefln("0x%x == int.max(0x%x)", cast(int)float.infinity,<br>
> > int.max); writefln("0x%x == int.min(0x%x)", i2, int.min);<br>
> >     writefln("0x%x == int.max(0x%x)", cast(int)float.max, int.max);<br>
> > ---<br>
> ><br>
> > const folding expands to int.max, but the same code at runtime<br>
> > expands to int.min. C does not define what happens if too large<br>
> > float values are cast into ints. Do you know if D somehow defines<br>
> > this?<br>
> ><br>
> > (There's a failing test in the test suite which assumes that the<br>
> > result is int.min in all cases above)<br>
> ><br>
><br>
><br>
</div></div><div class="im">> I think the behaviour from DMD is more incidental than intended.<br>
> They use C's FLOAT_INFINITY, etc, macros. But because of the way it's<br>
> written, gcc doesn't optimise the use of the value.   Whereas with<br>
> gdc, because it uses gcc's real_t types, values of extreme numbers<br>
> may change to be either 2147483647 or -2147483648 depending on<br>
> whether -O is used.  As I said, in most cases you can see the same<br>
> behaviour in C.<br>
><br>
> I can see if there might be some flag I can set to try and make gcc's<br>
> codegen more safe for floats, but that might have impact on runtime.<br>
><br>
><br>
<br>
</div>I think in this case GCC might intentionally use saturating overflows.<br>
I just found this message:<br>
<br>
<a href="http://gcc.gnu.org/ml/gcc-patches/2003-09/msg02090.html" target="_blank">http://gcc.gnu.org/ml/gcc-patches/2003-09/msg02090.html</a><br>
<br>
(This doesn't explain though what the test (constfold.d:test2) in the<br>
dmd testsuite is actually supposed to test...)<br>
</blockquote></div><br><br></div><div class="gmail_extra">It tests an incidental feature of dmd-generated code that got turned into a test case.  Rather than something defined in the spec.<br clear="all"></div><div class="gmail_extra">
<br>-- <br>Iain Buclaw<br><br>*(p < e ? p++ : p) = (c & 0x0f) + '0';
</div></div>