my_pow.c


1
/* -----------------------------------------------------
2
                        my_pow.c
3
4
    Versuch einer eigenen Implentation von pow
5
    ohne Bibliothek < math.h >
6
7
    03.02.2017   R. seelig
8
  ------------------------------------------------------ */
9
10
#include <stdio.h>
11
#include <math.h>
12
13
float my_pow2(float basis, float expo);
14
15
#define itanz    6
16
17
float nth_root(float a, int n)
18
{
19
  int    k;
20
  float  x[6] = {1};
21
22
  for (k = 0; k < itanz - 1; k++)
23
    x[k + 1]= (1.0 / n) * ((n - 1) * x[k] + a / my_pow2(x[k], n - 1));
24
  return x[itanz-1];
25
}
26
27
float my_pow2(float basis, float expo)
28
{
29
  float my_halfp;
30
31
  if (basis == 0.0f)  return 0.0f;
32
33
  // x^0 immer 1
34
  if (expo == 0.0f)
35
  {
36
    return 1.0f;
37
  }
38
  // negativer exponent
39
  else if( expo < 0.0f)
40
  {
41
    return 1.0f / my_pow2(basis, -expo);
42
  }
43
  //
44
  else if (expo > 0.0f && expo < 1.0f)
45
  {
46
    return nth_root(basis, 1/expo);
47
  }
48
  else if ((int)expo % 2 == 0)
49
  {
50
    my_halfp = my_pow2(basis, expo / 2.0f);
51
    return my_halfp * my_halfp;
52
  }
53
  else
54
  // Integer Exponent
55
  {
56
    return basis * my_pow2(basis, expo - 1.0f);
57
  }
58
}
59
60
/* ---------------------------------------------------------------------------
61
                                   M-A-I-N
62
   --------------------------------------------------------------------------- */
63
int main(void)
64
{
65
  float   f, f2, f3, f4;
66
  char     ch;
67
68
69
  f= 2.9; f2= 6.24;
70
  f3= my_pow2(f,f2);
71
  printf("\n\rErgebnis von my_pow:");
72
  printf("\n\r %.3f ^ %.3f= %.3f\n\r",f, f2, f3);
73
74
  f4= pow(f,f2);
75
  printf("\n\rErgebnis von pow aus math.h:");
76
  printf("\n\r %.3f ^ %.3f= %.3f\n\r",f, f2, f4);
77
78
  if (f3> f4) { f= f4; f4= f3; f3= f; }
79
  printf("\n\rFehler in %%: %.4f\n\n\r", ((f4 / f3)*100)-100);
80
}