потому что число находится в диапазоне от 2 ^ 6 до 2 ^ 7, поэтому интервал составляет 2 ^ -46 (= 1,42 e-14), поэтому число действует до 14-го знака после запятой
вопрос возник из чего-то странного, что я заметил после расследованияэтот вопрос в дальнейшем...
Я всегда понимал переменные 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
карифметическая функция переменной точности вСимволическая панель инструментов, говоря, чтобы оно представляло число, используя 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!!!