#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;
исправил бы это.