Измените используемую точность переменной
По умолчанию 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 против этого объекта. Результаты могут зависеть от метода преобразования, который вы использовали для преобразования числа с плавающей запятой в символьный объект. The 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