std::pow()를 사용한 정수 수학은 잘못된 결과를 나타냄
제공된 코드 조각에서:
int i = 23; int j = 1; int base = 10; int k = 2; i += j * pow(base, k); std::cout << i << std::endl;
예상되는 출력은 "123"이어야 하지만 대신 "122"는
잘못 출력되는 이유
문제는 std::pow() 사용에 있습니다. 이 함수는 무한 정밀도가 부족한 부동 소수점 숫자와 함께 작동하도록 설계되었습니다. 이것이 g 4.7.2(MinGW, Windows XP)의 잠재적인 구현 결함임에도 불구하고 근본 원인은 부동 소수점 계산의 제한된 정밀도입니다.
해결책: 정수 거듭제곱
이 문제를 해결하려면 정수로 정확한 결과를 얻기 위해 정수 거듭제곱 함수를 구현할 수 있습니다. C 11 이상에서는 이 함수를 constexpr로 정의할 수 있으므로 가능한 경우 컴파일 타임에 결과를 계산할 수 있습니다.
constexpr int int_pow(int b, int e) { return (e == 0) ? 1 : b * int_pow(b, e - 1); }
대체 Tail-Recursive 형식
이 함수는 꼬리 재귀 형식으로도 구현할 수 있는데, 일부에서는 더 효율적입니다. 상황:
constexpr int int_pow(int b, int e, int res = 1) { return (e == 0) ? res : int_pow(b, e - 1, b * res); }
std::pow() 대신 이러한 정수 거듭제곱 함수를 사용하면 코드는 부동 소수점 계산과 관련된 정밀도 문제 없이 올바른 출력 "123"을 생성합니다.
위 내용은 `std::pow()`가 정수 수학에서 잘못된 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!