C++ (double을 사용하여)에서 부동 소수점 산술에 문제가 있습니다. 그래서 사람들이 보통이 유형을 어떻게 다루는 지 궁금합니다. 문제.C++에서 n 개의 동등한 부분으로 간격 나누기
극좌표로 곡선을 일련의 Point 객체로 나타내려고합니다 (Point는 점의 3D 좌표를 보유하는 클래스입니다). 커브를 나타내는 Point 컬렉션은 Point *의 벡터에 저장됩니다. 내가 표현하고있는 곡선은 함수 r (theta)입니다.이 함수는 제가 계산할 수 있습니다. 이 함수는 [0, PI]에 포함 된 theta의 범위에서 정의됩니다. 저는 PI를 4.0 * atan (1.0)으로 나타내며 double로 저장합니다.
표면을 표현하기 위해 현재 n = 80을 사용하고있는 점의 수 (n + 1)를 지정한 다음 [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)를 계산하는 일부 함수입니다. 이제 문제는 마지막 점이 어떻게 든 루프를 마지막으로 입력해야한다는 (theta < = thetaF) 요구 사항을 충족시키지 못한다는 것입니다. 사실 루프를 마지막으로 통과 한 후에 세타는 PI보다 약간 큽니다 (PI + 1e-15와 같습니다). 어떻게해야합니까? 함수가 theta> PI에 대해 정의되지 않았습니다. 하나의 아이디어는 델타가 매우 작은 경우 ((theta> PI)와 (theta < (PI + delta)))를 테스트하는 것입니다. 그것이 사실이라면, 나는 theta = PI를 설정하고, 대응하는 Point의 좌표를 얻고 설정하고, 루프를 종료 할 수 있습니다. 이것은 합리적인 문제인 것 같지만, 흥미롭게도 전에 그런 문제에 직면 한 적이 없습니다. 나는 gcc 4.4.2를 사용하고 있었고, 이제 gcc 4.8.2를 사용하고있다. 그것이 문제일까요? 이런 종류의 문제를 처리하는 일반적인 방법은 무엇입니까? 감사!
while 루프는 세그먼트 수만큼 이동할 수 있습니다. thetaF보다 큰 값을 갖는 pts가 잠재적으로 문제를 일으킬 수 있으므로 모든 문제를 해결할 수 있을지 확신하지 못합니다. – m24p
루프에서 dta로 theta를 증가시키지 마십시오. 자신이 속한 세그먼트 번호에서 직접 theta를 계산하십시오. 'theta = theta0 + n * dTheta'. Hppe 도움이되지만 일반적으로 부동 소수점으로 인한 문제는 제거하지 않습니다. – knivil
정확히 입력 할 준비가 된 다음 단계입니다. 그것이 도움이 될지 확실하지 않지만 그것이 내가하려고 노력할 것입니다. – m24p