digits

Измените используемую точность переменной

Описание

пример

digits(d) устанавливает точность, используемую в vpa на d значащие десятичные цифры. Значение по умолчанию является 32 цифрами.

пример

d1 = digits возвращает текущую точность, используемую в vpa.

пример

d1 = digits(d) устанавливает новую точность d и возвращает старую точность в d1.

Примеры

Увеличение точности результатов

По умолчанию 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

Входные параметры

свернуть все

Новая настройка точности, заданная в виде числа или символьного числа. Настройка задает количество значащих десятичных цифр, которые будут использоваться для вычислений переменной точности. Если значение d не является целым числом, digits округляет его до ближайшее целого числа.

Выходные аргументы

свернуть все

Настройка точности тока, возвращенная как число двойной точности. Параметр задает количество значащих десятичных цифр, используемых в настоящее время для вычислений переменной точности.

Представлено до R2006a