如何在 'for' 循环中从 0.0 正确迭代到 1.0?
How to iterate properly from 0.0 to 1.0 in a 'for' loop?
这是一个相当简单的问题,但我正在努力寻找一个优雅的解决方案!
假设您想要在离散步骤中从 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;
}
}
第一次尝试解决这个问题,它有效,但我们以另一个价值结束:
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;
}
}
问题:
如何在使用 int
的 for
循环中作为离散步骤正确地从 0.0
循环到 1.0
?
(伪代码就好)
大声数到 10。如果您在数数时包括 零,您实际上说的是 11 个数字,而不是 10。因为你想 include 零而不朝着 1.0f
的目标取得任何进展,其他 steps-1
1.0f 的切片总和必须为 1.0.
或者换个角度想:
要得到 1,您的分子和分母必须相等。由于您的 for 循环从 0 运行到 steps
独占, 或 steps-1
包含 ,您的分母 必须是 steps-1
.
这是一个相当简单的问题,但我正在努力寻找一个优雅的解决方案!
假设您想要在离散步骤中从 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;
}
}
第一次尝试解决这个问题,它有效,但我们以另一个价值结束:
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;
}
}
问题:
如何在使用 int
的 for
循环中作为离散步骤正确地从 0.0
循环到 1.0
?
(伪代码就好)
大声数到 10。如果您在数数时包括 零,您实际上说的是 11 个数字,而不是 10。因为你想 include 零而不朝着 1.0f
的目标取得任何进展,其他 steps-1
1.0f 的切片总和必须为 1.0.
或者换个角度想:
要得到 1,您的分子和分母必须相等。由于您的 for 循环从 0 运行到 steps
独占, 或 steps-1
包含 ,您的分母 必须是 steps-1
.