如何在'for'循环中从0.0正确迭代到1.0?

问题描述 投票:1回答:1

这是一个相当简单的问题,但我很难找到一个优雅的解决方案!

假设您想以离散的步骤从0.0迭代到1.0,您将使用for循环使用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作为使用forint循环中的离散步骤?

(伪代码很好)

c# for-loop floating-point iteration normalize
1个回答
3
投票

大声数到10.如果你在计数中包括零,你实际上说出11个数字,而不是10个。因为你想要包括零而没有朝着1.0f的目标取得任何进展,其他steps-1切片的1.0f必须总结到1.0。

或者从另一个角度思考它:

为了得到1,你的分子和分母需要相等。由于你的for循环从0到steps独占或steps-1包含,你的分母必须是steps-1

© www.soinside.com 2019 - 2024. All rights reserved.