Тип буквенных операндов - PullRequest
1 голос
/ 10 апреля 2011

Я не думаю, что большинству компиляторов все равно, если, например, вы не добавляете f к переменной типа float.Но только потому, что я хочу быть как можно более точным и точным, я хочу выразить правильный тип.

Каков тип результата двух литеральных операндов разных типов или зависит отобстоятельства?Например:

int i=1.0f/1;
float f=1.0f/1;

Компилятор не будет жаловаться в обоих случаях, это из-за его толерантного представления литеральных типов или потому, что тип результата операции всегда преобразуется в соответствии с контекстом?

Ответы [ 3 ]

5 голосов
/ 10 апреля 2011

Во-первых, компиляторы заботятся о суффиксе f.1.0 является двойным.1.0f это поплавок.Например:

printf("%.15f %.15f\n", 0.1f, 0.1);

производит 0.100000001490116 0.100000000000000 (обратите внимание, что второе число не является действительным 0,1 больше, чем первое, оно просто ближе к нему).

Это не имеет значениятолько для определения того, какие числа могут и не могут быть представлены, а также для определения типа операций, в которых участвует эта константа. Например:

printf("%.15f %.15f\n", 1.0f/10.0f, 1.0/10.0);

производит тот же вывод, что и раньше.Здесь важно отметить, что 1 и 10 представимы в точности как float, так же как и double.Мы видим не округление на буквальном уровне, а тип операции, определяемый типом операндов.

Компиляторы не снисходительны к вашим примерам.Они строго применяют правила, которые вы можете найти в соответствующем стандарте , особенно в разделах 6.3.1.4 и 6.3.1.5.

1 голос
/ 10 апреля 2011

Первый делит число с плавающей точкой на int, что всегда приводит к плавающей точке (как и деление int на число с плавающей точкой).Этот результат с плавающей запятой затем преобразуется в int для хранения в i.

. Второй получает плавающее число, полученное в результате операции, и присваивает его переменной с плавающей запятой, сохраняя floatness.

Здесь есть две отдельные проблемы: как литералы с суффиксами или без них интерпретируются компилятором и результат операций, выполняемых над смешанными числовыми типами.

0 голосов
/ 10 апреля 2011

Тип литералов важен в других контекстах, например (при условии, что f является float):

f = f + 1.0;     // Cast `f` to double, do a double-precision add, and case the result back.

f = f + 1.0f;    // Single-precision addition.

Обратите внимание, что некоторые компиляторы предоставляют расслабленный режим, при котором оба они генерируют один и тот же код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...