如何在C#中使用以特定间隔分隔的数字初始化数组

Cic*_*ami 3 c# arrays initialization intervals

我想创建一个包含从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;
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一个函数Enumerable.Range允许指定增量间隔.

Eri*_*ert 17

一个有趣的事实是,到目前为止发布的每个答案都修复了您提议的代码中的错误,但只有一个人已经发现他们已经这样做了.

当处理任何不是精确2的幂的一小部分的数量时,二进制浮点数具有表示错误.("3.0/4.0"是可表示的分数,因为底部是2的幂;"1.0/10.0"不是.)

因此,当你说:

for(i = 0; i < 10; i++) 
{
    myArray[i] = increment;    
    increment += 0.1; 
} 
Run Code Online (Sandbox Code Playgroud)

实际上你并没有将"增量"增加1.0/10.0.您将通过底部具有精确幂2最接近的可表示分数递增它.所以实际上这相当于:

for(i = 0; i < 10; i++) 
{
    myArray[i] = increment;    
    increment += (exactly_one_tenth + small_representation_error);
} 
Run Code Online (Sandbox Code Playgroud)

那么,第十个增量的价值是多少?显然它10 * (exactly_one_tenth + small_representation_error)显然等于exactly_one + 10 * small_representation_error.您将表示错误的大小乘以10.

每次重复将两个浮点数加在一起时,每次后续添加都会略微增加总和的总表示误差,并且实际上会增加一个潜在的大错误.在某些情况下,您要汇总数千或数百万个小数字,误差可能会远远大于实际总数.

更好的解决方案是做其他人所做的事情.每次从整数重新计算分数.这样每个结果都有自己的小表示错误; 它不会累积先前计算结果的表示错误.


Chr*_*ain 8

丑,但......

Enumerable.Range(0,10).Select(i => i/10.0).ToArray();
Run Code Online (Sandbox Code Playgroud)