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

C에서 `pow()`를 사용한 정수 수학이 잘못된 결과를 생성하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-04 22:58:11
원래의
525명이 탐색했습니다.

Why Does Integer Math with `pow()` Produce Incorrect Results in C  ?

잘못된 결과로 이어지는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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