2010-11-19 2 views
6

Я не понимаю следующее, что происходит с помощью команды sprintf.Отображение десятичных знаков переменной с помощью sprintf в MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

Почему sprintf показать мне номер e округляется вместо числа, и я держал на первом месте?

+0

Это может не иметь никакого отношения к вашему вопросу, но если вы хотите ввести истинные цифры 'e', вы должны ввести вместо этого' vpa ('exp (1)', 53) ' – MarkV

+0

@MarkV: Да, но мне нравится Это. Спасибо! – Peterstone

ответ

5

Переменные double precisionпо умолчанию в MATLAB, так что переменная e, что вы создаете ограничивается точностью двойной, которая составляет около 16 цифр. Даже если вы ввели больше цифр, двойник не имеет точности, чтобы точно представлять все эти дополнительные цифры и округлять до ближайшего числа, которое он может представлять.

EDIT: Как объяснено более подробно Andrew Janke в своем ответе на this follow-up question я отправил, номер, который вы выбрали для e просто бывает точным расширение десятичной бинарного значения. Другими словами, это точно представляемое значение, к которому будет округлено близкое число с плавающей запятой. Однако в этом случае ничего более, чем приблизительно 16 цифр после десятичной точки, не считается значимым, поскольку его невозможно точно представить с помощью типа двойной точности. Поэтому функции, такие как SPRINTF, автоматически игнорируют эти небольшие значения, вместо этого печатают нули.

+1

вы пропустили шаг: при использовании sprintf e неявно преобразуется в double. Переменные ... – Marc

+1

@Marc: Hm? Здесь e уже является двойным, потому что он инициализируется из литерала из-за копирования и вставки. В Matlab все числовые литералы производят двойные значения. Вы можете подтвердить это с помощью «class (2.7182818284590455348848081484902650117874145507812500)», который возвращает «double». class (exp (1)) тоже double. Большинство отображаемых цифр являются фиктивными, потому что они превышают предел точности двойника; vpa() просто не обнуляет их, как printf(). –

+0

Вы правы. Я пропустил это в коде. – Marc

Смежные вопросы