내가 이해하는 방식은 다음과 같습니다. double
두 자리를 C++에서 배정 밀도로 뺄 때 첫 번째는 지수의 거듭 제곱으로 시작하는 significand로 변환됩니다. 그런 다음 빼기 된 숫자가 동일한 지수와 유효 숫자의 동일한 자릿수가 많으면 정밀도가 떨어질 수 있으므로 오류가 발생할 수 있습니다. 내가 뭔가 이상한 알이 테스트, 그러나C++ 부동 소수점 빼기 오류 및 절대 값
double Sadd(double d1, double d2, int& report, double prec) {
int exp1, exp2;
double man1=frexp(d1, &exp1), man2=frexp(d2, &exp2);
if(d1*d2<0) {
if(exp1==exp2) {
if(abs(man1+man2)<prec) {
cout << "Floating point error" << endl;
report=0;
}
}
}
return d1+d2;
}
: 내 코드를 테스트하려면 나는 다음과 같은 안전한 추가 기능을 썼다가 보인다 실제 오류 (하지 기능이 오류를보고하지만 실제 하나가 인한 여부
: 계산) 다음 번호를 정밀도 prec
로 1e-11
를 사용하여 감산, 예를 들어
... 감산 번호의 절대 값이 아니라, 유효 동등한 숫자의 단지 수에 의존하는 것으로 보인다 1) 9.8989898989898-9.8989898989897 : 함수는 에러를보고하고 나는 매우 잘못된 값이 9.9475983006414e-14
2) 98989898989898-98989898989897 얻을 :이 기능은 오류를보고 있지만 정확한 값 1
에게 분명히 내가 잘못 이해 한 무언가를 얻을. 어떤 아이디어?
근사 결과뿐만 아니라 부동 소수점 계산의 오류에 대한 경계를 얻으려면 간격 산술을 사용할 수 있습니다. 하한은 아래쪽으로 반올림하고 상한은 위쪽으로 반올림됩니다. 쉽게 사용할 수있는 C++ 패키지가 있어야합니다. –