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

В этом примере показано, как использовать арифметику переменной точности, чтобы получить расчеты высокой точности с помощью Symbolic Math 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π). Конечно, можно получить больше таких чисел 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.