나는 특정 플랫폼에서 다음 코드 특정 컴파일러와부동 소수점 계산에서 과도한 정밀도를 처리하는 방법은 무엇입니까? 내 수치 시뮬레이션에서
double x;
do {
x = /* some computation */;
} while (x <= 0.0);
/* some algorithm that requires x to be (precisely) larger than 0 */
(예를 들어 GCC)와 유사한 코드 (예를 들어, 리눅스, x87 수학)가 x
를 double 정밀도보다 더 높은 계산 가능성이 있습니다 ("초과 정밀도"). (업데이트 : 여기서 정밀도에 대해 말하면 정확도 /와/range를 의미합니다. 이러한 상황에서는 다음 번에 x가 배정도로 반올림 됨으로써 0이되는 경우에도 비교 (x <= 0
)가 false를 반환한다고 생각할 수 있습니다. . (x는 시간에 임의의 지점에서 내림되지 않는다는 보장이 없습니다.)
- 휴대용 것을이 비교를 수행 할 수있는 방법이 있나요, 코드
- 작동하는지
- 에는 성능이 없습니다. t 및
- 은 임의의 범위 (0, eps)를 제외하지 않습니까?
나는 (x < std::numeric_limits<double>::denorm_min()
)을 사용하려고 시도했지만 SSE2 수학을 사용하여 작업 할 때 루프가 상당히 느려진 것 같았습니다. (나는 비정규이 계산을 늦출 수 있다는 것을 알고 있지만, 나는 그들이 단지 주변에 이동하고 비교하는 속도가 느린 것으로 기대하지 않았다.)
업데이트 : 대안은 전에 메모리에 x
를 강제로 volatile
을 사용하는 것입니다 비교 예 작성하여 작성
} while (*((volatile double*)&x) <= 0.0);
그러나 컴파일러에서 적용한 최적화 및 응용 프로그램에 따라이 솔루션은 눈에 띄는 오버 헤드가 발생할 수도 있습니다.
업데이트 : 모든 허용 오차의 문제는 상당히 임의적입니다. 즉 특정 응용 프로그램이나 컨텍스트에 따라 다릅니다. 나는 과도한 정밀도없이 비교를하고 싶다. 그래서 나는 추가 가정을하지 않거나 임의의 엡실론을 내 라이브러리 함수의 문서에 넣을 필요가 없다.
흥미로운 질문은 처음으로 너무 많은 정확도에 대해 불평하는 사람을 처음 들어 본 적이 있습니다. – dsimcha
비교에 명시 적 형변환을 추가하면 어떻게됩니까? 즉 ((double) x) <= 0.0'? – Christoph
아마도 관련 : http://stackoverflow.com/questions/322797/problem-with-floating-point-precision-when-moving-from-i386-to-x8664 – Christoph