потому что число находится в диапазоне от 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!!!

Ответы на вопрос(2)

Ваш ответ на вопрос