hal_math.c 709 B

1234567891011121314151617181920212223242526
  1. #include "hal_math.h"
  2. double pow_branch(double x, long long N)
  3. {
  4. double ans = 1.0;
  5. // 贡献的初始值为 x
  6. double x_contribute = x;
  7. // 在对 N 进行二进制拆分的同时计算答案
  8. while (N > 0)
  9. {
  10. if (N % 2 == 1)
  11. {
  12. // 如果 N 二进制表示的最低位为 1,那么需要计入贡献
  13. ans *= x_contribute;
  14. }
  15. // 将贡献不断地平方
  16. x_contribute *= x_contribute;
  17. // 舍弃 N 二进制表示的最低位,这样我们每次只要判断最低位即可
  18. N = N >> 1;
  19. }
  20. return ans;
  21. }
  22. double hal_pow(double x, double N)
  23. {
  24. return N >= 0 ? pow_branch(x, N) : 1.0 / pow_branch(x, -N);
  25. }