[英]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.