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 | }
|