Skip to content

Commit f6abc00

Browse files
authored
Merge pull request #1147 from mathics/fixPossibleZeroQ
Fix PossibleZeroQ
2 parents fb978ca + 9a44fce commit f6abc00

3 files changed

Lines changed: 17 additions & 11 deletions

File tree

mathics/builtin/arithmetic.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,19 +1309,19 @@ class PossibleZeroQ(SympyFunction):
13091309
<dd>returns 'True' if basic symbolic and numerical methods suggest that expr has value zero, and 'False' otherwise.
13101310
</dl>
13111311
1312-
## Test whether a numeric expression is zero:
1313-
## >> PossibleZeroQ[E^(I Pi/4) - (-1)^(1/4)]
1314-
## = True
1312+
Test whether a numeric expression is zero:
1313+
>> PossibleZeroQ[E^(I Pi/4) - (-1)^(1/4)]
1314+
= True
13151315
1316-
## The determination is approximate.
1316+
The determination is approximate.
13171317
13181318
Test whether a symbolic expression is likely to be identically zero:
13191319
>> PossibleZeroQ[(x + 1) (x - 1) - x^2 + 1]
13201320
= True
13211321
13221322
1323-
## >> PossibleZeroQ[(E + Pi)^2 - E^2 - Pi^2 - 2 E Pi]
1324-
## = True
1323+
>> PossibleZeroQ[(E + Pi)^2 - E^2 - Pi^2 - 2 E Pi]
1324+
= True
13251325
13261326
Show that a numeric expression is nonzero:
13271327
>> PossibleZeroQ[E^Pi - Pi^E]
@@ -1346,6 +1346,11 @@ def apply(self, expr, evaluation):
13461346

13471347
sympy_expr = expr.to_sympy()
13481348
result = _iszero(sympy_expr)
1349+
if result is None:
1350+
# try expanding the expression
1351+
exprexp = Expression("ExpandAll", expr).evaluate(evaluation)
1352+
exprexp = exprexp.to_sympy()
1353+
result = _iszero(exprexp)
13491354
if result is None:
13501355
# Can't get exact answer, so try approximate equal
13511356
numeric_val = Expression("N", expr).evaluate(evaluation)

mathics/core/evaluation.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ def parse(self, query):
262262

263263
return self.parse_feeder(MathicsSingleLineFeeder(query))
264264

265+
265266
def parse_evaluate(self, query, timeout=None):
266267
expr = self.parse(query)
267268
if expr is not None:
@@ -273,7 +274,6 @@ def parse_feeder(self, feeder):
273274
def parse_feeder_returning_code(self, feeder):
274275
"Parse a single expression from feeder and print the messages."
275276
from mathics.core.parser.util import parse_returning_code
276-
277277
try:
278278
result, source_code = parse_returning_code(self.definitions, feeder)
279279
except TranslateError:

mathics/core/expression.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2109,7 +2109,7 @@ def __neg__(self) -> 'Rational':
21092109

21102110
@property
21112111
def is_zero(self) -> bool:
2112-
return self.numerator().is_zero
2112+
return self.numerator().is_zero and not self.denominator().is_zero()
21132113

21142114

21152115
class Real(Number):
@@ -2257,9 +2257,10 @@ def is_zero(self) -> bool:
22572257

22582258
@property
22592259
def is_approx_zero(self) -> bool:
2260-
# FIXME: figure out how to hook int $MachinePrecision and
2261-
# what the right definition here would be.
2262-
return abs(self.value) <= 10**-14
2260+
# In WMA, Chop[10.^(-10)] == 0,
2261+
# so, lets take it.
2262+
res = abs(self.value) <= 1e-10
2263+
return res
22632264

22642265

22652266
class PrecisionReal(Real):

0 commit comments

Comments
 (0)