我在使用C++(使用雙精度)的浮點算法時遇到了一個我從未有過的問題,所以我想知道人們通常如何處理這種類型的問題。在C++中將間隔劃分爲n個相等部分
我想在極座標中表示一系列Point對象(Point只是一個保存3D中點座標的類)的曲線。表示曲線的點的集合存儲在一個向量中(Point *)。我表示的曲線是一個函數r(theta),我可以計算。該函數在[0,PI]中包含的theta範圍內定義。我代表PI爲4.0 * atan(1.0),將其存儲爲雙精度值。爲了表示表面,我指定了所需要的點數(n + 1),目前我使用n = 80,然後確定將[0,PI]除以80所需的θ間隔等間隔(由n + 1 = 81個點表示)。所以dTheta = PI/n。 dTheta是一個雙。我接下來給我的點分配座標。 (見下面的示例代碼)
double theta0 = 0.0; // Beginning of inteval in theta
double thetaF = PI; // End of interval in theta
double dTheta = (thetaF - theta0)/double(nSegments); // segment width
double theta = theta0; // Initialize theta to start at beginning of inteval
vector<Point*> pts; // Declare a variable to hold the Points.
while (theta <= thetaF)
{
// Store Point corresponding to current theta and r(theta) in the vector.
pts.push_back(new Point(theta, rOfTheta(theta), 0.0));
theta += dTheta; // Increment theta
}
rofTheta(theta)是計算r(θ)的函數。現在問題是最後一點不能滿足最後一次進入循環的(theta < = thetaF)要求。實際上,在最後一次穿過循環之後,θ比PI稍微大一些(就像PI + 1e-15)。我應該如何處理這個問題?該函數沒有爲theta> PI定義。一個想法是隻測試其中delta非常小的((theta> PI)和(theta <(PI + delta)))。如果這是真的,我可以設置theta = PI,獲取並設置相應點的座標,然後退出循環。這似乎是一個合理的問題,但有趣的是,我從未遇到過這樣的問題。我一直在使用gcc 4.4.2,現在我正在使用gcc 4.8.2。這可能是問題嗎?處理這類問題的正常方法是什麼?謝謝!
您的while循環可以用於段的數量。不確定這會解決你所有的問題,因爲pts的值大於thetaF可能會導致問題的發生。 – m24p
不要通過循環中的dTheta遞增theta。直接從您所在的段號計算theta,例如。 'theta = theta0 + n * dTheta'。 Hppe它會有所幫助,但不會消除浮點問題。 – knivil
這就是我準備打字的下一個要點。不知道這是否會有所幫助,但這是我的嘗試。 – m24p