1234567891011121314151617181920212223242526 |
- #include "hal_math.h"
- double pow_branch(double x, long long N)
- {
- double ans = 1.0;
- // 贡献的初始值为 x
- double x_contribute = x;
- // 在对 N 进行二进制拆分的同时计算答案
- while (N > 0)
- {
- if (N % 2 == 1)
- {
- // 如果 N 二进制表示的最低位为 1,那么需要计入贡献
- ans *= x_contribute;
- }
- // 将贡献不断地平方
- x_contribute *= x_contribute;
- // 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
- N = N >> 1;
- }
- return ans;
- }
- double hal_pow(double x, double N)
- {
- return N >= 0 ? pow_branch(x, N) : 1.0 / pow_branch(x, -N);
- }
|