Является ли использование increment (operator ++) в поплавках плохим стилем?
Считается ли "плохой стиль" использовать оператор инкремента (++) для поплавков? Он компилируется просто отлично, но я нахожу его вонючим и контр-интуитивным.
Вопрос: В каких случаях использование ++
по переменной float оправдано и лучше, чем += 1.0f
? Если нет вариантов использования, существует ли респектабельное руководство по стилю С++, в котором явно говорится, что ++ на float является злым?
Для float ++ не увеличивается на наименьшее значение capble, а на 1.0. 1.0f не имеет особого значения (в отличие от целого числа 1). Это может смутить читателя, заставив его думать, что переменная является int.
Для float не гарантируется, что оператор ++ изменяет аргумент. Например, следующий цикл не бесконечен:
float i, j;
for (i=0.0, j=1.0; i!=j;i=j++);
Следовательно, выполнение ++ сразу же - не гарантирует, что значение не изменяется.
Ответы
Ответ 1
В общем случае ++/--
не определен для float, так как он не понимает, с каким значением следует увеличивать float. Таким образом, вам может повезти в одной системе, где ++
приводит к f += 1.0f
, но могут быть ситуации, когда это недопустимо. Поэтому для поплавков вам нужно указать определенное значение.
++/--
определяется как "приращение/уменьшение на 1". Поэтому это применимо к значениям с плавающей запятой. Однако лично я думаю, что это может смутить кого-то, кто не знает об этом определении (или применяет его только к целым числам), поэтому я бы рекомендовал использовать f += 1.0f
.
Ответ 2
Когда вы добавляете много 1.0
в float, из-за арифметики с плавающей запятой вы можете быть немного в конце
Лучший способ - сделать
for ( int i = 0; i < 100; i++ )
{
float f = 2.433f + i * 1.0f;
вместо
for ( float f = 2.433f; f < 102.433f; f += 1.0f )
Во втором случае арифметическая ошибка с плавающей запятой складывается, и в первом случае это не так. Как отмечают некоторые пользователи в комментариях ниже, добавление интегралов поплавков может не накапливать ошибки, но в целом рекомендуется избегать этого.
Ответ 3
Нет ничего плохого в использовании ++
и --
для float или double операндов. Он просто добавляет или вычитает 1. Что за это!
Ответ 4
Это плохой стиль. ++
и --
предназначены для установки значения lvalue для следующего или предыдущего значения, например следующего или предыдущего целого числа, следующего или предыдущего элемента в массиве (для указателей), следующего или предыдущего элемента в контейнере (итераторы ) и т.д.
Следующие и предыдущие значения не определены для поплавков. Сделайте f += 1.
явно.