Почему значения с плавающей запятой, такие как 3.14, считаются двойными по умолчанию в MSVC? - PullRequest
8 голосов
/ 04 декабря 2010

Почему я должен поставить 3.14f вместо 3.14, чтобы отключить все эти предупреждения? Есть ли для этого внятная причина?

Ответы [ 5 ]

18 голосов
/ 04 декабря 2010

Это то, что решил стандарт C ++ (и C).Литералы с плавающей точкой имеют тип double, и если вам нужно, чтобы они были плавающими, вы добавляете суффикс f.По-видимому, не существует какой-либо конкретной причины того, почему, но я бы предположил, что это а) Для совместимости с С и б) Компромисс между точностью и хранением.1005 * 2.13.3 Плавающие литералы Тип плавающего литерала является двойным, если явно не указано суффиксом.Суффиксы f и F задают float, суффиксы l и L указывают long double.Если масштабированное значение не находится в диапазоне представимых значений для его типа, программа некорректна.

5 голосов
/ 04 декабря 2010

C и C ++ предпочитают double, чтобы плавать двумя способами. Как вы заметили, дробные литералы являются двойными, если они явно не являются плавающими. Кроме того, числа с плавающей точкой не могут быть переданы в varargs, они всегда переводятся в удвоение (точно так же, как char и short повышаются до int в varargs).

Вероятно, лучше думать о float как о контракте double, а не о double как расширенном float. То есть double является предпочтительным типом с плавающей запятой, и float используется всякий раз, когда для некоторого конкретного случая требуется меньшая версия double. Это ближе всего к понятной причине, и тогда это правило имеет смысл, даже если вы оказались в том случае, когда вам нужна уменьшенная версия.

1 голос
/ 04 декабря 2010

Это не свойственно MSVC, это требуется стандартом языка.

Я бы предположил, что имеет смысл , а не , чтобы снизить точность, если явно не запрошено, поэтому по умолчанию используется значение double,

6 значащих цифр точности, которые обеспечивает поплавок одинарной точности, редко бывают достаточными для общего использования и, безусловно, на современном настольном процессоре будут использоваться в качестве оптимизации с ручным кодированием, когда автор определит, что этого достаточно инеобходимо;поэтому имеет смысл, что для указания литерала одинарной точности требуется явный видимый маркер.

0 голосов
/ 04 декабря 2010

Потому что double может приблизиться к 3,14 намного лучше, чем float, может быть? Вот точные значения:

3,140000000000000124344978758017532527446746826171875 (double)

3,1400001049041748046875 (float)

0 голосов
/ 04 декабря 2010

Это, вероятно, стандарт в мире Си.Двойной является предпочтительным, так как он более точный, и вы, вероятно, не увидите никаких различий в производительности.Прочитайте этот пост .

...