Невозможно выйти из бесконечного цикла в c

#c

#c

Вопрос:

Поэтому я сначала написал скрипт на python, чтобы проверить, работает ли то, что я пытаюсь сделать, потому что я знаком с ним (и он работает). Он печатает от 1 до 10 в каждом цикле и продолжает это делать.

 fullCircle = 2*3.14159
numberOfPoints = 10

def gen():
    angle = 0
    points  = []
    while angle < fullCircle:
        angle  = (1 / numberOfPoints) * fullCircle
        points.append(angle)
        print(len(points))


while True:
    gen()
  

Затем я попытался написать точно такой же код на c , но по какой-то причине цикл не прерывается, и угол продолжает увеличиваться даже после angle < fullCircle , и я не могу понять, почему.

 #include <iostream>
#include <vector>

float fullCircle =  2 * 3.14159f;
int numberOfPoints = 10;
std::vector<float> points;

void gen()
{
    float angle = 0;
    points.clear();

    while (angle < fullCircle)
    {
        angle  = (1 / numberOfPoints) * fullCircle;
        points.push_back(angle);
        std::cout << points.size() << std::endl;
    }
}

int main()
{
    while (true)
        gen();
}
  

Ответ №1:

В этом утверждении:

angle = (1 / numberOfPoints) * fullCircle;

numberOfPoints значение int равно 10 , как (1 / numberOfPoints) и целочисленное деление. В обычной арифметике (1 / 10) есть 0.1 , но целое число не может иметь десятичной дроби, поэтому результатом (1 / 10) в этом случае является целочисленное значение 0 , что 0 * fullCircle приводит к 0 , и поэтому angle не изменяет значение.

Если один из операндов / оператора обновляется до float или double , то вместо этого будет использоваться деление с плавающей запятой, в результате чего значение с плавающей запятой 0.1 , таким образом 0.1 * fullCircle , не приведет к 0 , и поэтому angle изменится значение.

Самое простое изменение заключается в следующем:

 float numberOfPoints = 10; // or double
  

Но один из них тоже будет работать:

 int numberOfPoints = 10;
...
angle  = (1 / float(numberOfPoints)) * fullCircle;
  
 int numberOfPoints = 10;
...
angle  = (1.0f / numberOfPoints) * fullCircle;
  

Комментарии:

1. Но angle меняет значение. Он увеличивается, но не плавает, и в этом проблема, я думаю. Но да, ваше решение работает. Спасибо

2. @Cool_Cornflakes » Но угол изменяет значение » — не в показанном исходном коде, поскольку оператор вычисляется настолько эффективно angle = 0; , что вы можете доказать это, распечатав новое значение angle на каждой итерации цикла.

3. @Ahh, я только что понял, что ты имеешь в виду. Теперь я это понимаю

Ответ №2:

Строка

 angle  = (1 / numberOfPoints) * fullCircle;
  

никогда не изменяет значение angle . (1 / numberOfPoints) всегда равно нулю, поскольку numberOfPoints имеет тип int .

Изменение строки на

 angle  = (1.0f / numberOfPoints) * fullCircle;
  

исправил бы это.