ইলিয়াসের উত্তর ছাড়াও, যা স্বাক্ষরিত পূর্ণসংখ্যার সাথে প্রয়োগ করার সময় অপরিজ্ঞাত আচরণের কারণ এবং স্বাক্ষরযুক্ত পূর্ণসংখ্যার সাথে প্রয়োগ করার সময় উচ্চ ইনপুটের জন্য ভুল মানগুলি,
এখানে স্কোয়ারিং দ্বারা এক্সপেনসিয়েশন এর একটি পরিবর্তিত সংস্করণ রয়েছে যা স্বাক্ষরিত পূর্ণসংখ্যার ধরণের সাথেও কাজ করে এবং ভুল মান দেয় না:
#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
sqrt()
int
INT_MAX