производительность — всегда ли необходимо использовать литералы с плавающей точкой при выполнении арифметики с плавающими переменными в C ++?

Я вижу много кода на C ++ с такими строками:

float a = 2;
float x = a + 1.0f;
float b = 3.0f * a;
float c = 2.0f * (1.0f - a);

Эти .0f после этих литералов действительно нужно? Потеряли бы вы числовую точность, если бы не указали их?

Я думал, что они вам нужны, только если у вас есть такая строка:

float a = 10;
float x = 1 / a;

где вы должны использовать 1.0f, право?

6

Решение

Вам нужно будет использовать его в следующем случае:

float x = 1/3;

1 или 3 должен иметь .0 иначе х всегда будет 0.

6

Другие решения

Если a является intэти две строки определенно не эквивалентны:

поплавок b = 3,0f * a;
float b = 3 * a;

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

Но если a это float, как в ваших примерах, тогда оба выражения эквивалентны. Какой из них вы используете, это вопрос личных предпочтений; первое, вероятно, более гигиенично.

1

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

Пока подвыражение включает хотя бы один объект типа с плавающей точкой, это, вероятно, не имеет большого значения. Более важно использовать суффиксы с целыми числами, которые будут интерпретироваться как числа с плавающей запятой: если в подвыражении не используется целочисленная арифметика, не используется значение с плавающей запятой. Это может иметь серьезные последствия, потому что результатом будет целое число.

0

float b = 3.0f * a;

Иногда это делается потому, что вы хотите убедиться, что 3.0 создан как float, а не как double.

0
По вопросам рекламы [email protected]