Использование приращения (оператор ++) для поплавков - плохой стиль? - PullRequest
21 голосов
/ 19 декабря 2011

Считается ли "плохим стилем" использовать оператор приращения (++) для чисел с плавающей точкой?Он прекрасно компилируется, но я нахожу его вонючим и нелогичным.

Вопрос: в каких случаях использование ++ для переменной с плавающей точкой оправдано и лучше, чем += 1.0f?Если вариантов использования нет, есть ли респектабельное руководство по стилю C ++, в котором явно сказано, что ++ на float - это зло?

Для float ++ значение увеличивается не на наименьшее возможное значение, а на 1.0.1.0f не имеет особого значения (в отличие от целого числа 1).Это может смутить читателя, заставив его подумать, что переменная имеет тип int.

. Для float не гарантируется, что operator ++ изменяет аргумент.Например, следующий цикл не является бесконечным:

float i, j;
for (i=0.0, j=1.0; i!=j;i=j++);

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

Ответы [ 4 ]

15 голосов
/ 19 декабря 2011

Когда вы добавляете много 1.0 в число с плавающей точкой, из-за арифметики с плавающей запятой вы можете быть немного не в конце

Лучший способ - сделать

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 )

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

14 голосов
/ 19 декабря 2011

В общем случае ++/-- не определено для чисел с плавающей запятой, поскольку неясно, с каким значением следует увеличивать число с плавающей запятой.Таким образом, вам может повезти в одной системе, где ++ приводит к f += 1.0f, но могут быть ситуации, когда это недопустимо.Следовательно, для чисел с плавающей запятой необходимо указать конкретное значение.

++/-- определяется как «увеличение / уменьшение на 1».Поэтому это применимо к значениям с плавающей запятой.Однако лично я думаю, что это может сбить с толку тех, кто не знает об этом определении (или применяет его только к целым числам), поэтому я бы рекомендовал использовать f += 1.0f.

9 голосов
/ 19 декабря 2011

Нет ничего плохого в использовании ++ и -- для чисел с плавающей точкой или двойных операндов. Он просто добавляет или вычитает 1. Это то, что он для!

4 голосов
/ 19 декабря 2011

Это плохой стиль.++ и -- предназначены для установки lvalue в его следующее или предыдущее значение, такое как следующее или предыдущее целое число, следующий или предыдущий элемент в массиве (для указателей), следующий или предыдущий элемент в контейнере (итераторы) и т. д.

Следующие и предыдущие значения не определены для чисел с плавающей точкой.Делайте f += 1. явно.

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