Этот вопрос возник из чего-то странного, что я заметил после изучения этого вопроса далее...
Я всегда понимал переменные MATLAB как double-precision по умолчанию. Итак, если бы я должен был сделать что-то вроде объявления переменной с 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
ЧТО?! Последние четыре цифры снова появились! Разве они не были потеряны, когда исходный номер, который я ввел, был сохранен как переменная с двойной точностью num
? Поскольку num
является переменной с двойной точностью, когда она передается в vpa
, как vpa
знал, какими они были?
Мое лучшее предположение о том, что происходит, состоит в том, что MATLAB внутренне представляет num
с большей точностью, чем double, поскольку я инициализировал его числом с большим количеством цифр за десятичной точкой, чем может обрабатывать переменная с двойной точностью. Это действительно то, что происходит, или что-то еще происходит?
БОНУС: И вот дополнительный источник путаницы, если у вас еще нет мигрени из вышеперечисленного...
>> 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 the original 20-digit number!!!