Есть ли функциональная разница между «2,00» и «2,00f»? - PullRequest
3 голосов
/ 08 октября 2011

Я спрашиваю, потому что я использую библиотеку Box2D, которая вызывает в основном аргументы с плавающей точкой.Хотя я вижу много примеров кода, который использует формат 0.00f , я не совсем уверен, есть ли фактическая разница между этим и простым старым 0.00 .Буду ли я причинять себе боль позже, не добавляя дополнительные f ?Это скорость?Есть ли какая-то коннотация, которая потребует добавления f , а другие нет?

tl; dr?Почему я должен использовать 0,00f вместо 0,00?

Ответы [ 5 ]

7 голосов
/ 08 октября 2011

Суффикс f делает его литералом одинарной точности (float) вместо литерала двойной точности.Обычно это означает 32-битный код вместо 64-битного числа с плавающей запятой.

Константы с плавающей запятой по умолчанию имеют тип double.Используя суффиксы f или l (или F или L - суффикс не чувствителен к регистру), константа может быть указана как float или long double соответственно.

http://msdn.microsoft.com/en-us/library/tfh6f0w2(v=VS.100).aspx

5 голосов
/ 08 октября 2011

Есть разница. 2.00 имеет тип double, а 2.00f имеет тип float. Точная точность и форматные последствия этого зависят от вашей платформы. Имеет ли практическое значение использование одного над другим в вашем коде, зависит от контекста, в котором он используется.

В качестве инициализатора для переменной с типом explicity (основного числового типа) не будет никакой разницы, но при использовании в вызове функции он может потенциально повлиять на то, какая перегрузка или специализация шаблона используются.

Очевидно, что при использовании в качестве инициализатора в объявлении с использованием auto спецификатора типа или в качестве выражения в спецификаторе decltype, тип объявленного объекта будет затронут.

decltype(2.00) x = 2.00f; // confusing
decltype(2.00f) y = 2.00; // also confusing

auto d = 2.00;
auto f = 2.00f;
4 голосов
/ 08 октября 2011

Пока вы присваиваете их float, разницы нет абсолютно, поскольку значение представляется точно и правильно во всех числовых типах.

Важным отличием является тип литерала, который double для 2.0, float для 2.0f и int для 2.Так что это имеет значение при выводе типа аргумента:

void foo(int) { cure_cancer(); };
void foo(float) { wipe_hard_disk(); }
void foo(double) { exit(0); }

foo(2);
foo(2.0f);
foo(2.0);
2 голосов
/ 08 октября 2011

Предположение по умолчанию double.указание суффикса f гарантирует, что он будет интерпретирован как float

2 голосов
/ 08 октября 2011

Тип 2.00 равен double, а тип 2.00f равен float.

Суффикс f превращает литерал 2.00 в тип с плавающей точкой, снижая его точность. В противном случае литерал имеет тип double.

...