Elias의 답변 외에도 부호있는 정수로 구현하면 정의되지 않은 동작이 발생하고 부호없는 정수로 구현하면 높은 입력 값이 잘못됩니다.
다음은 부호있는 정수 유형에서도 작동하며 잘못된 값을 제공하지 않는 Squaing에 의한 지수의 수정 된 버전입니다.
#include <stdint.h>
#define SQRT_INT64_MAX (INT64_C(0xB504F333))
int64_t alx_pow_s64 (int64_t base, uint8_t exp)
{
int_fast64_t base_;
int_fast64_t result;
base_ = base;
if (base_ == 1)
return 1;
if (!exp)
return 1;
if (!base_)
return 0;
result = 1;
if (exp & 1)
result *= base_;
exp >>= 1;
while (exp) {
if (base_ > SQRT_INT64_MAX)
return 0;
base_ *= base_;
if (exp & 1)
result *= base_;
exp >>= 1;
}
return result;
}
이 기능에 대한 고려 사항 :
(1 ** N) == 1
(N ** 0) == 1
(0 ** 0) == 1
(0 ** N) == 0
오버 플로우 또는 랩핑이 발생하면 return 0;
나는 사용 int64_t
했지만 모든 너비 (서명 또는 부호없는)는 거의 수정하지 않고 사용할 수 있습니다. 그러나이 아닌 고정 폭 정수 유형을 사용해야 할 경우, 당신은 변화를 필요 SQRT_INT64_MAX
로 (int)sqrt(INT_MAX)
합니다 (사용하는 경우 int
또는 최적화되어야 비슷한), 그러나 그것은 C 상수 표현 이보다이며, 없습니다. 또한 결과 주조 sqrt()
가 int
있기 때문에 완벽한 정사각형의 경우 포인트 precission 부동의 매우 좋지 않다,하지만 난 어떤 구현을 알고하지 않는 한 INT_MAX
어떤 유형 -의 최대 완벽한 사각형 - 또는를, 당신은 살 수있다 그것으로.