C의 부동 소수점 정밀도 문제
C의 부동 소수점 연산은 직관에 반할 수 있는 동작을 나타냅니다. 다음을 고려하십시오.
double a = 0.3; 0.3을 논리적으로 나타내는 값을 변수 a에 할당합니다. 그러나 std::cout의 출력은 << << 표준::endl; 소수점 이하 20자리의 정밀도는 "0.2999999999999999889"로 표시됩니다. 이러한 편차는 부동 소수점 숫자의 내부 저장 위치가 논리값과 다르다는 것을 나타냅니다.
마찬가지로 a가 b에 반복적으로 추가되는 루프에서는 루프의 마지막 결과(50회 반복) "15.000000000000014211"로 원래보다 높습니다. 이 결과는 여러 작업에 걸쳐 반올림 오류가 어떻게 누적될 수 있는지를 보여줍니다.
이러한 정밀도 문제를 피하려면 부동 소수점 값의 정밀도를 데이터 유형의 실제 정밀도보다 높게 설정하지 않는 것이 중요합니다. 이는 다음 접근 방식을 사용하여 달성할 수 있습니다.
#include
#include
int main() {
double a = 0.3;
std::cout.precision(std::numeric_limits::digits10);
std::cout << a << std::endl;
double b = 0;
for (char i = 1; i <= 50; i++) {
b = b + a;
}
std::cout.precision(std::numeric_limits::digits10);
std::cout << b << std::endl;
}
정밀도를 double 데이터 유형의 사용 가능한 최대 정밀도로 설정하면 출력이 저장된 값을 정확하게 나타냅니다. 그러나 루프가 훨씬 더 많은 반복 횟수(예: 50 대신 5000)로 실행되는 경우 부동 소수점 연산의 본질적인 한계로 인해 누적된 오류가 여전히 눈에 띄게 됩니다.
위 내용은 C의 부동 소수점 연산이 정밀도 문제를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!