Арифметика переменной точности (арифметика произвольной точности)
Поддержка векторов символов, которые не определяют число, была удалена. Вместо этого сначала создайте символьные числа и переменные, используя 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 автоматически преобразует входы в double®.
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
может признать и восстановить точность выражений формы <reservedrangesplaceholder5> / <reservedrangesplaceholder4>, <reservedrangesplaceholder3> π / 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
восстанавливает точность для числовых входов, которые соответствуют формам <reservedrangesplaceholder5> / <reservedrangesplaceholder4>, <reservedrangesplaceholder3> π / q, (p / q)1/2, 2q, и 10q, где p и q являются скромными целыми числами.
Атомарные операции с использованием арифметики переменной точности, округленной до ближайшей.
Различия между арифметикой переменной точности и стандартом 754 IEEE с плавающей точкой:
Внутри расчетов деление на нуль выдает ошибку.
Экспонентная область значений больше, чем в любом предопределенном режиме IEEE. vpa
ниже примерно 10^(-323228496)
.
Денормализованные числа не реализованы.
Нули не подписаны.
Количество двоичных цифр в мантиссе результата может различаться между арифметическими и предопределенными типами IEEE с переменной точностью.
Есть только один NaN
представление. Не проводится различие между тихим и сигнальным NaN
.
Исключения из числа с плавающей запятой отсутствуют.
digits
| double
| root
| vpaintegral