Подтвердить что ты не робот

Является ли использование 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++);

Следовательно, выполнение ++ сразу же - не гарантирует, что значение не изменяется.

4b9b3361

Ответ 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. явно.