В MATLAB переменные ДЕЙСТВИТЕЛЬНО имеют двойную точность по умолчанию?

Этот вопрос возник из-за чего-то странного, что я заметил после дальнейшего исследования этого вопроса ...

Я всегда понимал, что переменные MATLAB равны двойная точность по умолчанию. Итак, если бы я сделал что-то вроде объявления переменной с 20 цифрами после десятичной точки:

>> num = 2.71828182845904553488;
>> class(num)  % Display the variable type
ans =
double

Я бы ожидал, что последние 4 цифры будут проигнорированы, поскольку относительная точность с плавающей запятой находится на порядок 10 -16 :

>> eps(num)
ans =
    4.440892098500626e-016

Если я попытаюсь отобразить число с более чем 16 цифрами после десятичной точки (используя fprintf или sprintf ) , Я получаю то, что ожидаю увидеть:

>> fprintf('%0.20f\n', num)
2.71828182845904550000
>> sprintf('%0.20f', num)
ans =
2.71828182845904550000

Другими словами, все цифры с 17 по 20 равны 0.

Но все становится странно, когда я передаю num в арифметическую функцию переменной точности в Symbolic Toolbox , сообщая ей, что число должно быть представлено 21 цифрой точность:

>> vpa(num, 21)
ans =
2.71828182845904553488

ЧТО?! Эти последние 4 цифры снова появились! Разве они не должны были быть потеряны, когда исходное число, которое я ввел, было сохранено как переменная двойной точности num ? Поскольку num является переменной с двойной точностью, когда она передается в vpa , откуда vpa узнал, что это были?

Мое лучшее предположение относительно того, что происходит то, что MATLAB внутренне представляет num с большей точностью, чем двойная, поскольку я инициализировал его числом с большим количеством цифр после десятичной точки, чем могла бы обработать переменная с двойной точностью. Это действительно то, что происходит, или происходит что-то еще?



БОНУС: А вот еще один источник путаницы, если у вас еще нет мигрени, указанной выше ...

>> num = 2.71828182845904553488;  % Declare with 20 digits past the decimal
>> num = 2.718281828459045531;    % Re-declare with 18 digits past the decimal
>> vpa(num, 21)
ans =
2.71828182845904553488  % It's the original 20-digit number!!!

72
задан gnovice 21 August 2018 в 15:06
поделиться