C#循环浮点数的正确方法

时间:2011-05-20 16:28:55

标签: c#

我正在遍历一个看起来像这样的函数:

Y=exp(-0.04*(x-13.25)^(2))*300

假设每Y

,我希望x的每个0.1 interval值在3.3454到20.3458之间

我会这样做:

for (float i=3.3454;i<20.3458;i=+.1)

这是正确的方法吗?

5 个答案:

答案 0 :(得分:8)

如果每个循环添加0.1,那么最终会出现累积错误。无法精确存储0.1作为浮点数,当您重复添加0.1F / D时,您将开始注意漂移。如果你真的想尽可能接近,那么在循环中使用整数然后除以整数值来计算浮点数。

答案 1 :(得分:5)

您的语法略有偏差,您想要使用的某些数学函数仅适用于双打。

double y;
for(double x=3.3454; x<20.3458; x += .1) {
    y = Math.Exp(-0.04D * Math.Pow((x- 13.25D), 2D)) * 300;
    // do something with y
}

答案 2 :(得分:2)

你错过了“F”。没有它你将得到编译错误

  

double类型的文字不能隐式转换为'float'类型;   使用'F'后缀来创建文字   这种类型

for (float i = 3.3454F; i < 20.3458; i += .1F)

这也有点危险,因为增量可能不会导致变化 例如

        float f;
        f = float.MinValue;
        f += .1F;

        Console.WriteLine(f == float.MinValue);

输出为真。

这是因为浮点数是近似值。

答案 3 :(得分:1)

您可能想将其更改为此

for (float i=3.3454;i<=20.3458;i+=0.1)

括号需要在for关键字之后;) 你也有i=+.1,这不是你如何增加一个变量而是会产生语法错误

答案 4 :(得分:1)

我使用了堆栈,但您可以使用任何东西来存储值:

        Stack YStack = new Stack();
        for(float x = 3.3454F; x < 20.3458F; x += .1F)
        {
            YStack.Push(Math.Exp(-0.04*Math.Pow(x-13.25,(2)))*300)
        }
        return YStack.ToArray();