Этот вопрос возник из-за чего-то странного, что я заметил после дальнейшего исследования этого вопроса ...
Я всегда понимал, что переменные 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!!!