Variable-precision arithmetic (arbitrary-precision arithmetic)
collapse all in page
Syntax
xVpa = vpa(x)
xVpa = vpa(x,d)
Description
example
xVpa = vpa(x)
uses variable-precision arithmetic (arbitrary-precision floating-point numbers) to evaluate each element of the symbolic input x
to at least d
significant digits, where d
is the value of the digits
function. The default value of digits
is 32.
example
xVpa = vpa(x,d)
uses at least d
significant digits instead of the value of digits
.
Examples
collapse all
Evaluate Symbolic Inputs with Variable-Precision Arithmetic
Open Live Script
Evaluate symbolic inputs with variable-precision floating-point arithmetic. By default, vpa
calculates values to 32 significant digits.
p = sym(pi);pVpa = vpa(p)
pVpa =
syms xa = sym(1/3);f = a*sin(2*p*x);fVpa = vpa(f)
fVpa =
Evaluate elements of vectors or matrices with variable-precision arithmetic.
V = [x/p a^3];VVpa = vpa(V)
VVpa =
M = [sin(p) cos(p/5); exp(p*x) x/log(p)];MVpa = vpa(M)
MVpa =
Change Precision Used by vpa
Open Live Script
By default, vpa
evaluates inputs to 32 significant digits. You can change the number of significant digits by using the digits
function.
Approximate the expression 100001/10001
with seven significant digits using digits
. Save the old value of digits
returned by digits(7)
. The vpa
function returns only five significant digits, which can mean the remaining digits are zeros.
digitsOld = digits(7);y = sym(100001)/10001;yVpa = vpa(y)
yVpa =
Check if the remaining digits are zeros by using a higher precision value of 25
. The result shows that the remaining digits are in fact zeros that are part of a repeating decimal.
digits(25)yVpa = vpa(y)
yVpa =
Alternatively, to override digits
for a single vpa
call, change the precision by specifying the second argument.
Find π to 100 significant digits by specifying the second argument.
pVpa =
Restore the original precision value in digitsOld
for further calculations.
digits(digitsOld)
Numerically Approximate Symbolic Results
Open Live Script
While symbolic results are exact, they might not be in a convenient form. You can use vpa
to numerically approximate exact symbolic results.
Solve a high-degree polynomial for its roots using solve
. The solve
function cannot symbolically solve the high-degree polynomial and represents the roots using root
.
syms xy = solve(x^4 - x + 1, x)
y =
Use vpa
to numerically approximate the roots.
yVpa = vpa(y)
yVpa =
vpa
Uses Guard Digits to Maintain Precision
Open Live Script
The value of the digits
function specifies the minimum number of significant digits used. Internally, vpa
can use more digits than digits
specifies. These additional digits are called guard digits because they guard against round-off errors in subsequent calculations.
Numerically approximate 1/3
using four significant digits.
a = vpa(1/3,4)
a =
Approximate the result a
using 20 digits. The result shows that the toolbox internally used more than four digits when computing a
. The last digits in the result are incorrect because of the round-off error.
aVpa = vpa(a,20)
aVpa =
Avoid Hidden Round-Off Errors
Open Live Script
Hidden round-off errors can cause unexpected results.
Evaluate 1/10
with the default 32-digit precision and then with the 10-digit precision.
a = vpa(1/10,32)
a =
b = vpa(1/10,10)
b =
Superficially, a
and b
look equal. Check their equality by finding a - b
.
roundoff = a - b
roundoff =
The difference is not equal to zero because b
was calculated with only 10
digits of precision and contains a larger round-off error than a
. When you find a - b
, vpa
approximates b
with 32 digits. Demonstrate this behavior.
roundoff = a - vpa(b,32)
roundoff =
vpa
Restores Precision of Common Double-Precision Inputs
Open Live Script
Unlike exact symbolic values, double-precision values inherently contain round-off errors. When you call vpa
on a double-precision input, vpa
cannot restore the lost precision, even though it returns more digits than the double-precision value. However, vpa
can recognize and restore the precision of expressions of the form , , , , and , where and are modest-sized integers.
First, demonstrate that vpa
cannot restore precision for a double-precision input. Call vpa
on a double-precision result and the same symbolic result.
dp = log(3);s = log(sym(3));dpVpa = vpa(dp)
dpVpa =
sVpa = vpa(s)
sVpa =
d = sVpa - dpVpa
d =
As expected, the double-precision result differs from the exact result at the 16th decimal place.
Demonstrate that vpa
restores precision for expressions of the form , , , , and , where and are modest-sized integers, by finding the difference between the vpa
call on the double-precision result and on the exact symbolic result. The differences are showing that vpa
restores lost precision for the double-precision input.
d = vpa(1/3) - vpa(1/sym(3))
d =
d = vpa(pi) - vpa(sym(pi))
d =
d = vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2)))
d =
d = vpa(2^66) - vpa(2^sym(66))
d =
d = vpa(10^25) - vpa(10^sym(25))
d =
Evaluate Symbolic Matrix Variable with Variable-Precision Arithmetic
Since R2022b
Open Live Script
Create a symbolic expression S
that represents , where is a 2-by-1 symbolic matrix variable.
syms X [2 1] matrixS = sin(hilb(2)*pi*X)
S =
Evaluate the expression with variable-precision arithmetic.
SVpa = vpa(S)
SVpa =
Input Arguments
collapse all
x
— Input to evaluate
number | vector | matrix | multidimensional array | symbolic number | symbolic vector | symbolic matrix | symbolic multidimensional array | symbolic expression | symbolic function | symbolic character vector | symbolic matrix variable
Input to evaluate, specified as a number, vector, matrix, multidimensional array, or a symbolic number, vector, matrix, multidimensional array, expression, function, character vector, or matrix variable.
d
— Number of significant digits
positive integer scalar
Number of significant digits, specified as a positive integer scalar. d
must be greater than 1 and less than .
Output Arguments
collapse all
xVpa
— Variable-precision output
symbolic number | symbolic vector | symbolic matrix | symbolic multidimensional array | symbolic expression | symbolic function
Variable-precision output, returned as a symbolic number, vector, matrix, multidimensional array, expression, or function.
For almost all input data types (such as
sym
,symmatrix
,double
,single
,int64
, and so on),vpa
returns the output as data typesym
.If the input is a symbolic function of type
symfun
, thenvpa
returns the output as data typesymfun
. For example,syms f(x); f(x) = pi*x; g = vpa(f)
returns the outputg
as typesymfun
.If the input is an evaluated symbolic function of type
sym
, such asg = vpa(f(x))
, thenvpa
returns the output as data typesym
.
Tips
vpa
does not convert fractionsin the exponent to floating point. For example,vpa(a^sym(2/5))
returnsa^(2/5)
.vpa
uses more digits than thenumber of digits specified bydigits
. These extradigits guard against round-off errors in subsequent calculations andare called guard digits.When you call
vpa
on a numericinput, such as1/3
,2^(-5)
,orsin(pi/4)
, the numeric expression is evaluatedto a double-precision number that contains round-off errors. Then,vpa
iscalled on that double-precision number. For accurate results, convertnumeric expressions to symbolic expressions withsym
.For example, to approximateexp(1)
, usevpa(exp(sym(1)))
.If the second argument d is notan integer,
vpa
rounds it to the nearest integerwithround
.vpa
restores precision for numericinputs that match the forms p/q, pπ/q, (p/q)1/2, 2q,and 10q,where p and q are modest-sizedintegers.Variable-precision arithmetic is different from IEEE® Floating-Point Standard 754 in these ways:
Inside computations, division by zero throws an error.
The exponent range is larger than in any predefined IEEE mode.
vpa
underflows below approximately10^(-323228496)
.Denormalized numbers are not implemented.
Zeros are not signed.
The number of binary digits in the mantissa of a result may differ between variable-precision arithmetic and IEEE predefined types.
There is only one
NaN
representation. No distinction is made between quiet and signalingNaN
.No floating-point number exceptions are available.
Version History
Introduced before R2006a
expand all
R2022b: Evaluate symbolic matrix variables with variable-precision arithmetic
You can evaluate a symbolic matrix variable of type symmatrix
with variable-precision arithmetic. The result is a symbolic expression with variable-precision numbers and scalar variables of type sym
. For an example, see Evaluate Symbolic Matrix Variable with Variable-Precision Arithmetic.
R2018a: Support for character vectors has been removed
Support for character vectors that do not define a number has been removed. Instead, first create symbolic numbers and variables using sym
and syms
, and then use operations on them. For example, use vpa((1 + sqrt(sym(5)))/2)
instead of vpa('(1 + sqrt(5))/2')
.
See Also
digits | double | root | vpaintegral
Topics
- Increase Precision of Numeric Calculations
- Recognize and Avoid Round-Off Errors
- Increase Speed by Reducing Precision
- Choose Numeric or Symbolic Arithmetic
- Change Output Format of Symbolic and Variable-Precision Arithmetic
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- Deutsch
- English
- Français
- United Kingdom (English)
Contact your local office