[GiNaC-devel] atan2 throws divide by zero
G B
g.c.b.at.work at gmail.com
Fri Mar 26 01:11:21 CET 2010
Thanks, All. I'll look forward to the changes percolating through.
Cheers--
Greg
On Thu, Mar 25, 2010 at 2:41 PM, Richard B. Kreckel <kreckel at ginac.de>wrote:
> Hi!
>
>
> Jens Vollinga wrote:
>
>> Am 25.03.2010 00:17, schrieb G B:
>>
>>> I stumbled upon this using Sage, but developers there have traced it to
>>> a problem in GiNaC by running the following in ginsh:
>>>
>>> > atan2(-Pi,0);
>>>
>>> The response is:
>>> power::eval(): division by zero
>>>
>>> atan2 appears to work for other values, including (positive) (Pi,0), but
>>> (-Pi,0) fails.
>>>
>>
>> thanks for the bug report. I fixed that bug in the repository.
>> Finally it is time to make a new release ... :-)
>>
>
> Wait a minute, I think your fix is wrong. It assumes that if y.info(info_flags::real)
> and not y.info(info_flags::positive) and not y.is_zero(), then y must be
> negative. But that's not correct, because info returns true if the predicate
> is known to be true and false if it os known to be false or if it is
> unknown. Consider, for instance, positive symbols a and b and ex x = a-b.
> So, the patch introduces actually a new bug.
>
> What's really wrong is the last part in atan2_eval, where atan(real, real)
> -> atan(y/x) +/- Pi. Ironically, it is suffering from the same mistake as
> your patch. This ought to fix it:
>
> @@ -877,10 +877,13 @@ static ex atan2_eval(const ex & y, const ex & x)
> if (y.info(info_flags::real) && x.info(info_flags::real)) {
> if (x.info(info_flags::positive))
> return atan(y/x);
> - else if (y.info(info_flags::positive))
> - return atan(y/x)+Pi;
> - else
> - return atan(y/x)-Pi;
> +
> + if (x.info(info_flags::negative)) {
> + if (y.info(info_flags::positive))
> + return atan(y/x)+Pi;
> + if (y.info(info_flags::negative))
> + return atan(y/x)-Pi;
> + }
> }
>
> return atan2(y, x).hold();
>
> It appears that this bug has been latent until Vladimir's patch
> c7299e51d5ecf6. The bad news is that with my patch atan2(-Pi,0) isn't
> simplified at all any more. One could argue that GiNaC should evaluate
> ex(-Pi).info(info_flags::negative) -> true. This would make atan2(-Pi,0)
> evaluate to -Pi/2 again.
>
> -richy.
> --
> Richard B. Kreckel
> <http://www.ginac.de/~kreckel/>
>
> _______________________________________________
> GiNaC-devel mailing list
> GiNaC-devel at ginac.de
> https://www.cebix.net/mailman/listinfo/ginac-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.cebix.net/pipermail/ginac-devel/attachments/20100325/7c282276/attachment.htm>
More information about the GiNaC-devel
mailing list