잘못된 결과로 이어지는 pow()를 사용한 정수 수학
다음 코드 조각을 고려하세요.
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); cout << i << endl;
예상대로 , 이 코드는 "123"을 출력해야 하지만 그 대신 놀랍게도 인쇄됩니다. "122." 이러한 예상치 못한 결과는 특히 Windows XP 환경에서 g 4.7.2로 컴파일하는 경우 당황스러울 수 있습니다.
이러한 불일치의 핵심은 std::pow()가 처리하도록 설계되었다는 사실입니다. 부동 소수점 숫자. 이러한 부동 소수점 숫자는 편리함을 제공하지만 정밀도가 제한된다는 단점이 있습니다. std::pow()의 경우 구현 시 완벽하게 정확하게 지수를 처리하지 못하여 반올림 오류가 발생할 수 있습니다.
이 문제를 해결하려면 C 11의 기능을 활용하고 자체 정수를 정의할 수 있습니다. 지수 함수:
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
이 사용자 정의 int_pow 함수는 특히 정수용으로 맞춤화되어 정확성을 보장합니다.
또는 Dan Nissenbaum이 제안한 꼬리 재귀 접근 방식도 실행 가능한 솔루션입니다.
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
이러한 옵션을 사용하면 이제 C에서 정수 지수 연산을 자신있게 사용할 수 있습니다. 잘못된 결과를 잊혀진 버그의 영역으로 추방합니다.
위 내용은 C에서 `pow()`를 사용한 정수 수학이 잘못된 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!