Арифметика переменной точности (арифметика произвольной точности)
Поддержка векторов символов, которые не задают номер, была удалена. Вместо этого сначала создайте использование символьных чисел и переменных sym
и syms
, и затем используйте операции на них. Например, используйте vpa((1 + sqrt(sym(5)))/2)
вместо vpa('(1 + sqrt(5))/2')
.
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
Как ожидалось результат с двойной точностью отличается от точного результата в 16th десятичный разряд.
Продемонстрируйте это 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