Opened 3 years ago
Last modified 6 months ago
#24850 new enhancement
Provide convenient Expression.convert_numeric()
Reported by: | rws | Owned by: | |
---|---|---|---|
Priority: | trivial | Milestone: | sage-8.2 |
Component: | symbolics | Keywords: | |
Cc: | Merged in: | ||
Authors: | Reviewers: | ||
Report Upstream: | N/A | Work issues: | |
Branch: | Commit: | ||
Dependencies: | Stopgaps: |
Description
From https://groups.google.com/forum/#!topic/sage-support/3eCHzmJ1MXY:
sage: cm = units.length.centimeter; sage: x = 1e-6*cm; sage: x (1.00000000000000e-6)*centimeter sage: x.n(digits=2) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-3595ea137553> in <module>() ----> 1 x.n(digits=Integer(2)) /home/Scratch/Install/Linux/SageMath/sage-8.1-Fedora_26-x86_64/SageMath/src/sage/structure/element.pyx in sage.structure.element.Element.n (build/cythonized/sage/structure/element.c:8063)() 861 0.666666666666667 862 """ --> 863 return self.numerical_approx(prec, digits, algorithm) 864 865 N = deprecated_function_alias(13055, n) /home/Scratch/Install/Linux/SageMath/sage-8.1-Fedora_26-x86_64/SageMath/src/sage/symbolic/expression.pyx in sage.symbolic.expression.Expression.numerical_approx (build/cythonized/sage/symbolic/expression.cpp:36128)() 5782 res = x.pyobject() 5783 else: -> 5784 raise TypeError("cannot evaluate symbolic expression numerically") 5785 5786 # Important -- the we get might not be a valid output for numerical_approx in TypeError: cannot evaluate symbolic expression numerically
Simply call _convert()
with the parent keyword.
Change History (3)
comment:1 Changed 3 years ago by
- Keywords beginner added
- Priority changed from major to trivial
comment:2 Changed 3 years ago by
comment:3 Changed 6 months ago by
- Keywords beginner removed
As suggested in the description of this ticket, and specifically stated in the sage-support discussion that is mentioned there, the _convert()
method can deal with the example in this ticket:
sage: cm = units.length.centimeter; sage: x = 1e-6*cm; sage: x._convert({'parent':RealField(10)}) (1.0e-6)*centimeter
So this problem will be solved if #12577 is merged. And the case here (or something similar) could be added to the docstring as an example.
However, I don't think that would be a complete solution to the issue that is raised here, because attempting to evaluate sin(x)*cm
numerically (when x
is a variable) should give a TypeError: cannot evaluate symbolic expression numerically
, but we have:
sage: var('x'); sage: (sin(x)*cm)._convert({'parent':RealField(10)}) 1.0*centimeter*sin(x)
The current implementation of numerical_approx has
If
x
is a n number with units (example in ticket) then it would go to the else block, So can you suggest a check for expression which are numbers attached with units?