符号付き整数で実装されたときに未定義の動作を引き起こし、符号なし整数で実装されたときに高入力の誤った値を引き起こすエリアスの回答に加えて、
これは、SquaringによるExponentiationの修正バージョンであり、符号付き整数型でも機能し、不正な値を与えません。
#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
-or任意のタイプ-の最大値は完璧な正方形である、あなたは生きることができますそれと。