Арифметика переменной точности (арифметика произвольной точности)
Поддержка векторов символов, которые не задают номер, была удалена. Вместо этого сначала создайте символьные числа и переменные с помощью sym
и syms
, и затем используйте операции на них. Например, используйте vpa((1 + sqrt(sym(5)))/2)
вместо vpa('(1 + sqrt(5))/2')
.
vpa(x)
vpa(x,d)
vpa(
арифметика переменной точности использования с плавающей точкой (VPA), чтобы оценить каждый элемент символьного входа x
)x
, по крайней мере, к d
значительные цифры, где d
является значением функции digits
. Значение по умолчанию digits
равняется 32.
Оцените символьные входные параметры с переменной точностью арифметика с плавающей точкой. По умолчанию vpa
вычисляет значения к 32 значительным цифрам.
syms x p = sym(pi); piVpa = vpa(p)
piVpa = 3.1415926535897932384626433832795
a = sym(1/3); f = a*sin(2*p*x); fVpa = vpa(f)
fVpa = 0.33333333333333333333333333333333*sin(6.283185307179586476925286766559*x)
Оцените элементы векторов или матриц с арифметикой переменной точности.
V = [x/p a^3]; M = [sin(p) cos(p/5); exp(p*x) x/log(p)]; vpa(V) vpa(M)
ans = [ 0.31830988618379067153776752674503*x, 0.037037037037037037037037037037037] ans = [ 0, 0.80901699437494742410229341718282] [ exp(3.1415926535897932384626433832795*x), 0.87356852683023186835397746476334*x]
Необходимо перенести все внутренние входные параметры с vpa
, такие как exp(vpa(200))
. В противном случае входные параметры автоматически преобразованы, чтобы удвоиться MATLAB®.
vpa
По умолчанию vpa
оценивает входные параметры к 32 значительным цифрам. Можно изменить количество значительных цифр при помощи функции digits
.
Аппроксимируйте выражение 100001/10001
с семью значительными цифрами с помощью digits
. Сохраните старое значение digits
, возвращенного digits(7)
. Функция vpa
возвращает только пять значительных цифр, которые могут означать, что остающиеся цифры являются нулями.
digitsOld = digits(7); y = sym(100001)/10001; vpa(y)
ans = 9.9991
Проверяйте, являются ли остающиеся цифры нулями при помощи более высокого значения точности 25
. Результат показывает, что остающиеся цифры являются на самом деле периодической десятичной дробью.
digits(25) vpa(y)
ans = 9.999100089991000899910009
Также, чтобы заменить digits
для одного вызова vpa
, измените точность путем определения второго аргумента.
Найдите π к 100 значительным цифрам путем определения второго аргумента.
vpa(pi,100)
ans = 3.141592653589793238462643383279502884197169... 39937510582097494459230781640628620899862803... 4825342117068
Восстановите исходное значение точности в digitsOld
для дальнейших вычислений.
digits(digitsOld)
В то время как символьные результаты точны, они не могут быть в удобной форме. Можно использовать vpa
, чтобы численно аппроксимировать точные символьные результаты.
Решите полином высокой степени для его корней с помощью solve
. Функция solve
не может символически решить полином высокой степени и представляет корни с помощью root
.
syms x y = solve(x^4 - x + 1, x)
y = root(z^4 - z + 1, z, 1) root(z^4 - z + 1, z, 2) root(z^4 - z + 1, z, 3) root(z^4 - z + 1, z, 4)
Используйте vpa
, чтобы численно аппроксимировать корни.
yVpa = vpa(y)
yVpa = 0.72713608449119683997667565867496 - 0.43001428832971577641651985839602i 0.72713608449119683997667565867496 + 0.43001428832971577641651985839602i - 0.72713608449119683997667565867496 - 0.93409928946052943963903028710582i - 0.72713608449119683997667565867496 + 0.93409928946052943963903028710582i
vpa
использует цифры охраны, чтобы поддержать точностьЗначение функции digits
задает минимальное количество значительных используемых цифр. Внутренне, vpa
может использовать больше цифр, чем digits
задает. Эти дополнительные цифры называются защитными цифрами, потому что они принимают меры против ошибок округления в последующих вычислениях.
Численно аппроксимируйте 1/3
с помощью четырех значительных цифр.
a = vpa(1/3, 4)
a = 0.3333
Аппроксимируйте результат a
с помощью 20 цифр. Результат показывает, что тулбокс внутренне использовал больше чем четыре цифры при вычислении a
. Последние цифры в результате являются неправильными из-за ошибки округления.
vpa(a, 20)
ans = 0.33333333333303016843
Скрытые ошибки округления могут вызвать неожиданные результаты.
Оцените 1/10
с 32-разрядной точностью по умолчанию, и затем с этими 10 точностью цифр.
a = vpa(1/10, 32) b = vpa(1/10, 10)
a = 0.1 b = 0.1
Поверхностно, a
и b
выглядят равными. Проверяйте их равенство путем нахождения a - b
.
a - b
ans = 0.000000000000000000086736173798840354720600815844403
Различие не равно нулю, потому что b
был вычислен только с цифрами 10
точности и содержит большую ошибку округления, чем a
. Когда вы находите a - b
, vpa
аппроксимирует b
с 32 цифрами. Продемонстрируйте это поведение.
a - vpa(b, 32)
ans = 0.000000000000000000086736173798840354720600815844403
vpa
восстанавливает точность общих входных параметров с двойной точностьюВ отличие от точных символьных значений, значения с двойной точностью по сути содержат ошибки округления. Когда вы вызываете vpa
на входе с двойной точностью, vpa
не может восстановить потерянную точность, даже при том, что это возвращает больше цифр, чем значение с двойной точностью. Однако vpa
может распознать и восстановить точность выражений формы p/q, p π/q, (p/q) 1/2, 2q, и 10q, где p и q являются целыми числами скромного размера.
Во-первых, продемонстрируйте, что vpa
не может восстановить точность для входа с двойной точностью. Вызовите vpa
на результате с двойной точностью и том же символьном результате.
dp = log(3); s = log(sym(3)); dpVpa = vpa(dp) sVpa = vpa(s) d = sVpa - dpVpa
dpVpa = 1.0986122886681095600636126619065 sVpa = 1.0986122886681096913952452369225 d = 0.00000000000000013133163257501600766255995767652
Как ожидалось результат с двойной точностью отличается от точного результата в 16-м десятичном разряде.
Продемонстрируйте, что vpa
восстанавливает точность для выражений формы p/q, p π/q, (p/q) 1/2, 2q, и 10q, где p и q являются скромными размерными целыми числами путем нахождения, что различие между vpa
обращается к результату с двойной точностью и на точном символьном результате. Различиями является 0.0
, показывающий, что vpa
восстанавливает потерянную точность во входе с двойной точностью.
vpa(1/3) - vpa(1/sym(3)) vpa(pi) - vpa(sym(pi)) vpa(1/sqrt(2)) - vpa(1/sqrt(sym(2))) vpa(2^66) - vpa(2^sym(66)) vpa(10^25) - vpa(10^sym(25))
ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0
vpa
не преобразовывает части в экспоненте к плавающей точке. Например, vpa(a^sym(2/5))
возвращает a^(2/5)
.
vpa
использует больше цифр, чем количество цифр, заданных digits
. Эти дополнительные цифры принимают меры против ошибок округления в последующих вычислениях и называются защитными цифрами.
Когда вы вызываете vpa
на числовом входе, таком как 1/3
, 2^(-5)
или sin(pi/4)
, числовое выражение выполнено к номеру с двойной точностью, который содержит ошибки округления. Затем к vpa
обращаются тот номер с двойной точностью. Для точных результатов преобразуйте числовые выражения в символьные выражения с sym
. Например, чтобы аппроксимировать exp(1)
, используйте vpa(exp(sym(1)))
.
Если второй аргумент d
не является целым числом, vpa
округляет его к самому близкому целому числу с round
.
vpa
восстанавливает точность для числовых входных параметров, которые совпадают с формами p/q, p π/q, (p/q) 1/2, 2q, и 10q, где p и q являются целыми числами скромного размера.
Атомарные операции с помощью арифметики переменной точности вокруг для самого близкого.
Различия между арифметикой переменной точности и IEEE Стандартные 754 С плавающей точкой
В вычислениях деление на нуль выдает ошибку.
Область значений экспоненты больше, чем в любом предопределенном режиме IEEE. vpa
теряет значимость приблизительно ниже 10^(-323228496)
.
Денормализованные числа не реализованы.
Обнуляет не подписываются.
Количество двоичных цифр в мантиссе результата может отличаться между арифметикой переменной точности и предварительно определенными типами IEEE.
Существует только одно представление NaN
. Никакое различие не сделано между тихим и сигнальным NaN
.
Никакие исключения числа с плавающей запятой не доступны.
digits
| double
| root
| vpaintegral