2013-05-31 32 views
6

Так что я знаю, что существует большая разница в точности поплавков и парных. Я понимаю. Promise.В чем разница между LONG float и double в C++?

Но, в C++, при вызове scanf и printf нотация, используемая для указания double, это «% lf», а это означает, что long float, правильно? Таким образом, хотя float менее точен, чем двойной, LONG float (предположительно называемый long float, потому что он может быть «длиннее», имея больше терминов), является такой же точностью и, следовательно, по существу той же самой?

Просто чтобы прояснить, вот что я имею в виду:

double number = 3.14159; 
printf("The number is %lf", number); 

Так корень мой вопрос: Является ли долго плавать другое имя для двойной?

+3

Не существует 'long float', и компилятор должен дать вам сообщение об ошибке. Концептуально, но вы можете назвать это 'long float', и это не будет ошибкой. – milleniumbug

+0

Я не определяю его как длинный поплавок. извините за путаницу. Я сделал редактирование сообщения для уточнения. – Nealon

+1

@milleniumbug, но может быть длинный двойной: http://msdn.microsoft.com/en-us/library/cc953fe1.aspx –

ответ

14

В моем понимании нет такого типа, как long float.

This post дает информацию о том, почему люди используют lf для печати double с printf, если это является причиной вашего замешательства.

По любезно @Jerry Coffin:

"% F" является (или, по крайней мере, "а") правильный формат для двойной. Нет формата для float, потому что , если вы попытаетесь передать float в printf, он будет увеличен до double, прежде чем printf получит его. «% lf» также приемлемо в соответствии с текущим стандартом - l указан как не имеющий эффекта, если следовать спецификатору преобразования f (среди прочих).

Так что причина в том, что, когда люди делают:

printf("The number is %lf", number); 

Это эквивалентно делать: имена

printf("The number is %f", number); //l has no effect when printing double 
+0

Я использую '% lf' при сканировании для двойника, и он работает. И согласно @milleniumbug ниже, '% f' нет. Так что, рассуждая, это не '% lf'« правильный »формат для парных? – Nealon

+1

@Nealon Я думаю, что это сообщение должно очистить ваше замешательство, если оно есть: http://stackoverflow.com/questions/210590/why-does-scanf-need-lf-for-doubles-when-printf-is-okay- с-just-f – taocp

+0

@tacop, который работает, спасибо. – Nealon

4

printf спецификатор не имеют ничего общего с именами типов.

Они просто названы таким образом, чтобы они были короткими и легко запоминающимися.

поплавка -> двойной -> длинный двойной

% е ->% ЛФ ->% Lf

(также, они не могли назвать printf двойной спецификатор как %d потому что имя уже зарезервирован для десятичное представление int (по сравнению с восьмеричной %o))

@ ответ TAOCP объясняет, почему вы можете использовать как %f и %lf с printf, но обратите внимание, вы не можете сделать это с scanf

+0

Это имеет смысл. Но есть ли причина, по которой выбрано '% lf'? Это, очевидно, не случайная пара писем, «так что это означает« Длинный поплавок », верно? Опять же, я знаю, что «Long Float» - это не тип. – Nealon

+1

@Nealon Существует довольно много форматов ввода/отображения, которые должны быть закодированы только с 26 буквами, поэтому '% lf' был выбран для указания чтения' double' в 'scanf()', потому что 'f' уже означало' float' и 'l' уже были необязательным письмом, обозначающим« больше ». Подумайте об этом как о «длинном плавании», если хотите, но не называйте это публично, если вы не хотите, чтобы люди смеялись. –

+0

@PascalCuoq, так что 'l' означает больше? Это действительно все, что мне нужно было знать. Мне просто сказали, изучая C++, что 'l' долго стоял. – Nealon

0

Для scanf вы передаете указатель на место, где будет сохранен результат; вы читаете значение float с %f и двойное значение с %lf; вы должны их отличить, потому что float и double не должны иметь одинаковое представление.Для printf вы передаете значение, которое должно отображаться, и значения float получают повышение до double, потому что они проходят в качестве аргументов в части прототипа ...; то есть для printf нет никакой разницы между float и double, поэтому %f и %lf делают то же самое.

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