我想创建一个包含从 0 到 1 且间隔为 0.1 的值的数组。我可以用:
float[] myArray = new float[10];
float increment = 0.1;
for(i = 0; i < 10; i++)
{
myArray[i] = increment;
increment += 0.1;
}
我想知道是否有像
Enumerable.Range
这样的函数也允许指定增量间隔。 最佳答案
一个有趣的事实是,到目前为止发布的每个答案都修复了您提议的代码中的错误,但只有一个人指出他们已经这样做了。
二进制浮点数在处理任何不是 2 的精确幂的分数的数量时会出现表示错误。 (“3.0/4.0”是可表示的分数,因为底部是 2 的幂;“1.0/10.0”不是。)
因此,当您说:
for(i = 0; i < 10; i++)
{
myArray[i] = increment;
increment += 0.1;
}
您实际上并未将“增量”增加 1.0/10.0。您正在通过最接近的可表示分数递增它,该分数在底部具有精确的 2 次幂。所以实际上这相当于:
for(i = 0; i < 10; i++)
{
myArray[i] = increment;
increment += (exactly_one_tenth + small_representation_error);
}
那么,第十个增量的值是多少?很明显,
10 * (exactly_one_tenth + small_representation_error)
显然等于 exactly_one + 10 * small_representation_error
。 您已将表示错误的大小乘以 10。 每当您重复将两个浮点数相加时, 每次后续相加都会略微增加总和的表示误差 并且从字面上看,这会增加一个潜在的大误差。在某些情况下,您对数千或数百万个小数字求和时,误差可能会远大于实际总数。
更好的解决方案是做其他人都做过的事情。 每次 从整数重新计算分数。这样每个结果都有自己的小表示错误;它不会累积先前计算结果的表示错误。
关于c# - 如何用C#中以特定间隔分隔的数字初始化数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9398851/