Thứ Sáu, 8 tháng 1, 2016

Căn bậc n của x

  1. #include <stdio.h>
  2. #include <assert.h>
  3.  
  4.  
  5. #define _abs(x)          ((x > 0) ? (x) : (-x))
  6. #define epsilon         0.0000001
  7.  
  8. double _exp(double x)
  9. {
  10.     double result = 0.0;
  11.     double temp   = 1.0;
  12.     unsigned int i = 0;
  13.     do
  14.     {
  15.         result += temp;
  16.         temp   *= x / ++i;
  17.     }while(_abs(temp) > epsilon);
  18.     return result;
  19. }
  20. double log_temp(double x)
  21. {
  22.     assert(x > 0);
  23.     double result = 0.0;
  24.     double y = x - 1;
  25.     double temp_x = y;
  26.     double temp, temp_next ;
  27.     double remainder;
  28.     unsigned int  i = 1;
  29.     do
  30.     {
  31.         temp = temp_x / i;
  32.         result += temp;
  33.         temp_x *= -y;
  34.         temp_next = temp_x / ++i;
  35.         remainder = temp + temp_next;
  36.     }while(_abs(remainder) > epsilon);
  37.     return result;
  38. }
  39. double _log(double x)
  40. {
  41.     double u;
  42.     assert(x > 0);
  43.     if(x <= 1.0f)
  44.         return log_temp(x);
  45.     u = (x - 1.0) / (x + 1.0);
  46.     return log_temp(1.0 + u) - log_temp(1.0 - u);
  47. }
  48.  
  49. int main(int argc, char *argv[])
  50. {
  51.     double a = 9.2;
  52.     int n = 10;
  53.     printf("%lf ^ (1/%d) = %lf\n", a, n, _exp((1.0 / n) * _log(a)));
  54.     return 0;
  55. }

0 nhận xét: