> 백엔드 개발 > C++ > `std::pow()`가 정수 수학에서 잘못된 결과를 생성하는 이유는 무엇입니까?

`std::pow()`가 정수 수학에서 잘못된 결과를 생성하는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-26 19:11:10
원래의
461명이 탐색했습니다.

Why Does `std::pow()` Produce Incorrect Results with Integer Math?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿