我正在遍历一个看起来像这样的函数:
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)
这是正确的方法吗?
答案 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();