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

Don Clugston dclugston at googlemail.com
Mon Jun 21 15:01:45 PDT 2010


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
>


More information about the phobos mailing list