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

标签 c# for-loop floating-point iteration normalize

这是一个相当简单的问题,但我正在努力寻找一个优雅的解决方案!

假设您想要以离散的步骤从 0.0 迭代到 1.0,您将使用一个使用 int 的 for 循环 由于精度错误,不鼓励使用 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;
    }
}

第一次尝试解决这个问题,它有效,但我们以另一个值(value)结束:

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;
    }
}

第二次尝试解决这个问题,我们没有额外的值,但 last 永远不是真正的 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;
    }
}

问题:

如何在使用 intfor 循环中作为离散步骤正确地从 0.0 循环到 1.0

(伪代码就好)

最佳答案

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

或者换个角度想:

要得到 1,您的分子和分母必须相等。由于您的 for 循环从 0 运行到 steps exclusive,steps-1 inclusive,您的分母 必须是 steps -1

关于c# - 如何在 'for' 循环中从 0.0 正确迭代到 1.0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54974134/

相关文章:

java - Java 中的高效 strtod?

c# - 性能差异...如此显着?

c# - 如何从另一个 DLL 中的对象获取类型?

c# - 在部分类中实现接口(interface)

C++11 for 循环语法不能正常工作

javascript - 从列和行返回父级及其子级

linux - 为什么 for 循环中的 file 命令表现得如此荒谬

java - 格式化字符串以删除科学记数法 - Java

c++ - 将浮点文字映射到其二进制表示的过程

c# - WebAPI 2 自定义路由