C의 부동 소수점 정밀도
C에서 부동 소수점 숫자는 특정 소수 자릿수까지 정확합니다. 그러나 이 정밀도에는 제한이 있어 예상치 못한 결과가 발생할 수 있습니다.
문제 설명
다음 코드 조각을 고려하세요.
<code class="cpp">double a = 0.3; std::cout.precision(20); std::cout << a << std::endl; // Print 0.2999999999999999889 double a, b; a = 0.3; b = 0; for (char i = 1; i <= 50; i++) { b = b + a; }; std::cout.precision(20); std::cout << b << std::endl; // Print 15.000000000000014211
그림과 같이 a는 0.3보다 약간 작지만 50을 곱하면 b는 0.3보다 약간 커집니다. 15.0. 예상 결과와의 편차는 부동 소수점 정밀도의 한계로 인해 발생할 수 있습니다.
해결 방법
올바른 결과를 얻으려면 숫자 유형에 사용 가능한 정밀도보다 정밀도가 높습니다. 다음 수정된 코드 조각은 이 접근 방식을 보여줍니다.
<code class="cpp">#include <iostream> #include <limits> int main() { double a = 0.3; std::cout.precision(std::numeric_limits<double>::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<double>::digits10); std::cout << b << std::endl; }</code>
이 접근 방식을 사용하면 정밀도가 double 데이터 유형에 사용할 수 있는 최대값으로 설정됩니다. 루프가 50회 대신 5000회와 같이 훨씬 더 많은 반복 횟수로 실행되면 정밀도 설정에 관계없이 결국 누적된 오류가 눈에 띄게 된다는 점에 유의하는 것이 중요합니다. 이는 부동 소수점 연산의 본질적인 한계입니다.
위 내용은 C의 부동 소수점 연산이 정밀도 오류를 일으키는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!