Это довольно простой вопрос, но я изо всех сил пытаюсь найти элегантное решение для!
Предположим, что вы хотите выполнить итерацию от 0.0
до 1.0
дискретными шагами, вы будете использовать *Цикл 1005 *, использующий int
, поскольку он не рекомендуется использовать float
из-за погрешностей точности.
Самый простой подход заключается в следующем, но он некорректен, так как никогда не выдает 1.0
:
private void sample1(int steps = 100)
{
var floats = new float[steps]; // 100 values
for (var i = 0; i < steps; i++) // goes from 0 to 99
{
var f = 1.0f / steps * i; // will only go from 0.0 to 0.99, never reaches 1.0
floats[i] = f;
}
}
Первая попытка решить проблему, она работает, но мы заканчиваем еще одним значением:
private void sample2(int steps = 100)
{
var n = steps + 1;
var floats = new float[n]; // 101 values now!
for (var i = 0; i < n; i++) // goes from 0 to 100
{
var f = 1.0f / n * i; // goes from 0.0 to 1.0 but now we have an extra value
floats[i] = f;
}
}
Вторая попытка решить проблему, у нас нет дополнительного значения, но последняя никогда не бываетдействительно 1.0
:
private void sample3(int steps = 100)
{
var floats = new float[steps]; // 100 values
for (var i = 0; i < steps; i++) // goes from 0 to 99
{
var f = 1.0f / steps * i * ((steps - 1.0f) / steps); // goes from 0.0 to 0.999...
floats[i] = f;
}
}
Вопрос:
Как правильно выполнить цикл от 0.0
до 1.0
как дискретные шаги в цикле for
который использует int
?
(псевдокод просто отлично)