繁体   English   中英

奇怪的浮点错误?

[英]Weird floating point error?

我一直在尝试使用for循环生成圆形图案。 但是,当它运行时,除了第9圈之外,其他一切看起来都不错。 看完那个圆圈的数字打印件后,一切看起来都很好,所以我无法弄清楚出了什么问题。 但是,当我向该环的角度值加上一个时。 即j(已注释掉的代码)几乎可以纠正。

知道为什么会发生这种情况。 查看所有数字后,我只能认为这是我没有考虑到的数学错误,或者我错过了明显的错误。

谢谢!

OCD触发警告

          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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM