簡體   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