exponenta event banner

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

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

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

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

Вычислите одно и то же значение до 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 умножением 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.