?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{BLAME START}

library

?curdirlinks? -

Blame information for rev 3

Line No. Rev Author Line
1 3 kaklik // Alternativni matematicka knihovna vychazejici z puvodni knihovny MATH prekladace CCS
2 // ale naprogramovana tak, aby se zbytecne neplytvalo prostredky procesoru.
3 // Vyuziva stejne aproximacni postupy ale algoritmy jsou napsany tak, aby vysledekm
4 // byl efektivnejsi kod (zejmena s ohledem na spotrebu programove pameti, dosazena
5 // uspora je vice nez 50%).
6 //
7 // (c)miho 2002
8 //
9 // Historie:
10 //
11 // 0.0 Jen sada funkci exp a jejich pribuznych
12 //
13 //
14 // Funkce:
15 //
16 // float exp2(float x) exponencialni funkce se zakladem 2
17 //
18 // float exp(float x) exponencialni funkce se zakladem e
19 //
20 // float exp10(float x) exponencialni funkce se zakladem 10
21 //
22 // float expdb(float x) exponencialni funkce pro prepocet dB ( expdb(20)=10 )
23 //
24  
25  
26 // Definice potrebnych konstant
27 //
28 #define EXP_BASE2 0.6931471806 // ln(2)
29 #define EXP_BASE10 0.30103 // log(2)=ln(2)/ln(10)
30 #define EXP_BASEDB (20*EXP_BASE10) // 20*log(2)
31  
32  
33 // Koeficienty aproximacniho polynomu aproximace 2^^x
34 //
35 float const per[7] = { 1.0, 0.693147172, 0.240227138, 0.0554965651,
36 0.00965065093, 0.00127100575, 0.000207455774 };
37  
38  
39 ////////////////////////////////////////////////////////////////////////////
40 // float exp2(float x)
41 ////////////////////////////////////////////////////////////////////////////
42 // Description : returns the value (2^x)
43 //
44 float exp2(float x)
45 {
46  
47 float r; // navratova hodnota (mazivysledek)
48 signed int n,i; // pomocne promenne
49 short int s; // priznak znamenka
50  
51 #ifdef _ERRNO // osetreni preteceni
52 if(x > 128)
53 {
54 errno=ERANGE;
55 return(0);
56 }
57 #endif
58  
59 n = (signed long)(x); // rad vysledku
60 s = 0; // priznak zaporneho znamenka
61  
62 if (bit_test(x,15)) // zjisti znamenko -> if (x < 0)
63 { // korekce na zaporne znamenko
64 s = 1; // zapamatuj si ho
65 n = -n; // cela cast je nezaporna
66 x = -x; // zbytek je nezaporny
67 }
68  
69 x = x - (float)n; // zlomkova cast
70  
71 r=per[6]; // vypocet polynomu v cyklu
72 i=6; // tento tvar cyklu vede na optimalni kod
73 do // s instrukci DECFSZ
74 r = r*x + per[i-1];
75 while (--i);
76  
77 *(&r) += n; // doplneni exponentu
78  
79 if (s) // korekce na zaporne znamenko
80 r = 1.0/r;
81  
82 return(r); // vysledek
83 }
84  
85  
86 ////////////////////////////////////////////////////////////////////////////
87 // float exp(float x)
88 ////////////////////////////////////////////////////////////////////////////
89 // Description : returns the value (e^x)
90 //
91 float exp(float x)
92 {
93 exp2(x/EXP_BASE2); // prevod meritka na 2^^n
94 }
95  
96  
97 ////////////////////////////////////////////////////////////////////////////
98 // float exp10(float x)
99 ////////////////////////////////////////////////////////////////////////////
100 // Description : returns the value (10^x)
101 //
102 float exp10(float x)
103 {
104 exp2(x/EXP_BASE10); // prevod meritka na 10^^x
105 }
106  
107  
108 ////////////////////////////////////////////////////////////////////////////
109 // float exp20(float x)
110 ////////////////////////////////////////////////////////////////////////////
111 // Description : returns the value (10^x)
112 //
113 float expdb(float x)
114 {
115 exp2(x/EXP_BASEDB); // prevod meritka na decibely
116 }
{BLAME END}
{FOOTER START}

Powered by WebSVN v2.8.3