[英]Weird floating point error?
我一直在尝试使用for循环生成圆形图案。 但是,当它运行时,除了第9圈之外,其他一切看起来都不错。 看完那个圆圈的数字打印件后,一切看起来都很好,所以我无法弄清楚出了什么问题。 但是,当我向该环的角度值加上一个时。 即j(已注释掉的代码)几乎可以纠正。
知道为什么会发生这种情况。 查看所有数字后,我只能认为这是我没有考虑到的数学错误,或者我错过了明显的错误。
谢谢!
ellipse(325,325,15,15);
float div = 1;
for (int i = i; i < 25; i++)
{
div = i*6
float segment = 360/div;
float radius = (i*20);
for (int j = 0; j < 360; j+=segment)
{
//if (i==8)
//{
//println("before " + j);
//j+=1;
//println("after " + j);
//}
float x = 325 + (radius*cos(radians(j)));
float y = 325 + (radius*sin(radians(j)));
ellipse(x, y, 15, 15);
}
}
您将该segment
作为float
,但随后使用int
来计算度数。
for (int j=0; j < 360; j+=segment)
和
float x = 325 + (radius*cos(radians(j)));
这就是导致舍入错误的原因。
而且,如果您使i
获得的值大于60
该程序将永远不会结束。
好的,按照重要性的顺序,有三件事。 其中两个已经被提及。
1)清理出int
秒。 变量i
可以是int
,但不能是其他int
(尤其是j
因为它是一个角度,而不是计数器或索引),并且您需要确保所有数学运算都将数字视为double
。 尽可能将常量指定为double
(例如,使用1d
代替1
)。
2)避免累积错误。 在内部for
循环中,您反复添加到j
。 坏。 而是直接根据要计算的圆来计算角度。
3)使用double
,而不是float
。 您将获得更好的精度。
我会这样...
ellipse(325,325,15,15);
for (int i = i; i < 25; i++)
{
double div = i*6d;
double radius = (i*20d);
for (int j = 0; j < div; j++)
{
double theta = j * 360d / div;
double x = 325d + (radius*cos(radians(theta)));
double y = 325d + (radius*sin(radians(theta)));
ellipse(x, y, 15, 15);
}
}
使用double
而不是float可以最小化表示错误。
更改for循环以减少错误。
for (int k = 0; k < div; k++) {
int j = k * 360 / div;
这将为您提供j
不同值,这可能更正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.