[phobos] Fixing std.math.pow(x, int.min)

Lars Tandle Kyllingstad lars at kyllingen.net
Mon Jun 21 23:50:25 PDT 2010


You're right, that works.  Thanks!

But may I ask _why_ it works?  Consider:

    uint x = -int.min;

My first guess would be that the result of the negation is an int as
well (and therefore == int.min), and that the cast to uint doesn't
happen until the assignment.  Apparently this isn't the case.

I'll check the fix in, then.

-Lars


On Tue, 2010-06-22 at 00:01 +0200, Don Clugston wrote:
> I think that actually m should be an unsigned type, then no special
> case is required. Line 2898.
> 
> -  G m = n;
> +   Unsigned!(G) m = n;
> 
> Too late to test right now, but see if that works.
> 
> 
> On 21 June 2010 21:28, Lars Tandle Kyllingstad <lars at kyllingen.net> wrote:
> > Bug 3202 basically says that std.math.pow(someFloat, int.min) enters an
> > infinite loop because int.min == -int.min.  Here's my suggestion for a
> > fix:
> >
> > --- std/math.d  (revision 1672)
> > +++ std/math.d  (working copy)
> > @@ -2904,6 +2904,12 @@
> >             return 1 / x;
> >         case -2:
> >             return 1 / (x * x);
> > +        static if (isSigned!G)
> > +        {
> > +        case G.min:
> > +            enum absGmin = cast(Unsigned!G)(-(G.min+1)) + 1;
> > +            return 1 / pow(x, absGmin);
> > +        }
> >         default:
> >         }
> >
> > I'm wary of doing anything to std.math, since it's so fundamental and
> > performance-critical.  So please, speak up if you see a problem with
> > this patch.
> >
> > -Lars
> >
> > _______________________________________________
> > phobos mailing list
> > phobos at puremagic.com
> > http://lists.puremagic.com/mailman/listinfo/phobos
> >
> _______________________________________________
> phobos mailing list
> phobos at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/phobos




More information about the phobos mailing list