2016-09-05 13 views
0

В настоящее время я изучаю C++-мысли C++ Primer. В главе 4.11 «Преобразование типов» я заметил, что в главе редко говорится о неявном преобразовании из интегральных типов с плавающей точкой, но в основном сосредоточено на преобразовании внутри интегральных типов. Таким образом, я не совсем уверен в правилах преобразования из целочисленного типа в тип с плавающей точкой.Почему int рекомендуется удвоить и не плавать для неявного преобразования

Мой вопрос из примера в главе,:

int ival = 3.541 + 3 

Глава отметил, что 3 преобразуется в double типа перед добавлением 3.541.

Вопрос связан с тем фактом, что для большинства интегральных типов в основном они продвигаются до int во время неявного преобразования, если они не могут вписаться в int. Начиная с int и float оба размера 4 байта, и что 3.0 и 3.541 могут идеально вписываться в float, почему более высокий порядок double используется для неявного преобразования в этом случае, а не float? Означает ли это, что для любого интегрального типа для неявного преобразования типа с плавающей точкой интегральный тип будет преобразован в double независимо от точности или размера?

Спасибо!

+0

3.541 не может поместиться в поплавок вообще, это повторяющаяся фракция в двоичном формате. – RemcoGerlich

+1

, если вы используете 'int ival = 3.541f + 3', тогда используется float. –

ответ

5

3.541 является двойной. Вот к чему нужно преобразовать другой аргумент.

Суффиксы используются для обозначения точности литерала, 3.541f (или F) будет поплавком, 3.541L (или l) будет длинным двойным. Значение по умолчанию (без суффикса) двойное. Источник http://en.cppreference.com/w/cpp/language/floating_literal.

3.541 не вписывается ни в одну из этих длин, поскольку это повторяющаяся фракция в двоичном формате. Реальное значение будет значением с плавающей запятой как можно ближе к 3.541 (например, 3.540999999999999925393012745189480483531951904296875 в случае двойного).

1

По умолчанию, если вы пишете что-то вроде:

int ival = 3.541 + 3; 

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

int ival = 3.541f + 3; //See the 'f' there. For floats 

Кроме того, если вам интересно, почему иногда 3.1541 не представляется должным образом, вероятно, потому, что его двоичное представление не является достаточно точным. Read this article for more info