Численные расчеты с высокой точностью

Этот пример показывает, как использовать арифметику переменной точности для получения высокоточных расчетов с помощью Symbolic Math Toolbox™.

Поиск формул, которые представляют околоцелые числа. Классический пример следующий: вычислите exp(163π) до 30 цифр. Результатом является целое число, которое отображается с ошибкой округления.

digits(30);
f = exp(sqrt(sym(163))*sym(pi));
vpa(f)
ans = 262537412640768743.999999999999vpa ('262537412640768743.999999999')

Вычислите то же значение до 40 цифр. Оказывается, это не целое число.

digits(40);
vpa(f)
ans = 262537412640768743.9999999999992500725972vpa ('262537412640768743.9999999999992500725972')

Исследуйте это явление дальше. Ниже цифры до exp(1000) происходит, и исследованию нужны некоторые правильные цифры после десятичной точки. Вычислите необходимую рабочую точность:

d = log10(exp(vpa(1000)))
d = 434.2944819032518276511289189166050822944vpa ('434.2944819032518276511289189166050822944')

Установите необходимую точность перед первым вызовом функции, которая от нее зависит. Среди прочих round, vpa, и double являются такими функциями.

digits(ceil(d) + 50);

Ищите похожие примеры формы exp(nπ). Конечно, можно получить больше таких чисел n путем умножения 163 на квадрат. Но кроме этого, гораздо больше чисел этой формы близки к некоторому целому числу. Вы можете увидеть это из гистограммы графика их дробных частей:

A = exp(pi*sqrt(vpa(1:1000)));
B = A-round(A);
histogram(double(B), 50)

Figure contains an axes. The axes contains an object of type histogram.

Вычислите, есть ли околоцелые числа в форме exp(n).

A = exp(vpa(1:1000));
B = A-round(A);
find(abs(B) < 1/1000)
ans =

  1x0 empty double row vector

Оказывается, на этот раз дробные части элементов A довольно равномерно распределены.

histogram(double(B), 50)

Figure contains an axes. The axes contains an object of type histogram.