Как правильно выполнить итерацию от 0.0 до 1.0 в цикле for? - PullRequest
0 голосов
/ 04 марта 2019

Это довольно простой вопрос, но я изо всех сил пытаюсь найти элегантное решение для!

Предположим, что вы хотите выполнить итерацию от 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?

(псевдокод просто отлично)

1 Ответ

0 голосов
/ 04 марта 2019

Считайте вслух до 10. Если вы включили ноль в свой счет, вы фактически высказали одиннадцать чисел, а не 10. Поскольку вы хотите включить ноль без какого-либо прогресса в достижении вашей цели 1.0f, остальные steps-1 срезов 1,0f должны в сумме до 1,0.

Или думать об этом под другим углом:

Чтобы получить 1, ваш числитель и знаменатель должны быть равны.Поскольку ваш цикл for работает от 0 до steps эксклюзивно, или steps-1 включительно , ваш знаменатель должен быть steps-1.

...