Измените переменную используемую точность
digits(d)
d1 = digits
d1 = digits(d)
По умолчанию MATLAB® использует 16 цифр точности. Для более высокой точности используйте vpa
. Точность по умолчанию для vpa
является 32 цифрами. Увеличьте точность вне 32 цифр при помощи digits
.
Найдите pi
с помощью vpa
, который использует значение по умолчанию 32 цифры точности. Подтвердите, что текущая точность 32 при помощи digits
.
pi32 = vpa(pi)
pi32 = 3.1415926535897932384626433832795
currentPrecision = digits
currentPrecision = 32
Сохраните текущее значение digits
в digitsOld
и установите новую точность на цифры 100
. Найдите pi
с помощью vpa
. Результат имеет 100 цифр.
digitsOld = digits(100); pi100 = vpa(pi)
pi100 = 3.1415926535897932384626433832795028841971693993751058209... 74944592307816406286208998628034825342117068
vpa
вывод является символьным. Чтобы использовать символьный вывод с функцией MATLAB, которая не принимает символьные значения, преобразуйте символьные значения в двойную точность при помощи double
.
Наконец, восстановите старое значение digits
для дальнейших вычислений.
digits(digitsOld)
Для получения дополнительной информации смотрите Точность Увеличения Числовых Вычислений.
Увеличьте скорость вычислений MATLAB при помощи vpa
с более низкой точностью. Установите более низкую точность при помощи digits
.
Во-первых, найдите время потраченным, чтобы выполнить операцию на большом входе.
input = 1:0.01:500; tic zeta(input); toc
Elapsed time is 48.968983 seconds.
Теперь, повторите операцию с более низкой точностью при помощи vpa
. Понизьте точность к цифрам 10
при помощи digits
. Затем используйте vpa
, чтобы уменьшать точность input
и выполнить ту же операцию. Время взятые уменьшения значительно.
digitsOld = digits(10); vpaInput = vpa(input); tic zeta(vpaInput); toc
Elapsed time is 31.450342 seconds.
vpa
вывод является символьным. Чтобы использовать символьный вывод с функцией MATLAB, которая не принимает символьные значения, преобразуйте символьные значения в двойную точность при помощи double
.
Наконец, восстановите старое значение digits
для дальнейших вычислений.
digits(digitsOld)
Для получения дополнительной информации смотрите Скорость Увеличения путем Сокращения Точности.
Количество цифр, что вы задаете использование функции vpa
или функции digits
, является гарантируемым количеством цифр. Внутренне, тулбокс может использовать еще несколько цифр, чем вы задаете. Эти дополнительные цифры называются guard digits. Например, определите номер цифр к 4, и затем отобразите приближение с плавающей точкой 1/3 с помощью четырех цифр:
old = digits(4); a = vpa(1/3)
a = 0.3333
Теперь, отобразите a
с помощью 20 цифр. Результат показывает, что тулбокс внутренне использовал больше чем четыре цифры при вычислении a
. Последние цифры в следующем результате являются неправильными из-за ошибки округления:
digits(20) vpa(a) digits(old)
ans = 0.33333333333303016843
Скрытые ошибки округления могут вызвать неожиданные результаты. Например, вычислите номер 1/10 с 32-разрядной точностью по умолчанию и с 10-разрядной точностью:
a = vpa(1/10) old = digits(10); b = vpa(1/10) digits(old)
a = 0.1 b = 0.1
Теперь, вычислите различие a - b
. Результат не 0:
a - b
ans = 0.000000000000000000086736173798840354720600815844403
a - b
различия не равен нулю, потому что тулбокс внутренне повышает 10-разрядный номер b = 0.1
к 32-разрядной точности. Этот процесс подразумевает ошибки округления. Тулбокс на самом деле вычисляет различие a - b
можно следующим образом:
b = vpa(b) a - b
b = 0.09999999999999999991326382620116 ans = 0.000000000000000000086736173798840354720600815844403
Предположим, что вы преобразовываете двойной номер в символьный объект, и затем выполняете операции VPA на том объекте. Результаты могут зависеть от метода преобразования, что вы раньше преобразовывали число с плавающей запятой в символьный объект. Функция sym
позволяет вам выбрать метод преобразования путем определения дополнительного второго аргумента, который может быть 'r'
, 'f'
, 'd'
или 'e'
. Значением по умолчанию является 'r'
. Например, преобразуйте постоянный π = 3.141592653589793... к символьному объекту:
r = sym(pi) f = sym(pi,'f') d = sym(pi,'d') e = sym(pi,'e')
r = pi f = 884279719003555/281474976710656 d = 3.1415926535897931159979634685442 e = pi - (198*eps)/359
Несмотря на то, что тулбокс отображает эти числа по-другому на экране, они - рациональные приближения pi
. Используйте vpa
, чтобы преобразовать эти рациональные приближения pi
назад к значениям с плавающей точкой.
Определите номер цифр к 4. Три из этих четырех приближений дают тот же результат.
digits(4) vpa(r) vpa(f) vpa(d) vpa(e)
ans = 3.142 ans = 3.142 ans = 3.142 ans = 3.142 - 0.5515*eps
Теперь, определите номер цифр к 40. Различия между символьными приближениями pi
становятся более видимыми.
digits(40) vpa(r) vpa(f) vpa(d) vpa(e)
ans = 3.141592653589793238462643383279502884197 ans = 3.141592653589793115997963468544185161591 ans = 3.1415926535897931159979634685442 ans = 3.141592653589793238462643383279502884197 -... 0.5515320334261838440111420612813370473538*eps