Zero testing
- To: mathgroup at smc.vnet.net
- Subject: [mg53106] Zero testing
- From: Maxim <ab_def at prontomail.com>
- Date: Thu, 23 Dec 2004 07:59:42 -0500 (EST)
- Sender: owner-wri-mathgroup at wolfram.com
By 'zero testing' I mean the problem of deciding whether a given numerical
quantity is exactly equal to zero. Often Mathematica doesn't make
necessary checks at all:
In[1]:=
a = Pi/4; b = I*Log[-(-1)^(3/4)];
Limit[(a - b)/x, x -> 0]
Integrate[1/((x - a)*(x - b)), x]
Integrate[1/(x - b), {x, 0, 1}]
Out[2]=
DirectedInfinity[Pi - (4*I)*Log[-(-1)^(3/4)]]
Out[3]=
(-4*((-2*I)*ArcTan[Log[-(-1)^(3/4)]/x] - 2*Log[Pi - 4*x] + Log[16*(x^2
+ Log[-(-1)^(3/4)]^2)]))/(2*Pi - (8*I)*Log[-(-1)^(3/4)])
Out[4]=
((-I)*Pi - (2*I)*ArcTan[Log[-(-1)^(3/4)]] - Log[Log[-(-1)^(3/4)]^2]
+ Log[1 + Log[-(-1)^(3/4)]^2])/2
The constants a and b are equal to each other. We can see that Out[2] is
incorrect because it is equal to ComplexInfinity and the limit of 0/x is
0; Out[3] is also equal to ComplexInfinity (the denominator is zero) and
therefore wrong as well; finally, Out[4] is incorrect because the integral
doesn't converge.
A variation of the same problem is when we're numerically evaluating a
discontinuous function for an argument close to a discontinuity point. In
those cases Mathematica does perform necessary checks but handles more
complicated cases incorrectly, especially when the branch cuts are
concerned:
In[5]:=
Sign[Im[Sqrt[-1 - 10^-18*I]]]
Out[5]=
1
In[6]:=
((1 + I*(-167594143/78256779 + Pi))^4)^(1/2)
Out[6]=
(1 + I*(-167594143/78256779 + Pi))^2
In fact In[5] is equal to -1 and In[6] is equal to -(1
+ I*(-167594143/78256779 + Pi))^2. In the last case we do not even apply
any functions, the error is in the automatic simplifications. Sometimes
setting a high value for $MinPrecision helps, but here it doesn't have any
effect either.
Maxim Rytin
m.r at inbox.ru
- Follow-Ups:
- Re: Zero testing
- From: Andrzej Kozlowski <akoz@mimuw.edu.pl>
- Re: Zero testing